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 #include "mozilla/PRemoteDecoderChild.h" 9 10 #include <functional> 11 #include "IRemoteDecoderChild.h" 12 #include "mozilla/ShmemPool.h" 13 14 namespace mozilla { 15 16 class RemoteDecoderManagerChild; 17 using mozilla::MediaDataDecoder; 18 using mozilla::ipc::IPCResult; 19 20 class RemoteDecoderChild : public PRemoteDecoderChild, 21 public IRemoteDecoderChild { 22 friend class PRemoteDecoderChild; 23 24 public: 25 explicit RemoteDecoderChild(bool aRecreatedOnCrash = false); 26 27 void ActorDestroy(ActorDestroyReason aWhy) override; 28 29 // IRemoteDecoderChild 30 RefPtr<MediaDataDecoder::InitPromise> Init() override; 31 RefPtr<MediaDataDecoder::DecodePromise> Decode( 32 const nsTArray<RefPtr<MediaRawData>>& aSamples) override; 33 RefPtr<MediaDataDecoder::DecodePromise> Drain() override; 34 RefPtr<MediaDataDecoder::FlushPromise> Flush() override; 35 RefPtr<mozilla::ShutdownPromise> Shutdown() override; 36 bool IsHardwareAccelerated(nsACString& aFailureReason) const override; 37 nsCString GetDescriptionName() const override; 38 void SetSeekThreshold(const media::TimeUnit& aTime) override; 39 MediaDataDecoder::ConversionRequired NeedsConversion() const override; 40 void DestroyIPDL() override; 41 42 // Called from IPDL when our actor has been destroyed 43 void IPDLActorDestroyed(); 44 45 RemoteDecoderManagerChild* GetManager(); 46 47 protected: 48 virtual ~RemoteDecoderChild() = default; 49 void AssertOnManagerThread() const; 50 51 virtual MediaResult ProcessOutput(const DecodedOutputIPDL& aDecodedData) = 0; RecordShutdownTelemetry(bool aForAbnormalShutdown)52 virtual void RecordShutdownTelemetry(bool aForAbnormalShutdown) {} 53 54 RefPtr<RemoteDecoderChild> mIPDLSelfRef; 55 MediaDataDecoder::DecodedData mDecodedData; 56 57 private: 58 RefPtr<nsIThread> mThread; 59 60 MozPromiseHolder<MediaDataDecoder::InitPromise> mInitPromise; 61 MozPromiseRequestHolder<PRemoteDecoderChild::InitPromise> mInitPromiseRequest; 62 MozPromiseHolder<MediaDataDecoder::DecodePromise> mDecodePromise; 63 MozPromiseHolder<MediaDataDecoder::DecodePromise> mDrainPromise; 64 MozPromiseHolder<MediaDataDecoder::FlushPromise> mFlushPromise; 65 MozPromiseHolder<mozilla::ShutdownPromise> mShutdownPromise; 66 67 void HandleRejectionError( 68 const ipc::ResponseRejectReason& aReason, 69 std::function<void(const MediaResult&)>&& aCallback); 70 TimeStamp mRemoteProcessCrashTime; 71 72 nsCString mHardwareAcceleratedReason; 73 nsCString mDescription; 74 bool mIsHardwareAccelerated = false; 75 const bool mRecreatedOnCrash; 76 MediaDataDecoder::ConversionRequired mConversion = 77 MediaDataDecoder::ConversionRequired::kNeedNone; 78 ShmemPool mRawFramePool; 79 }; 80 81 } // namespace mozilla 82 83 #endif // include_dom_media_ipc_RemoteDecoderChild_h 84