tor-browser

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

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_