tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

MFCDMProxy.cpp (3211B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include "MFCDMProxy.h"
      6 
      7 #include "MFCDMParent.h"
      8 #include "MFMediaEngineUtils.h"
      9 
     10 namespace mozilla {
     11 
     12 using Microsoft::WRL::ComPtr;
     13 
     14 #define LOG(msg, ...)                         \
     15  MOZ_LOG(gMFMediaEngineLog, LogLevel::Debug, \
     16          ("MFCDMProxy=%p, " msg, this, ##__VA_ARGS__))
     17 
     18 MFCDMProxy::MFCDMProxy(IMFContentDecryptionModule* aCDM, uint64_t aCDMParentId)
     19    : mCDM(aCDM), mCDMParentId(aCDMParentId) {
     20  LOG("MFCDMProxy created, created by %" PRId64 " MFCDMParent", mCDMParentId);
     21 }
     22 
     23 MFCDMProxy::~MFCDMProxy() { LOG("MFCDMProxy destroyed"); }
     24 
     25 void MFCDMProxy::Shutdown() {
     26  if (mTrustedInput) {
     27    mTrustedInput = nullptr;
     28  }
     29  for (auto& inputAuthorities : mInputTrustAuthorities) {
     30    SHUTDOWN_IF_POSSIBLE(inputAuthorities.second);
     31  }
     32  mInputTrustAuthorities.clear();
     33  mCDM = nullptr;
     34  LOG("MFCDMProxy Shutdowned");
     35 }
     36 
     37 HRESULT MFCDMProxy::GetPMPServer(REFIID aRiid, LPVOID* aPMPServerOut) {
     38  ComPtr<IMFGetService> cdmServices;
     39  RETURN_IF_FAILED(mCDM.As(&cdmServices));
     40  RETURN_IF_FAILED(cdmServices->GetService(MF_CONTENTDECRYPTIONMODULE_SERVICE,
     41                                           aRiid, aPMPServerOut));
     42  return S_OK;
     43 }
     44 
     45 HRESULT MFCDMProxy::GetInputTrustAuthority(uint32_t aStreamId,
     46                                           const uint8_t* aContentInitData,
     47                                           uint32_t aContentInitDataSize,
     48                                           REFIID aRiid,
     49                                           IUnknown** aInputTrustAuthorityOut) {
     50  if (mInputTrustAuthorities.count(aStreamId)) {
     51    RETURN_IF_FAILED(
     52        mInputTrustAuthorities[aStreamId].CopyTo(aInputTrustAuthorityOut));
     53    return S_OK;
     54  }
     55 
     56  if (!mTrustedInput) {
     57    RETURN_IF_FAILED(mCDM->CreateTrustedInput(
     58        aContentInitData, aContentInitDataSize, &mTrustedInput));
     59    LOG("Created a trust input for stream %u", aStreamId);
     60  }
     61 
     62  // GetInputTrustAuthority takes IUnknown* as the output. Using other COM
     63  // interface will have a v-table mismatch issue.
     64  ComPtr<IUnknown> unknown;
     65  RETURN_IF_FAILED(
     66      mTrustedInput->GetInputTrustAuthority(aStreamId, aRiid, &unknown));
     67 
     68  ComPtr<IMFInputTrustAuthority> inputTrustAuthority;
     69  RETURN_IF_FAILED(unknown.As(&inputTrustAuthority));
     70  RETURN_IF_FAILED(unknown.CopyTo(aInputTrustAuthorityOut));
     71 
     72  mInputTrustAuthorities[aStreamId] = inputTrustAuthority;
     73  return S_OK;
     74 }
     75 
     76 HRESULT MFCDMProxy::SetContentEnabler(IUnknown* aRequest,
     77                                      IMFAsyncResult* aResult) {
     78  LOG("SetContentEnabler");
     79  ComPtr<IMFContentEnabler> contentEnabler;
     80  RETURN_IF_FAILED(aRequest->QueryInterface(IID_PPV_ARGS(&contentEnabler)));
     81  return mCDM->SetContentEnabler(contentEnabler.Get(), aResult);
     82 }
     83 
     84 void MFCDMProxy::OnHardwareContextReset() {
     85  LOG("OnHardwareContextReset");
     86  // Hardware context reset happens, all the crypto sessions are in invalid
     87  // states. So drop everything here.
     88  mTrustedInput.Reset();
     89  mInputTrustAuthorities.clear();
     90 }
     91 
     92 #undef LOG
     93 
     94 }  // namespace mozilla