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