Bug 1274933: Reject data promise when EOS is encountered following waiting for data. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Tue, 24 May 2016 19:58:36 +1000
changeset 370228 3dc3eb396a958483a621f723151fc06aa85c9515
parent 369998 191731f27b115e9fd89a47c9439a781ae4bea9ff
child 521704 43d6f00dd96dbbf3a5730c9a523349edd3c07641
push id19012
push userbmo:jyavenard@mozilla.com
push dateTue, 24 May 2016 10:07:52 +0000
reviewersgerald
bugs1274933
milestone49.0a1
Bug 1274933: Reject data promise when EOS is encountered following waiting for data. r?gerald MozReview-Commit-ID: 1hKplz5wFnJ
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1200,16 +1200,25 @@ MediaFormatReader::Update(TrackType aTra
       }
       // Now that draining has completed, we check if we have received
       // new data again as the result may now be different from the earlier
       // run.
       if (UpdateReceivedNewData(aTrack) || decoder.mSeekRequest.Exists()) {
         LOGV("Nothing more to do");
         return;
       }
+    } else if (decoder.mDemuxEOS && !decoder.mNeedDraining &&
+               !decoder.mDraining && !decoder.mDrainComplete &&
+               decoder.mQueuedSamples.IsEmpty()) {
+      // It is possible to transition from WAITING_FOR_DATA directly to EOS
+      // state during the internal seek; in which case no draining would occur.
+      // There is no more samples left to be decoded and we are already in
+      // EOS state. We can immediately reject the data promise.
+      LOG("Rejecting %s promise: EOS", TrackTypeToStr(aTrack));
+      decoder.RejectPromise(END_OF_STREAM, __func__);
     }
   }
 
   if (decoder.mNeedDraining) {
     DrainDecoder(aTrack);
     return;
   }