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
--- 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);
}