tor-browser

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

RemoteDecoderChild.h (3592B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 #ifndef include_dom_media_ipc_RemoteDecoderChild_h
      7 #define include_dom_media_ipc_RemoteDecoderChild_h
      8 
      9 #include "mozilla/EnumeratedArray.h"
     10 #include "mozilla/PRemoteDecoderChild.h"
     11 #include "mozilla/RemoteMediaManagerChild.h"
     12 #include "mozilla/ShmemRecycleAllocator.h"
     13 
     14 namespace mozilla {
     15 
     16 class RemoteMediaManagerChild;
     17 using mozilla::MediaDataDecoder;
     18 using mozilla::ipc::IPCResult;
     19 
     20 class RemoteDecoderChild : public ShmemRecycleAllocator<RemoteDecoderChild>,
     21                           public PRemoteDecoderChild {
     22  friend class PRemoteDecoderChild;
     23 
     24 public:
     25  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RemoteDecoderChild);
     26 
     27  explicit RemoteDecoderChild(RemoteMediaIn aLocation);
     28 
     29  void ActorDestroy(ActorDestroyReason aWhy) override;
     30 
     31  // This interface closely mirrors the MediaDataDecoder plus a bit
     32  // (DestroyIPDL) to allow proxying to a remote decoder in RemoteDecoderModule.
     33  RefPtr<MediaDataDecoder::InitPromise> Init();
     34  RefPtr<MediaDataDecoder::DecodePromise> Decode(
     35      const nsTArray<RefPtr<MediaRawData>>& aSamples);
     36  RefPtr<MediaDataDecoder::DecodePromise> Drain();
     37  RefPtr<MediaDataDecoder::FlushPromise> Flush();
     38  RefPtr<mozilla::ShutdownPromise> Shutdown();
     39  bool IsHardwareAccelerated(nsACString& aFailureReason) const;
     40  nsCString GetDescriptionName() const;
     41  nsCString GetProcessName() const;
     42  nsCString GetCodecName() const;
     43  void SetSeekThreshold(const media::TimeUnit& aTime);
     44  MediaDataDecoder::ConversionRequired NeedsConversion() const;
     45  bool ShouldDecoderAlwaysBeRecycled() const;
     46  using DecodeProperties =
     47      EnumeratedArray<MediaDataDecoder::PropertyName,
     48                      Maybe<MediaDataDecoder::PropertyValue>,
     49                      MediaDataDecoder::sPropertyNameCount>;
     50  const DecodeProperties& GetDecodeProperties() const {
     51    return mDecodeProperties;
     52  }
     53 
     54  void DestroyIPDL();
     55 
     56  // Called from IPDL when our actor has been destroyed
     57  void IPDLActorDestroyed();
     58 
     59  RemoteMediaManagerChild* GetManager();
     60 
     61 protected:
     62  virtual ~RemoteDecoderChild();
     63  void AssertOnManagerThread() const;
     64 
     65  virtual MediaResult ProcessOutput(DecodedOutputIPDL&& aDecodedData) = 0;
     66  virtual void RecordShutdownTelemetry(bool aForAbnormalShutdown) {}
     67 
     68  RefPtr<RemoteDecoderChild> mIPDLSelfRef;
     69  MediaDataDecoder::DecodedData mDecodedData;
     70  const RemoteMediaIn mLocation;
     71 
     72 private:
     73  const nsCOMPtr<nsISerialEventTarget> mThread;
     74 
     75  MozPromiseHolder<MediaDataDecoder::InitPromise> mInitPromise;
     76  MozPromiseRequestHolder<PRemoteDecoderChild::InitPromise> mInitPromiseRequest;
     77  MozPromiseHolder<MediaDataDecoder::DecodePromise> mDecodePromise;
     78  MozPromiseHolder<MediaDataDecoder::DecodePromise> mDrainPromise;
     79  MozPromiseHolder<MediaDataDecoder::FlushPromise> mFlushPromise;
     80  MozPromiseHolder<mozilla::ShutdownPromise> mShutdownPromise;
     81 
     82  nsCString mHardwareAcceleratedReason;
     83  nsCString mDescription;
     84  nsCString mProcessName;
     85  nsCString mCodecName;
     86  bool mIsHardwareAccelerated = false;
     87  bool mRemoteDecoderCrashed = false;
     88  MediaDataDecoder::ConversionRequired mConversion =
     89      MediaDataDecoder::ConversionRequired::kNeedNone;
     90  bool mShouldDecoderAlwaysBeRecycled = false;
     91  DecodeProperties mDecodeProperties;
     92 };
     93 
     94 }  // namespace mozilla
     95 
     96 #endif  // include_dom_media_ipc_RemoteDecoderChild_h