/* -*- 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 WidevineDecryptor_h_ #define WidevineDecryptor_h_ #include "stddef.h" #include "content_decryption_module.h" #include "gmp-api/gmp-decryption.h" #include "mozilla/RefPtr.h" #include "WidevineUtils.h" #include namespace mozilla { class WidevineDecryptor : public GMPDecryptor , public cdm::Host_9 { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WidevineDecryptor) WidevineDecryptor(); void SetCDM(RefPtr aCDM, uint32_t aDecryptorId); static RefPtr GetInstance(uint32_t aDecryptorId); // GMPDecryptor void Init(GMPDecryptorCallback* aCallback, bool aDistinctiveIdentifierRequired, bool aPersistentStateRequired) override; void CreateSession(uint32_t aCreateSessionToken, uint32_t aPromiseId, const char* aInitDataType, uint32_t aInitDataTypeSize, const uint8_t* aInitData, uint32_t aInitDataSize, GMPSessionType aSessionType) override; void LoadSession(uint32_t aPromiseId, const char* aSessionId, uint32_t aSessionIdLength) override; void UpdateSession(uint32_t aPromiseId, const char* aSessionId, uint32_t aSessionIdLength, const uint8_t* aResponse, uint32_t aResponseSize) override; void CloseSession(uint32_t aPromiseId, const char* aSessionId, uint32_t aSessionIdLength) override; void RemoveSession(uint32_t aPromiseId, const char* aSessionId, uint32_t aSessionIdLength) override; void SetServerCertificate(uint32_t aPromiseId, const uint8_t* aServerCert, uint32_t aServerCertSize) override; void Decrypt(GMPBuffer* aBuffer, GMPEncryptedBufferMetadata* aMetadata) override; void DecryptingComplete() override; // cdm::Host_9 implementation cdm::Buffer* Allocate(uint32_t aCapacity) override; void SetTimer(int64_t aDelayMs, void* aContext) override; cdm::Time GetCurrentWallTime() override; // cdm::Host_9 interface 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; // cdm::Host_9 interface // NOTE: the interface has changed upstream. void RequestStorageId(uint32_t aVersion) override; cdm::FileIO* CreateFileIO(cdm::FileIOClient* aClient) override; GMPDecryptorCallback* Callback() const { return mCallback; } RefPtr GetCDMWrapper() const { return mCDM; } private: ~WidevineDecryptor(); RefPtr mCDM; cdm::ContentDecryptionModule_9* CDM() { return mCDM->GetCDM(); } GMPDecryptorCallback* mCallback; std::map mPromiseIdToNewSessionTokens; bool mDistinctiveIdentifierRequired = false; bool mPersistentStateRequired = false; uint32_t mInstanceId = 0; }; } // namespace mozilla #endif // WidevineDecryptor_h_