forked from mirrors/gecko-dev
It will now be up to the caller to determine where the decoder is going to run. This allows to simplify the audio decoders so that they can run synchronously and be wrapped in a Wasm sandbox (which doesn't support multi-threading) The structure guarantees that all MediaDataDecoder methods are called on the same thread it's been initialised. To achieve this, wherever a MediaDataDecoder was created, we wrap it in a MediaDataDecoderProxy that ensures that all methods are running on the given thread. We keep the behaviour of all methods in all MediaDataDecoder to assert that they are running on the expected thread for diagnostic purposes. It could go in the future. Video decoders that could block excessingly the thread on which they are called are made to run on their own task queue. The Apple decoder is mostly entirely asynchronous, with the exception of the drain method which could block. We exclude the android and omx decoders are the framework they use is 100% asynchronous and already operate on another thread. Differential Revision: https://phabricator.services.mozilla.com/D86929
82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef __FFmpegDataDecoder_h__
|
|
#define __FFmpegDataDecoder_h__
|
|
|
|
#include "FFmpegLibWrapper.h"
|
|
#include "PlatformDecoderModule.h"
|
|
#include "mozilla/StaticMutex.h"
|
|
|
|
// This must be the last header included
|
|
#include "FFmpegLibs.h"
|
|
|
|
namespace mozilla {
|
|
|
|
template <int V>
|
|
class FFmpegDataDecoder : public MediaDataDecoder {};
|
|
|
|
template <>
|
|
class FFmpegDataDecoder<LIBAV_VER>;
|
|
DDLoggedTypeNameAndBase(FFmpegDataDecoder<LIBAV_VER>, MediaDataDecoder);
|
|
|
|
template <>
|
|
class FFmpegDataDecoder<LIBAV_VER>
|
|
: public MediaDataDecoder,
|
|
public DecoderDoctorLifeLogger<FFmpegDataDecoder<LIBAV_VER>> {
|
|
public:
|
|
FFmpegDataDecoder(FFmpegLibWrapper* aLib, AVCodecID aCodecID);
|
|
virtual ~FFmpegDataDecoder();
|
|
|
|
static bool Link();
|
|
|
|
RefPtr<InitPromise> Init() override = 0;
|
|
RefPtr<DecodePromise> Decode(MediaRawData* aSample) override;
|
|
RefPtr<DecodePromise> Drain() override;
|
|
RefPtr<FlushPromise> Flush() override;
|
|
RefPtr<ShutdownPromise> Shutdown() override;
|
|
|
|
static AVCodec* FindAVCodec(FFmpegLibWrapper* aLib, AVCodecID aCodec);
|
|
|
|
protected:
|
|
// Flush and Drain operation, always run
|
|
virtual RefPtr<FlushPromise> ProcessFlush();
|
|
virtual void ProcessShutdown();
|
|
virtual void InitCodecContext() {}
|
|
AVFrame* PrepareFrame();
|
|
MediaResult InitDecoder();
|
|
MediaResult AllocateExtraData();
|
|
MediaResult DoDecode(MediaRawData* aSample, bool* aGotFrame,
|
|
DecodedData& aOutResults);
|
|
|
|
FFmpegLibWrapper* mLib;
|
|
|
|
AVCodecContext* mCodecContext;
|
|
AVCodecParserContext* mCodecParser;
|
|
AVFrame* mFrame;
|
|
RefPtr<MediaByteBuffer> mExtraData;
|
|
AVCodecID mCodecID;
|
|
|
|
protected:
|
|
static StaticMutex sMonitor;
|
|
const RefPtr<TaskQueue> mTaskQueue;
|
|
|
|
private:
|
|
RefPtr<DecodePromise> ProcessDecode(MediaRawData* aSample);
|
|
RefPtr<DecodePromise> ProcessDrain();
|
|
virtual MediaResult DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize,
|
|
bool* aGotFrame,
|
|
MediaDataDecoder::DecodedData& aOutResults) = 0;
|
|
virtual bool NeedParser() const { return false; }
|
|
virtual int ParserFlags() const { return PARSER_FLAG_COMPLETE_FRAMES; }
|
|
|
|
MozPromiseHolder<DecodePromise> mPromise;
|
|
media::TimeUnit mLastInputDts;
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // __FFmpegDataDecoder_h__
|