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 #include "DummyMediaDataDecoder.h"
8 #include "AnnexB.h"
9 #include "H264.h"
10 #include "MP4Decoder.h"
11
12 namespace mozilla {
13
~DummyDataCreator()14 DummyDataCreator::~DummyDataCreator() {}
15
DummyMediaDataDecoder(UniquePtr<DummyDataCreator> && aCreator,const nsACString & aDescription,const CreateDecoderParams & aParams)16 DummyMediaDataDecoder::DummyMediaDataDecoder(
17 UniquePtr<DummyDataCreator>&& aCreator, const nsACString& aDescription,
18 const CreateDecoderParams& aParams)
19 : mCreator(Move(aCreator)),
20 mIsH264(MP4Decoder::IsH264(aParams.mConfig.mMimeType)),
21 mMaxRefFrames(mIsH264 ? H264::HasSPS(aParams.VideoConfig().mExtraData)
22 ? H264::ComputeMaxRefFrames(
23 aParams.VideoConfig().mExtraData)
24 : 16
25 : 0),
26 mType(aParams.mConfig.GetType()),
27 mDescription(aDescription) {}
28
Init()29 RefPtr<MediaDataDecoder::InitPromise> DummyMediaDataDecoder::Init() {
30 return InitPromise::CreateAndResolve(mType, __func__);
31 }
32
Shutdown()33 RefPtr<ShutdownPromise> DummyMediaDataDecoder::Shutdown() {
34 return ShutdownPromise::CreateAndResolve(true, __func__);
35 }
36
Decode(MediaRawData * aSample)37 RefPtr<MediaDataDecoder::DecodePromise> DummyMediaDataDecoder::Decode(
38 MediaRawData* aSample) {
39 RefPtr<MediaData> data = mCreator->Create(aSample);
40
41 if (!data) {
42 return DecodePromise::CreateAndReject(NS_ERROR_OUT_OF_MEMORY, __func__);
43 }
44
45 // Frames come out in DTS order but we need to output them in PTS order.
46 mReorderQueue.Push(data);
47
48 if (mReorderQueue.Length() > mMaxRefFrames) {
49 return DecodePromise::CreateAndResolve(
50 DecodedData{mReorderQueue.Pop().get()}, __func__);
51 }
52 return DecodePromise::CreateAndResolve(DecodedData(), __func__);
53 }
54
Drain()55 RefPtr<MediaDataDecoder::DecodePromise> DummyMediaDataDecoder::Drain() {
56 DecodedData samples;
57 while (!mReorderQueue.IsEmpty()) {
58 samples.AppendElement(mReorderQueue.Pop().get());
59 }
60 return DecodePromise::CreateAndResolve(samples, __func__);
61 }
62
Flush()63 RefPtr<MediaDataDecoder::FlushPromise> DummyMediaDataDecoder::Flush() {
64 mReorderQueue.Clear();
65 return FlushPromise::CreateAndResolve(true, __func__);
66 }
67
GetDescriptionName() const68 nsCString DummyMediaDataDecoder::GetDescriptionName() const {
69 return NS_LITERAL_CSTRING("blank media data decoder");
70 }
71
NeedsConversion() const72 MediaDataDecoder::ConversionRequired DummyMediaDataDecoder::NeedsConversion()
73 const {
74 return mIsH264 ? ConversionRequired::kNeedAVCC
75 : ConversionRequired::kNeedNone;
76 }
77
78 } // namespace mozilla
79