Bug 1270747: increase audio error count and flush decoder when DECODE_ERROR. r?jya
MozReview-Commit-ID: BBO2yjYHDJD
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -56,17 +56,17 @@ TrackTypeToStr(TrackInfo::TrackType aTra
}
MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder,
MediaDataDemuxer* aDemuxer,
VideoFrameContainer* aVideoFrameContainer,
layers::LayersBackend aLayersBackend)
: MediaDecoderReader(aDecoder)
, mAudio(this, MediaData::AUDIO_DATA, Preferences::GetUint("media.audio-decode-ahead", 2),
- Preferences::GetUint("media.audio-max-decode-error", 3))
+ Preferences::GetUint("media.audio-max-decode-error", 6))
, mVideo(this, MediaData::VIDEO_DATA, Preferences::GetUint("media.video-decode-ahead", 2),
Preferences::GetUint("media.video-max-decode-error", 2))
, mDemuxer(aDemuxer)
, mDemuxerInitDone(false)
, mLastReportedNumDecodedFrames(0)
, mLayersBackendType(aLayersBackend)
, mInitDone(false)
, mIsEncrypted(false)
@@ -1238,28 +1238,43 @@ MediaFormatReader::Update(TrackType aTra
if (decoder.mNeedDraining) {
DrainDecoder(aTrack);
return;
}
if (decoder.mError &&
decoder.mError.ref() == MediaDataDecoderError::DECODE_ERROR) {
- decoder.mError.reset();
+ Reset(aTrack);
if (++decoder.mNumOfConsecutiveError > decoder.mMaxConsecutiveError) {
NotifyError(aTrack);
return;
}
LOG("%s decoded error count %d", TrackTypeToStr(aTrack),
decoder.mNumOfConsecutiveError);
- media::TimeUnit nextKeyframe;
- if (aTrack == TrackType::kVideoTrack && !decoder.HasInternalSeekPending() &&
- NS_SUCCEEDED(decoder.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe))) {
+ TimeUnit nextKeyframe;
+ switch (aTrack) {
+ case TrackInfo::kVideoTrack:
+ if (NS_FAILED(decoder.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe))) {
+ NotifyError(aTrack);
+ return;
+ }
+ if (!nextKeyframe.IsValid() || nextKeyframe.IsInfinite()) {
+ NotifyError(aTrack);
+ return;
+ }
SkipVideoDemuxToNextKeyFrame(decoder.mLastSampleTime.refOr(TimeInterval()).Length());
return;
+ case TrackInfo::kAudioTrack:
+ NotifyDecodingRequested(TrackInfo::kAudioTrack);
+ return;
+ case TrackInfo::kTextTrack:
+ default:
+ NotifyError(aTrack);
+ return;
}
}
bool needInput = NeedInput(decoder);
LOGV("Update(%s) ni=%d no=%d ie=%d, in:%llu out:%llu qs=%u pending:%u waiting:%d ahead:%d sid:%u",
TrackTypeToStr(aTrack), needInput, needOutput, decoder.mInputExhausted,
decoder.mNumSamplesInput, decoder.mNumSamplesOutput,