ChromiumCDMChild.h (6744B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef ChromiumCDMChild_h_ 7 #define ChromiumCDMChild_h_ 8 9 #include "SimpleMap.h" 10 #include "WidevineVideoFrame.h" 11 #include "content_decryption_module.h" 12 #include "mozilla/gmp/PChromiumCDMChild.h" 13 14 namespace mozilla::gmp { 15 16 class GMPContentChild; 17 18 class ChromiumCDMChild final : public PChromiumCDMChild, 19 public cdm::Host_10, 20 public cdm::Host_11 { 21 public: 22 // Mark AddRef and Release as `final`, as they overload pure virtual 23 // implementations in PChromiumCDMChild. 24 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ChromiumCDMChild, final); 25 26 explicit ChromiumCDMChild(GMPContentChild* aPlugin); 27 28 void Init(cdm::ContentDecryptionModule_11* aCDM, 29 const nsACString& aStorageId); 30 31 void TimerExpired(void* aContext); 32 33 // cdm::Host_10/cdm::Host_11 implementation 34 cdm::Buffer* Allocate(uint32_t aCapacity) override; 35 void SetTimer(int64_t aDelayMs, void* aContext) override; 36 cdm::Time GetCurrentWallTime() override; 37 void OnResolveKeyStatusPromise(uint32_t aPromiseId, 38 cdm::KeyStatus aKeyStatus) override; 39 void OnResolveNewSessionPromise(uint32_t aPromiseId, const char* aSessionId, 40 uint32_t aSessionIdSize) override; 41 void OnResolvePromise(uint32_t aPromiseId) override; 42 void OnRejectPromise(uint32_t aPromiseId, cdm::Exception aException, 43 uint32_t aSystemCode, const char* aErrorMessage, 44 uint32_t aErrorMessageSize) override; 45 void OnSessionMessage(const char* aSessionId, uint32_t aSessionIdSize, 46 cdm::MessageType aMessageType, const char* aMessage, 47 uint32_t aMessageSize) override; 48 void OnSessionKeysChange(const char* aSessionId, uint32_t aSessionIdSize, 49 bool aHasAdditionalUsableKey, 50 const cdm::KeyInformation* aKeysInfo, 51 uint32_t aKeysInfoCount) override; 52 void OnExpirationChange(const char* aSessionId, uint32_t aSessionIdSize, 53 cdm::Time aNewExpiryTime) override; 54 void OnSessionClosed(const char* aSessionId, 55 uint32_t aSessionIdSize) override; 56 void SendPlatformChallenge(const char* aServiceId, uint32_t aServiceIdSize, 57 const char* aChallenge, 58 uint32_t aChallengeSize) override {} 59 void EnableOutputProtection(uint32_t aDesiredProtectionMask) override {} 60 void QueryOutputProtectionStatus() override; 61 void OnDeferredInitializationDone(cdm::StreamType aStreamType, 62 cdm::Status aDecoderStatus) override {} 63 void RequestStorageId(uint32_t aVersion) override; 64 void ReportMetrics(cdm::MetricName aMetricName, uint64_t aValue) override; 65 cdm::FileIO* CreateFileIO(cdm::FileIOClient* aClient) override; 66 void OnInitialized(bool aSuccess) override; 67 // end cdm::Host_10/cdm::Host_11 specific methods 68 69 void GiveBuffer(ipc::Shmem&& aBuffer); 70 71 protected: 72 ~ChromiumCDMChild(); 73 74 bool OnResolveNewSessionPromiseInternal(uint32_t aPromiseId, 75 const nsACString& aSessionId); 76 77 bool IsOnMessageLoopThread(); 78 79 void ActorDestroy(ActorDestroyReason aReason) override; 80 81 ipc::IPCResult RecvGiveBuffer(ipc::Shmem&& aShmem) override; 82 ipc::IPCResult RecvPurgeShmems() override; 83 void PurgeShmems(); 84 ipc::IPCResult RecvInit(const bool& aAllowDistinctiveIdentifier, 85 const bool& aAllowPersistentState, 86 InitResolver&& aResolver) override; 87 ipc::IPCResult RecvSetServerCertificate( 88 const uint32_t& aPromiseId, nsTArray<uint8_t>&& aServerCert) override; 89 ipc::IPCResult RecvCreateSessionAndGenerateRequest( 90 const uint32_t& aPromiseId, const uint32_t& aSessionType, 91 const uint32_t& aInitDataType, nsTArray<uint8_t>&& aInitData) override; 92 ipc::IPCResult RecvLoadSession(const uint32_t& aPromiseId, 93 const uint32_t& aSessionType, 94 const nsACString& aSessionId) override; 95 ipc::IPCResult RecvUpdateSession(const uint32_t& aPromiseId, 96 const nsACString& aSessionId, 97 nsTArray<uint8_t>&& aResponse) override; 98 ipc::IPCResult RecvCloseSession(const uint32_t& aPromiseId, 99 const nsACString& aSessionId) override; 100 ipc::IPCResult RecvRemoveSession(const uint32_t& aPromiseId, 101 const nsACString& aSessionId) override; 102 ipc::IPCResult RecvCompleteQueryOutputProtectionStatus( 103 const bool& aSuccess, const uint32_t& aLinkMask, 104 const uint32_t& aProtectionMask) override; 105 ipc::IPCResult RecvGetStatusForPolicy( 106 const uint32_t& aPromiseId, 107 const cdm::HdcpVersion& aMinHdcpVersion) override; 108 ipc::IPCResult RecvDecrypt(const uint32_t& aId, 109 const CDMInputBuffer& aBuffer) override; 110 ipc::IPCResult RecvInitializeVideoDecoder( 111 const CDMVideoDecoderConfig& aConfig) override; 112 ipc::IPCResult RecvDeinitializeVideoDecoder() override; 113 ipc::IPCResult RecvResetVideoDecoder() override; 114 ipc::IPCResult RecvDecryptAndDecodeFrame( 115 const CDMInputBuffer& aBuffer) override; 116 ipc::IPCResult RecvDrain() override; 117 ipc::IPCResult RecvDestroy() override; 118 119 void ReturnOutput(WidevineVideoFrame& aFrame); 120 bool HasShmemOfSize(size_t aSize) const; 121 122 template <typename MethodType, typename... ParamType> 123 void CallMethod(MethodType, ParamType&&...); 124 125 template <typename MethodType, typename... ParamType> 126 void CallOnMessageLoopThread(const char* const, MethodType, ParamType&&...); 127 128 GMPContentChild* mPlugin = nullptr; 129 cdm::ContentDecryptionModule_11* mCDM = nullptr; 130 131 typedef SimpleMap<int64_t, uint64_t, ThreadSafePolicy> DurationMap; 132 DurationMap mFrameDurations; 133 nsTArray<uint32_t> mLoadSessionPromiseIds; 134 135 cdm::Size mCodedSize = {0, 0}; 136 nsTArray<ipc::Shmem> mBuffers; 137 138 bool mDecoderInitialized = false; 139 bool mPersistentStateAllowed = false; 140 bool mDestroyed = false; 141 nsCString mStorageId; 142 143 typedef MozPromise<bool, nsresult, /* IsExclusive = */ true> InitPromise; 144 // Created when we RecvInit, should be resolved once the CDM is initialized 145 // or rejected if init fails. 146 MozPromiseHolder<InitPromise> mInitPromise; 147 }; 148 149 } // namespace mozilla::gmp 150 151 #endif // ChromiumCDMChild_h_