tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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