Bug 1271508. Part 3 - extract code to the parent class and remove use of mTaskQueue from sub-classes. r=jya.
MozReview-Commit-ID: DEAWr9EfpRD
--- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -165,36 +165,18 @@ FFmpegAudioDecoder<LIBAV_VER>::DoDecode(
packet.size -= bytesConsumed;
samplePosition += bytesConsumed;
}
return DecodeResult::DECODE_FRAME;
}
void
-FFmpegAudioDecoder<LIBAV_VER>::Decode(MediaRawData* aSample)
-{
- MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
- if (DoDecode(aSample) != DecodeResult::DECODE_ERROR && mTaskQueue->IsEmpty()) {
- mCallback->InputExhausted();
- }
-}
-
-nsresult
-FFmpegAudioDecoder<LIBAV_VER>::Input(MediaRawData* aSample)
-{
- mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
- this, &FFmpegAudioDecoder::Decode, aSample));
- return NS_OK;
-}
-
-void
FFmpegAudioDecoder<LIBAV_VER>::ProcessDrain()
{
- MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
ProcessFlush();
mCallback->DrainComplete();
}
AVCodecID
FFmpegAudioDecoder<LIBAV_VER>::GetCodecId(const nsACString& aMimeType)
{
if (aMimeType.EqualsLiteral("audio/mpeg")) {
--- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h
@@ -15,38 +15,30 @@ namespace mozilla
template <int V> class FFmpegAudioDecoder
{
};
template <>
class FFmpegAudioDecoder<LIBAV_VER> : public FFmpegDataDecoder<LIBAV_VER>
{
- enum DecodeResult {
- DECODE_FRAME,
- DECODE_NO_FRAME,
- DECODE_ERROR
- };
-
public:
FFmpegAudioDecoder(FFmpegLibWrapper* aLib, FlushableTaskQueue* aTaskQueue,
MediaDataDecoderCallback* aCallback,
const AudioInfo& aConfig);
virtual ~FFmpegAudioDecoder();
RefPtr<InitPromise> Init() override;
- nsresult Input(MediaRawData* aSample) override;
- void ProcessDrain() override;
void InitCodecContext() override;
static AVCodecID GetCodecId(const nsACString& aMimeType);
const char* GetDescriptionName() const override
{
return "ffmpeg audio decoder";
}
private:
- void Decode(MediaRawData* aSample);
- DecodeResult DoDecode(MediaRawData* aSample);
+ DecodeResult DoDecode(MediaRawData* aSample) override;
+ void ProcessDrain() override;
};
} // namespace mozilla
#endif // __FFmpegAACDecoder_h__
--- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
@@ -21,22 +21,22 @@ namespace mozilla
StaticMutex FFmpegDataDecoder<LIBAV_VER>::sMonitor;
FFmpegDataDecoder<LIBAV_VER>::FFmpegDataDecoder(FFmpegLibWrapper* aLib,
FlushableTaskQueue* aTaskQueue,
MediaDataDecoderCallback* aCallback,
AVCodecID aCodecID)
: mLib(aLib)
- , mTaskQueue(aTaskQueue)
, mCallback(aCallback)
, mCodecContext(nullptr)
, mFrame(NULL)
, mExtraData(nullptr)
, mCodecID(aCodecID)
+ , mTaskQueue(aTaskQueue)
{
MOZ_ASSERT(aLib);
MOZ_COUNT_CTOR(FFmpegDataDecoder);
}
FFmpegDataDecoder<LIBAV_VER>::~FFmpegDataDecoder()
{
MOZ_COUNT_DTOR(FFmpegDataDecoder);
@@ -106,16 +106,33 @@ FFmpegDataDecoder<LIBAV_VER>::Shutdown()
NewRunnableMethod(this, &FFmpegDataDecoder<LIBAV_VER>::ProcessShutdown);
mTaskQueue->Dispatch(runnable.forget());
} else {
ProcessShutdown();
}
return NS_OK;
}
+void
+FFmpegDataDecoder<LIBAV_VER>::Decode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (DoDecode(aSample) != DECODE_ERROR && mTaskQueue->IsEmpty()) {
+ mCallback->InputExhausted();
+ }
+}
+
+nsresult
+FFmpegDataDecoder<LIBAV_VER>::Input(MediaRawData* aSample)
+{
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &FFmpegDataDecoder::Decode, aSample));
+ return NS_OK;
+}
+
nsresult
FFmpegDataDecoder<LIBAV_VER>::Flush()
{
MOZ_ASSERT(mCallback->OnReaderTaskQueue());
mTaskQueue->Flush();
nsCOMPtr<nsIRunnable> runnable =
NewRunnableMethod(this, &FFmpegDataDecoder<LIBAV_VER>::ProcessFlush);
SyncRunnable::DispatchToThread(mTaskQueue, runnable);
--- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h
@@ -27,40 +27,49 @@ public:
FFmpegDataDecoder(FFmpegLibWrapper* aLib, FlushableTaskQueue* aTaskQueue,
MediaDataDecoderCallback* aCallback,
AVCodecID aCodecID);
virtual ~FFmpegDataDecoder();
static bool Link();
RefPtr<InitPromise> Init() override = 0;
- nsresult Input(MediaRawData* aSample) override = 0;
+ nsresult Input(MediaRawData* aSample);
nsresult Flush() override;
nsresult Drain() override;
nsresult Shutdown() override;
static AVCodec* FindAVCodec(FFmpegLibWrapper* aLib, AVCodecID aCodec);
protected:
+ enum DecodeResult {
+ DECODE_FRAME,
+ DECODE_NO_FRAME,
+ DECODE_ERROR
+ };
+
// Flush and Drain operation, always run
virtual void ProcessFlush();
- virtual void ProcessDrain() = 0;
virtual void ProcessShutdown();
virtual void InitCodecContext() {}
AVFrame* PrepareFrame();
nsresult InitDecoder();
FFmpegLibWrapper* mLib;
- RefPtr<FlushableTaskQueue> mTaskQueue;
MediaDataDecoderCallback* mCallback;
AVCodecContext* mCodecContext;
AVFrame* mFrame;
RefPtr<MediaByteBuffer> mExtraData;
AVCodecID mCodecID;
private:
+ void Decode(MediaRawData* aSample);
+ virtual DecodeResult DoDecode(MediaRawData* aSample) = 0;
+ virtual void ProcessDrain() = 0;
+
static StaticMutex sMonitor;
+ RefPtr<FlushableTaskQueue> mTaskQueue;
};
} // namespace mozilla
#endif // __FFmpegDataDecoder_h__
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
@@ -308,36 +308,18 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(
}
mCallback->Output(v);
return DecodeResult::DECODE_FRAME;
}
return DecodeResult::DECODE_NO_FRAME;
}
void
-FFmpegVideoDecoder<LIBAV_VER>::Decode(MediaRawData* aSample)
-{
- MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
- if (DoDecode(aSample) != DecodeResult::DECODE_ERROR && mTaskQueue->IsEmpty()) {
- mCallback->InputExhausted();
- }
-}
-
-nsresult
-FFmpegVideoDecoder<LIBAV_VER>::Input(MediaRawData* aSample)
-{
- mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
- this, &FFmpegVideoDecoder::Decode, aSample));
- return NS_OK;
-}
-
-void
FFmpegVideoDecoder<LIBAV_VER>::ProcessDrain()
{
- MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
RefPtr<MediaRawData> empty(new MediaRawData());
empty->mTimecode = mPtsContext.LastDts();
while (DoDecode(empty) == DecodeResult::DECODE_FRAME) {
}
mCallback->DrainComplete();
}
void
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
@@ -21,49 +21,40 @@ class FFmpegVideoDecoder : public FFmpeg
};
template <>
class FFmpegVideoDecoder<LIBAV_VER> : public FFmpegDataDecoder<LIBAV_VER>
{
typedef mozilla::layers::Image Image;
typedef mozilla::layers::ImageContainer ImageContainer;
- enum DecodeResult {
- DECODE_FRAME,
- DECODE_NO_FRAME,
- DECODE_ERROR
- };
-
public:
FFmpegVideoDecoder(FFmpegLibWrapper* aLib, FlushableTaskQueue* aTaskQueue,
MediaDataDecoderCallback* aCallback,
const VideoInfo& aConfig,
ImageContainer* aImageContainer);
virtual ~FFmpegVideoDecoder();
RefPtr<InitPromise> Init() override;
- nsresult Input(MediaRawData* aSample) override;
- void ProcessDrain() override;
void ProcessFlush() override;
void InitCodecContext() override;
const char* GetDescriptionName() const override
{
#ifdef USING_MOZFFVPX
return "ffvpx video decoder";
#else
return "ffmpeg video decoder";
#endif
}
static AVCodecID GetCodecId(const nsACString& aMimeType);
private:
- void Decode(MediaRawData* aSample);
- DecodeResult DoDecode(MediaRawData* aSample);
+ DecodeResult DoDecode(MediaRawData* aSample) override;
DecodeResult DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize);
- void DoDrain();
+ void ProcessDrain() override;
void OutputDelayedFrames();
/**
* This method allocates a buffer for FFmpeg's decoder, wrapped in an Image.
* Currently it only supports Planar YUV420, which appears to be the only
* non-hardware accelerated image format that FFmpeg's H264 decoder is
* capable of outputting.
*/