Bug 1363668: P2. Don't attempt to continue decoding if no next keyframe. r?jwwang
When we have no future keyframe and an error occurred. We can't skip over anything and we shouldn't try to simply decode the next video frame. So we abort early.
MozReview-Commit-ID: F4IIeZCr2Cp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -2351,17 +2351,17 @@ MediaFormatReader::Update(TrackType aTra
if (!needsNewDecoder
&& ++decoder.mNumOfConsecutiveError > decoder.mMaxConsecutiveError) {
NotifyError(aTrack, decoder.mError.ref());
return;
}
decoder.mError.reset();
LOG("%s decoded error count %d", TrackTypeToStr(aTrack),
- decoder.mNumOfConsecutiveError);
+ decoder.mNumOfConsecutiveError);
if (needsNewDecoder) {
LOG("Error: Need new decoder");
ShutdownDecoder(aTrack);
}
if (decoder.mFirstFrameTime) {
TimeInterval seekInterval = TimeInterval(decoder.mFirstFrameTime.ref(),
decoder.mFirstFrameTime.ref());
@@ -2372,16 +2372,19 @@ MediaFormatReader::Update(TrackType aTra
TimeUnit nextKeyframe;
if (aTrack == TrackType::kVideoTrack && !decoder.HasInternalSeekPending()
&& 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);
}
return;
}
bool needInput = NeedInput(decoder);
LOGV(
"Update(%s) ni=%d no=%d in:%" PRIu64 " out:%" PRIu64