Bug 1297265: P10. Rework FFmpeg Decoder use of InputExhausted. r?kamidphish
MozReview-Commit-ID: 8fndcHQELTo
--- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -128,16 +128,17 @@ FFmpegAudioDecoder<LIBAV_VER>::DoDecode(
if (!PrepareFrame()) {
NS_WARNING("FFmpeg audio decoder failed to allocate frame.");
return DecodeResult::FATAL_ERROR;
}
int64_t samplePosition = aSample->mOffset;
media::TimeUnit pts = media::TimeUnit::FromMicroseconds(aSample->mTime);
+ bool didOutput = false;
while (packet.size > 0) {
int decoded;
int bytesConsumed =
mLib->avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet);
if (bytesConsumed < 0) {
NS_WARNING("FFmpeg audio decoder error.");
@@ -176,28 +177,29 @@ FFmpegAudioDecoder<LIBAV_VER>::DoDecode(
RefPtr<AudioData> data = new AudioData(samplePosition,
pts.ToMicroseconds(),
duration.ToMicroseconds(),
mFrame->nb_samples,
Move(audio),
numChannels,
samplingRate);
mCallback->Output(data);
+ didOutput = true;
pts += duration;
if (!pts.IsValid()) {
NS_WARNING("Invalid count of accumulated audio samples");
return DecodeResult::DECODE_ERROR;
}
}
packet.data += bytesConsumed;
packet.size -= bytesConsumed;
samplePosition += bytesConsumed;
}
- return DecodeResult::DECODE_FRAME;
+ return didOutput ? DecodeResult::DECODE_FRAME : DecodeResult::DECODE_NO_FRAME;
}
void
FFmpegAudioDecoder<LIBAV_VER>::ProcessDrain()
{
ProcessFlush();
mCallback->DrainComplete();
}
--- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
@@ -112,20 +112,21 @@ FFmpegDataDecoder<LIBAV_VER>::ProcessDec
}
switch (DoDecode(aSample)) {
case DecodeResult::DECODE_ERROR:
mCallback->Error(MediaDataDecoderError::DECODE_ERROR);
break;
case DecodeResult::FATAL_ERROR:
mCallback->Error(MediaDataDecoderError::FATAL_ERROR);
break;
+ case DecodeResult::DECODE_NO_FRAME:
+ mCallback->InputExhausted();
+ break;
default:
- if (mTaskQueue->IsEmpty()) {
- mCallback->InputExhausted();
- }
+ break;
}
}
nsresult
FFmpegDataDecoder<LIBAV_VER>::Input(MediaRawData* aSample)
{
mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
this, &FFmpegDataDecoder::ProcessDecode, aSample));