Bug 1258922: [MSE] P4. Set draining flag to true when skip to next keyframe failed. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 05 May 2016 15:58:49 +1000
changeset 364220 c265da61ef179e0b56d435b4e16162d31829010a
parent 364219 657f9487efd8e3e441a7dea533e54536c0b8e926
child 520209 766c7a91ace7df79368dfd346d3af96722eca9e8
push id17385
push userbmo:jyavenard@mozilla.com
push dateFri, 06 May 2016 06:40:44 +0000
reviewersgerald
bugs1258922
milestone49.0a1
Bug 1258922: [MSE] P4. Set draining flag to true when skip to next keyframe failed. r?gerald data promise is only resolved once the decoder has been drained. It was possible for a promise to never be resolved if skipping to the next key frame failed. MozReview-Commit-ID: GimbQTImH9e
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1442,16 +1442,25 @@ MediaFormatReader::OnVideoSkipFailed(Med
     mDecoder->NotifyDecodedFrames(aFailure.mSkipped, 0, aFailure.mSkipped);
   }
   MOZ_ASSERT(mVideo.HasPromise());
   switch (aFailure.mFailure) {
     case DemuxerFailureReason::END_OF_STREAM:
       NotifyEndOfStream(TrackType::kVideoTrack);
       break;
     case DemuxerFailureReason::WAITING_FOR_DATA:
+      // While there is nothing to drain considering the decoder has been
+      // flushed in SkipVideoDemuxToNextKeyFrame, we need to set mNeedDraining
+      // to true as the video MediaDataPromise will only be rejected once drain
+      // has completed.
+      MOZ_DIAGNOSTIC_ASSERT(!mVideo.mDecodingRequested,
+                            "Reset must have been called");
+      if (!mVideo.mWaitingForData) {
+        mVideo.mNeedDraining = true;
+      }
       NotifyWaitingForData(TrackType::kVideoTrack);
       break;
     case DemuxerFailureReason::CANCELED:
     case DemuxerFailureReason::SHUTDOWN:
       if (mVideo.HasPromise()) {
         mVideo.RejectPromise(CANCELED, __func__);
       }
       break;