Bug 1270747: increase audio error count and flush decoder when DECODE_ERROR. r?jya draft
authorAlfredo Yang <ayang@mozilla.com>
Tue, 14 Jun 2016 12:28:20 +0100
changeset 377975 33f808348af28f1b10fff367842fd6b29de63bbc
parent 377839 fbc8f897e016fe44393bb2e3c064071598b8f586
child 523445 7d838df1118d8fc49ccb6f359f92d61cf7dff9be
push id20911
push userayang@mozilla.com
push dateTue, 14 Jun 2016 11:40:15 +0000
reviewersjya
bugs1270747
milestone50.0a1
Bug 1270747: increase audio error count and flush decoder when DECODE_ERROR. r?jya MozReview-Commit-ID: BBO2yjYHDJD
dom/media/MediaFormatReader.cpp
--- 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,