diff options
Diffstat (limited to 'dom/media/gmp/ChromiumCDMChild.h')
-rw-r--r-- | dom/media/gmp/ChromiumCDMChild.h | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/dom/media/gmp/ChromiumCDMChild.h b/dom/media/gmp/ChromiumCDMChild.h new file mode 100644 index 0000000000..1bf153a5d5 --- /dev/null +++ b/dom/media/gmp/ChromiumCDMChild.h @@ -0,0 +1,148 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef ChromiumCDMChild_h_ +#define ChromiumCDMChild_h_ + +#include "content_decryption_module.h" +#include "mozilla/gmp/PChromiumCDMChild.h" +#include "SimpleMap.h" +#include "WidevineVideoFrame.h" + +namespace mozilla::gmp { + +class GMPContentChild; + +class ChromiumCDMChild : public PChromiumCDMChild, public cdm::Host_10 { + public: + // Mark AddRef and Release as `final`, as they overload pure virtual + // implementations in PChromiumCDMChild. + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ChromiumCDMChild, final); + + explicit ChromiumCDMChild(GMPContentChild* aPlugin); + + void Init(cdm::ContentDecryptionModule_10* aCDM, + const nsACString& aStorageId); + + void TimerExpired(void* aContext); + + // cdm::Host_10 implementation + cdm::Buffer* Allocate(uint32_t aCapacity) override; + void SetTimer(int64_t aDelayMs, void* aContext) override; + cdm::Time GetCurrentWallTime() override; + void OnResolveKeyStatusPromise(uint32_t aPromiseId, + cdm::KeyStatus aKeyStatus) override; + void OnResolveNewSessionPromise(uint32_t aPromiseId, const char* aSessionId, + uint32_t aSessionIdSize) override; + void OnResolvePromise(uint32_t aPromiseId) override; + void OnRejectPromise(uint32_t aPromiseId, cdm::Exception aException, + uint32_t aSystemCode, const char* aErrorMessage, + uint32_t aErrorMessageSize) override; + void OnSessionMessage(const char* aSessionId, uint32_t aSessionIdSize, + cdm::MessageType aMessageType, const char* aMessage, + uint32_t aMessageSize) override; + void OnSessionKeysChange(const char* aSessionId, uint32_t aSessionIdSize, + bool aHasAdditionalUsableKey, + const cdm::KeyInformation* aKeysInfo, + uint32_t aKeysInfoCount) override; + void OnExpirationChange(const char* aSessionId, uint32_t aSessionIdSize, + cdm::Time aNewExpiryTime) override; + void OnSessionClosed(const char* aSessionId, + uint32_t aSessionIdSize) override; + void SendPlatformChallenge(const char* aServiceId, uint32_t aServiceIdSize, + const char* aChallenge, + uint32_t aChallengeSize) override {} + void EnableOutputProtection(uint32_t aDesiredProtectionMask) override {} + void QueryOutputProtectionStatus() override; + void OnDeferredInitializationDone(cdm::StreamType aStreamType, + cdm::Status aDecoderStatus) override {} + void RequestStorageId(uint32_t aVersion) override; + cdm::FileIO* CreateFileIO(cdm::FileIOClient* aClient) override; + void OnInitialized(bool aSuccess) override; + // end cdm::Host_10 specific methods + + void GiveBuffer(ipc::Shmem&& aBuffer); + + protected: + ~ChromiumCDMChild(); + + bool OnResolveNewSessionPromiseInternal(uint32_t aPromiseId, + const nsACString& aSessionId); + + bool IsOnMessageLoopThread(); + + void ActorDestroy(ActorDestroyReason aReason) override; + + ipc::IPCResult RecvGiveBuffer(ipc::Shmem&& aShmem) override; + ipc::IPCResult RecvPurgeShmems() override; + void PurgeShmems(); + ipc::IPCResult RecvInit(const bool& aAllowDistinctiveIdentifier, + const bool& aAllowPersistentState, + InitResolver&& aResolver) override; + ipc::IPCResult RecvSetServerCertificate( + const uint32_t& aPromiseId, nsTArray<uint8_t>&& aServerCert) override; + ipc::IPCResult RecvCreateSessionAndGenerateRequest( + const uint32_t& aPromiseId, const uint32_t& aSessionType, + const uint32_t& aInitDataType, nsTArray<uint8_t>&& aInitData) override; + ipc::IPCResult RecvLoadSession(const uint32_t& aPromiseId, + const uint32_t& aSessionType, + const nsACString& aSessionId) override; + ipc::IPCResult RecvUpdateSession(const uint32_t& aPromiseId, + const nsACString& aSessionId, + nsTArray<uint8_t>&& aResponse) override; + ipc::IPCResult RecvCloseSession(const uint32_t& aPromiseId, + const nsACString& aSessionId) override; + ipc::IPCResult RecvRemoveSession(const uint32_t& aPromiseId, + const nsACString& aSessionId) override; + ipc::IPCResult RecvCompleteQueryOutputProtectionStatus( + const bool& aSuccess, const uint32_t& aLinkMask, + const uint32_t& aProtectionMask) override; + ipc::IPCResult RecvGetStatusForPolicy( + const uint32_t& aPromiseId, + const cdm::HdcpVersion& aMinHdcpVersion) override; + ipc::IPCResult RecvDecrypt(const uint32_t& aId, + const CDMInputBuffer& aBuffer) override; + ipc::IPCResult RecvInitializeVideoDecoder( + const CDMVideoDecoderConfig& aConfig) override; + ipc::IPCResult RecvDeinitializeVideoDecoder() override; + ipc::IPCResult RecvResetVideoDecoder() override; + ipc::IPCResult RecvDecryptAndDecodeFrame( + const CDMInputBuffer& aBuffer) override; + ipc::IPCResult RecvDrain() override; + ipc::IPCResult RecvDestroy() override; + + void ReturnOutput(WidevineVideoFrame& aFrame); + bool HasShmemOfSize(size_t aSize) const; + + template <typename MethodType, typename... ParamType> + void CallMethod(MethodType, ParamType&&...); + + template <typename MethodType, typename... ParamType> + void CallOnMessageLoopThread(const char* const, MethodType, ParamType&&...); + + GMPContentChild* mPlugin = nullptr; + cdm::ContentDecryptionModule_10* mCDM = nullptr; + + typedef SimpleMap<uint64_t> DurationMap; + DurationMap mFrameDurations; + nsTArray<uint32_t> mLoadSessionPromiseIds; + + cdm::Size mCodedSize = {0, 0}; + nsTArray<ipc::Shmem> mBuffers; + + bool mDecoderInitialized = false; + bool mPersistentStateAllowed = false; + bool mDestroyed = false; + nsCString mStorageId; + + typedef MozPromise<bool, nsresult, /* IsExclusive = */ true> InitPromise; + // Created when we RecvInit, should be resolved once the CDM is initialized + // or rejected if init fails. + MozPromiseHolder<InitPromise> mInitPromise; +}; + +} // namespace mozilla::gmp + +#endif // ChromiumCDMChild_h_ |