Bug 1270323: P4. Don't drain decoder if we're already waiting for new data. r?cpearce draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Mon, 23 May 2016 16:09:12 +1000
changeset 369997 37e919ae75a0f3de655090df5c47bc96d1304a0a
parent 369996 f712770a2b455ab4b96d3ef74110219b368bebc4
child 369998 191731f27b115e9fd89a47c9439a781ae4bea9ff
push id18971
push userbmo:jyavenard@mozilla.com
push dateTue, 24 May 2016 03:18:45 +0000
reviewerscpearce
bugs1270323
milestone49.0a1
Bug 1270323: P4. Don't drain decoder if we're already waiting for new data. r?cpearce If we're in waiting for data mode, the decoder must have already been drained and we want the waiting promise to be resolved upon the next run of UpdateReceivedNewData. MozReview-Commit-ID: Hf8pFFyQmjJ
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -556,28 +556,31 @@ MediaFormatReader::OnDemuxFailed(TrackTy
 {
   MOZ_ASSERT(OnTaskQueue());
   LOG("Failed to demux %s, failure:%d",
       aTrack == TrackType::kVideoTrack ? "video" : "audio", aFailure);
   auto& decoder = GetDecoderData(aTrack);
   decoder.mDemuxRequest.Complete();
   switch (aFailure) {
     case DemuxerFailureReason::END_OF_STREAM:
+      if (!decoder.mWaitingForData) {
+        decoder.mNeedDraining = true;
+      }
       NotifyEndOfStream(aTrack);
       break;
     case DemuxerFailureReason::DEMUXER_ERROR:
       NotifyError(aTrack);
       break;
     case DemuxerFailureReason::WAITING_FOR_DATA:
       if (!decoder.mWaitingForData) {
         decoder.mNeedDraining = true;
       }
       NotifyWaitingForData(aTrack);
       break;
-    case DemuxerFailureReason::CANCELED:
+    case DemuxerFailureReason::CANCELED: MOZ_FALLTHROUGH;
     case DemuxerFailureReason::SHUTDOWN:
       if (decoder.HasPromise()) {
         decoder.RejectPromise(CANCELED, __func__);
       }
       break;
     default:
       MOZ_ASSERT(false);
       break;
@@ -723,17 +726,16 @@ MediaFormatReader::NotifyWaitingForData(
 }
 
 void
 MediaFormatReader::NotifyEndOfStream(TrackType aTrack)
 {
   MOZ_ASSERT(OnTaskQueue());
   auto& decoder = GetDecoderData(aTrack);
   decoder.mDemuxEOS = true;
-  decoder.mNeedDraining = true;
   ScheduleUpdate(aTrack);
 }
 
 void
 MediaFormatReader::NotifyDecodingRequested(TrackType aTrack)
 {
   MOZ_ASSERT(OnTaskQueue());
   auto& decoder = GetDecoderData(aTrack);
@@ -1049,17 +1051,17 @@ MediaFormatReader::InternalSeek(TrackTyp
                       switch (aResult) {
                         case DemuxerFailureReason::WAITING_FOR_DATA:
                           self->NotifyWaitingForData(aTrack);
                           break;
                         case DemuxerFailureReason::END_OF_STREAM:
                           decoder.mTimeThreshold.reset();
                           self->NotifyEndOfStream(aTrack);
                           break;
-                        case DemuxerFailureReason::CANCELED:
+                        case DemuxerFailureReason::CANCELED: MOZ_FALLTHROUGH;
                         case DemuxerFailureReason::SHUTDOWN:
                           decoder.mTimeThreshold.reset();
                           break;
                         default:
                           decoder.mTimeThreshold.reset();
                           self->NotifyError(aTrack);
                           break;
                       }
@@ -1469,26 +1471,23 @@ void
 MediaFormatReader::OnVideoSkipFailed(MediaTrackDemuxer::SkipFailureHolder aFailure)
 {
   MOZ_ASSERT(OnTaskQueue());
   LOG("Skipping failed, skipped %u frames", aFailure.mSkipped);
   mSkipRequest.Complete();
 
   MOZ_ASSERT(mVideo.HasPromise());
   switch (aFailure.mFailure) {
-    case DemuxerFailureReason::END_OF_STREAM:
-      VideoSkipReset(aFailure.mSkipped);
-      NotifyEndOfStream(TrackType::kVideoTrack);
-      break;
+    case DemuxerFailureReason::END_OF_STREAM: MOZ_FALLTHROUGH;
     case DemuxerFailureReason::WAITING_FOR_DATA:
       // We can't complete the skip operation, will just service a video frame
       // normally.
       NotifyDecodingRequested(TrackInfo::kVideoTrack);
       break;
-    case DemuxerFailureReason::CANCELED:
+    case DemuxerFailureReason::CANCELED: MOZ_FALLTHROUGH;
     case DemuxerFailureReason::SHUTDOWN:
       if (mVideo.HasPromise()) {
         mVideo.RejectPromise(CANCELED, __func__);
       }
       break;
     default:
       NotifyError(TrackType::kVideoTrack);
       break;