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