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