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