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