/src/mozilla-central/dom/media/platforms/wrappers/H264Converter.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim:set ts=2 sw=2 sts=2 et cindent: */ |
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 | | |
7 | | #ifndef mozilla_H264Converter_h |
8 | | #define mozilla_H264Converter_h |
9 | | |
10 | | #include "PlatformDecoderModule.h" |
11 | | #include "mozilla/Maybe.h" |
12 | | |
13 | | namespace mozilla { |
14 | | |
15 | | class DecoderDoctorDiagnostics; |
16 | | |
17 | | DDLoggedTypeDeclNameAndBase(H264Converter, MediaDataDecoder); |
18 | | |
19 | | // H264Converter is a MediaDataDecoder wrapper used to ensure that |
20 | | // only AVCC or AnnexB is fed to the underlying MediaDataDecoder. |
21 | | // The H264Converter allows playback of content where the SPS NAL may not be |
22 | | // provided in the init segment (e.g. AVC3 or Annex B) |
23 | | // H264Converter will monitor the input data, and will delay creation of the |
24 | | // MediaDataDecoder until a SPS and PPS NALs have been extracted. |
25 | | |
26 | | class H264Converter |
27 | | : public MediaDataDecoder |
28 | | , public DecoderDoctorLifeLogger<H264Converter> |
29 | | { |
30 | | public: |
31 | | |
32 | | H264Converter(PlatformDecoderModule* aPDM, |
33 | | const CreateDecoderParams& aParams); |
34 | | virtual ~H264Converter(); |
35 | | |
36 | | RefPtr<InitPromise> Init() override; |
37 | | RefPtr<DecodePromise> Decode(MediaRawData* aSample) override; |
38 | | RefPtr<DecodePromise> Drain() override; |
39 | | RefPtr<FlushPromise> Flush() override; |
40 | | RefPtr<ShutdownPromise> Shutdown() override; |
41 | | bool IsHardwareAccelerated(nsACString& aFailureReason) const override; |
42 | | nsCString GetDescriptionName() const override |
43 | 0 | { |
44 | 0 | if (mDecoder) { |
45 | 0 | return mDecoder->GetDescriptionName(); |
46 | 0 | } |
47 | 0 | return NS_LITERAL_CSTRING("H264Converter decoder (pending)"); |
48 | 0 | } |
49 | | void SetSeekThreshold(const media::TimeUnit& aTime) override; |
50 | | bool SupportDecoderRecycling() const override |
51 | 0 | { |
52 | 0 | if (mDecoder) { |
53 | 0 | return mDecoder->SupportDecoderRecycling(); |
54 | 0 | } |
55 | 0 | return false; |
56 | 0 | } |
57 | | |
58 | | ConversionRequired NeedsConversion() const override |
59 | 0 | { |
60 | 0 | if (mDecoder) { |
61 | 0 | return mDecoder->NeedsConversion(); |
62 | 0 | } |
63 | 0 | // Default so no conversion is performed. |
64 | 0 | return ConversionRequired::kNeedAVCC; |
65 | 0 | } |
66 | 0 | MediaResult GetLastError() const { return mLastError; } |
67 | | |
68 | | private: |
69 | | // Will create the required MediaDataDecoder if need AVCC and we have a SPS NAL. |
70 | | // Returns NS_ERROR_FAILURE if error is permanent and can't be recovered and |
71 | | // will set mError accordingly. |
72 | | MediaResult CreateDecoder(const VideoInfo& aConfig, |
73 | | DecoderDoctorDiagnostics* aDiagnostics); |
74 | | MediaResult CreateDecoderAndInit(MediaRawData* aSample); |
75 | | MediaResult CheckForSPSChange(MediaRawData* aSample); |
76 | | void UpdateConfigFromExtraData(MediaByteBuffer* aExtraData); |
77 | | |
78 | | bool CanRecycleDecoder() const; |
79 | | |
80 | | void DecodeFirstSample(MediaRawData* aSample); |
81 | | void DrainThenFlushDecoder(MediaRawData* aPendingSample); |
82 | | void FlushThenShutdownDecoder(MediaRawData* aPendingSample); |
83 | | RefPtr<ShutdownPromise> ShutdownDecoder(); |
84 | | |
85 | | RefPtr<PlatformDecoderModule> mPDM; |
86 | | const VideoInfo mOriginalConfig; |
87 | | VideoInfo mCurrentConfig; |
88 | | // Current out of band extra data (as found in metadata's VideoInfo). |
89 | | RefPtr<MediaByteBuffer> mOriginalExtraData; |
90 | | RefPtr<layers::KnowsCompositor> mKnowsCompositor; |
91 | | RefPtr<layers::ImageContainer> mImageContainer; |
92 | | const RefPtr<TaskQueue> mTaskQueue; |
93 | | RefPtr<MediaDataDecoder> mDecoder; |
94 | | MozPromiseRequestHolder<InitPromise> mInitPromiseRequest; |
95 | | MozPromiseRequestHolder<DecodePromise> mDecodePromiseRequest; |
96 | | MozPromiseHolder<DecodePromise> mDecodePromise; |
97 | | MozPromiseRequestHolder<FlushPromise> mFlushRequest; |
98 | | MediaDataDecoder::DecodedData mPendingFrames; |
99 | | MozPromiseRequestHolder<DecodePromise> mDrainRequest; |
100 | | MozPromiseRequestHolder<ShutdownPromise> mShutdownRequest; |
101 | | RefPtr<ShutdownPromise> mShutdownPromise; |
102 | | MozPromiseHolder<FlushPromise> mFlushPromise; |
103 | | |
104 | | RefPtr<GMPCrashHelper> mGMPCrashHelper; |
105 | | Maybe<bool> mNeedAVCC; |
106 | | MediaResult mLastError; |
107 | | bool mNeedKeyframe = true; |
108 | | const TrackInfo::TrackType mType; |
109 | | MediaEventProducer<TrackInfo::TrackType>* const mOnWaitingForKeyEvent; |
110 | | const CreateDecoderParams::OptionSet mDecoderOptions; |
111 | | const CreateDecoderParams::VideoFrameRate mRate; |
112 | | Maybe<bool> mCanRecycleDecoder; |
113 | | }; |
114 | | |
115 | | } // namespace mozilla |
116 | | |
117 | | #endif // mozilla_H264Converter_h |