Bug 1297265: P10. Rework FFmpeg Decoder use of InputExhausted. r?kamidphish draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Tue, 30 Aug 2016 15:22:36 +1000
changeset 407298 fb7cb2b7a15570bf97d840b222bf246d2274d083
parent 407297 29f81944bc870014bcb3036ea4cc9d0c43ae1dbe
child 407299 397924f7bde99972c766d24c01e7a881a298e7c1
child 407371 723ea0035c7bb59d4feba9a5b185a3715c24673a
push id27921
push userbmo:jyavenard@mozilla.com
push dateTue, 30 Aug 2016 07:23:20 +0000
reviewerskamidphish
bugs1297265
milestone51.0a1
Bug 1297265: P10. Rework FFmpeg Decoder use of InputExhausted. r?kamidphish MozReview-Commit-ID: 8fndcHQELTo
dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
--- 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));