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
11 #include "mozilla/PRemoteDecoderChild.h"
12 #include "mozilla/RemoteDecoderManagerChild.h"
13 #include "mozilla/ShmemRecycleAllocator.h"
17 class RemoteDecoderManagerChild
;
18 using mozilla::MediaDataDecoder
;
19 using mozilla::ipc::IPCResult
;
21 class RemoteDecoderChild
: public ShmemRecycleAllocator
<RemoteDecoderChild
>,
22 public PRemoteDecoderChild
{
23 friend class PRemoteDecoderChild
;
26 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RemoteDecoderChild
);
28 explicit RemoteDecoderChild(RemoteDecodeIn aLocation
);
30 void ActorDestroy(ActorDestroyReason aWhy
) override
;
32 // This interface closely mirrors the MediaDataDecoder plus a bit
33 // (DestroyIPDL) to allow proxying to a remote decoder in RemoteDecoderModule.
34 RefPtr
<MediaDataDecoder::InitPromise
> Init();
35 RefPtr
<MediaDataDecoder::DecodePromise
> Decode(
36 const nsTArray
<RefPtr
<MediaRawData
>>& aSamples
);
37 RefPtr
<MediaDataDecoder::DecodePromise
> Drain();
38 RefPtr
<MediaDataDecoder::FlushPromise
> Flush();
39 RefPtr
<mozilla::ShutdownPromise
> Shutdown();
40 bool IsHardwareAccelerated(nsACString
& aFailureReason
) const;
41 nsCString
GetDescriptionName() const;
42 nsCString
GetProcessName() const;
43 nsCString
GetCodecName() const;
44 void SetSeekThreshold(const media::TimeUnit
& aTime
);
45 MediaDataDecoder::ConversionRequired
NeedsConversion() const;
48 // Called from IPDL when our actor has been destroyed
49 void IPDLActorDestroyed();
51 RemoteDecoderManagerChild
* GetManager();
54 virtual ~RemoteDecoderChild();
55 void AssertOnManagerThread() const;
57 virtual MediaResult
ProcessOutput(DecodedOutputIPDL
&& aDecodedData
) = 0;
58 virtual void RecordShutdownTelemetry(bool aForAbnormalShutdown
) {}
60 RefPtr
<RemoteDecoderChild
> mIPDLSelfRef
;
61 MediaDataDecoder::DecodedData mDecodedData
;
62 const RemoteDecodeIn mLocation
;
65 const nsCOMPtr
<nsISerialEventTarget
> mThread
;
67 MozPromiseHolder
<MediaDataDecoder::InitPromise
> mInitPromise
;
68 MozPromiseRequestHolder
<PRemoteDecoderChild::InitPromise
> mInitPromiseRequest
;
69 MozPromiseHolder
<MediaDataDecoder::DecodePromise
> mDecodePromise
;
70 MozPromiseHolder
<MediaDataDecoder::DecodePromise
> mDrainPromise
;
71 MozPromiseHolder
<MediaDataDecoder::FlushPromise
> mFlushPromise
;
72 MozPromiseHolder
<mozilla::ShutdownPromise
> mShutdownPromise
;
74 void HandleRejectionError(
75 const ipc::ResponseRejectReason
& aReason
,
76 std::function
<void(const MediaResult
&)>&& aCallback
);
78 nsCString mHardwareAcceleratedReason
;
79 nsCString mDescription
;
80 nsCString mProcessName
;
82 bool mIsHardwareAccelerated
= false;
83 bool mRemoteDecoderCrashed
= false;
84 MediaDataDecoder::ConversionRequired mConversion
=
85 MediaDataDecoder::ConversionRequired::kNeedNone
;
88 } // namespace mozilla
90 #endif // include_dom_media_ipc_RemoteDecoderChild_h