Bug 1363668: P3. Assert that no error can occur while an internal seek is pending. r?jwwang draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Fri, 12 May 2017 14:16:33 +0200
changeset 583602 c2b6f5d08be941b42f073cf6212d15064f58a732
parent 583601 a1ab1254f65aeeeb8c8074fafb34baff0e0c06f2
child 583603 e978268b114708cd0dc32801dcd92d35b622beb7
push id60463
push userbmo:jyavenard@mozilla.com
push dateWed, 24 May 2017 09:09:09 +0000
reviewersjwwang
bugs1363668
milestone55.0a1
Bug 1363668: P3. Assert that no error can occur while an internal seek is pending. r?jwwang An internal seek occurs when we've reached a data gap, EOS or a previous error got skipped. During this time, the decoder has been either flushed or shut down. MozReview-Commit-ID: 69OBaZz4ZNq
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -2341,16 +2341,18 @@ MediaFormatReader::Update(TrackType aTra
       || decoder.mDrainState == DrainState::PartialDrainPending) {
     if (decoder.mOutput.IsEmpty()) {
       DrainDecoder(aTrack);
     }
     return;
   }
 
   if (decoder.mError && !decoder.HasFatalError()) {
+    MOZ_RELEASE_ASSERT(!decoder.HasInternalSeekPending(),
+                       "No error can occur while an internal seek is pending");
     bool needsNewDecoder =
       decoder.mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER;
     if (!needsNewDecoder
         && ++decoder.mNumOfConsecutiveError > decoder.mMaxConsecutiveError) {
       NotifyError(aTrack, decoder.mError.ref());
       return;
     }
     decoder.mError.reset();
@@ -2365,19 +2367,19 @@ MediaFormatReader::Update(TrackType aTra
     if (decoder.mFirstFrameTime) {
       TimeInterval seekInterval = TimeInterval(decoder.mFirstFrameTime.ref(),
                                                 decoder.mFirstFrameTime.ref());
       InternalSeek(aTrack, InternalSeekTarget(seekInterval, false));
       return;
     }
 
     TimeUnit nextKeyframe;
-    if (aTrack == TrackType::kVideoTrack && !decoder.HasInternalSeekPending()
-        && NS_SUCCEEDED(
-             decoder.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe))) {
+    if (aTrack == TrackType::kVideoTrack &&
+        NS_SUCCEEDED(
+          decoder.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe))) {
       SkipVideoDemuxToNextKeyFrame(
         decoder.mLastDecodedSampleTime.refOr(TimeInterval()).Length());
     } else if (aTrack == TrackType::kAudioTrack) {
       decoder.Flush();
     } else {
       // We can't recover from this error.
       NotifyError(aTrack, NS_ERROR_DOM_MEDIA_FATAL_ERR);
     }