Bug 1272422 - Part 3: Don't reset audio queue. r?jya draft
authorDan Glastonbury <dglastonbury@mozilla.com>
Fri, 13 May 2016 11:14:12 +1000
changeset 366644 fcc200a2e6e07fd3bf5e4fc658474aaeeb3a0818
parent 366637 d2317f06faee9c8c74122aee79f08e1d6bc1bade
child 520820 ba83254c90d4ea19a47d2088bbe7571eda21acb1
push id18036
push userbmo:dglastonbury@mozilla.com
push dateFri, 13 May 2016 02:40:06 +0000
reviewersjya
bugs1272422
milestone49.0a1
Bug 1272422 - Part 3: Don't reset audio queue. r?jya When resuming from suspended video, don't reset the audio queues or audio demuxing state in MFR. Extracted the code from ResetDemuxers() and inlined it at calling sites as recommended by jya. MozReview-Commit-ID: 3wpH075RrKW
dom/media/MediaFormatReader.cpp
dom/media/MediaFormatReader.h
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1293,48 +1293,37 @@ MediaFormatReader::ResetDecode(TargetQue
 
   // Do the same for any data wait promises.
   mAudio.mWaitingPromise.RejectIfExists(WaitForDataRejectValue(MediaData::AUDIO_DATA, WaitForDataRejectValue::CANCELED), __func__);
   mVideo.mWaitingPromise.RejectIfExists(WaitForDataRejectValue(MediaData::VIDEO_DATA, WaitForDataRejectValue::CANCELED), __func__);
 
   // Reset miscellaneous seeking state.
   mPendingSeekTime.reset();
 
-  ResetDemuxers();
-
   if (HasVideo()) {
+    mVideo.ResetDemuxer();
+    mVideo.ResetState();
     Reset(TrackInfo::kVideoTrack);
     if (mVideo.HasPromise()) {
       mVideo.RejectPromise(CANCELED, __func__);
     }
   }
 
   if (HasAudio() && aQueues == AUDIO_VIDEO) {
+    mAudio.ResetDemuxer();
+    mAudio.ResetState();
     Reset(TrackInfo::kAudioTrack);
     if (mAudio.HasPromise()) {
       mAudio.RejectPromise(CANCELED, __func__);
     }
   }
   return MediaDecoderReader::ResetDecode(aQueues);
 }
 
 void
-MediaFormatReader::ResetDemuxers()
-{
-  if (HasVideo()) {
-    mVideo.ResetDemuxer();
-    mVideo.ResetState();
-  }
-  if (HasAudio()) {
-    mAudio.ResetDemuxer();
-    mAudio.ResetState();
-  }
-}
-
-void
 MediaFormatReader::Output(TrackType aTrack, MediaData* aSample)
 {
   LOGV("Decoded %s sample time=%lld timecode=%lld kf=%d dur=%lld",
        TrackTypeToStr(aTrack), aSample->mTime, aSample->mTimecode,
        aSample->mKeyframe, aSample->mDuration);
 
   if (!aSample) {
     NS_WARNING("MediaFormatReader::Output() passed a null sample");
@@ -1527,17 +1516,30 @@ MediaFormatReader::AttemptSeek()
 {
   MOZ_ASSERT(OnTaskQueue());
 
   mSeekScheduled = false;
 
   if (mPendingSeekTime.isNothing()) {
     return;
   }
-  ResetDemuxers();
+
+  if (HasVideo()) {
+    mVideo.ResetDemuxer();
+    mVideo.ResetState();
+  }
+
+  // Don't reset the audio demuxer not state when seeking video only
+  // as it will cause the audio to seek back to the beginning
+  // resulting in out-of-sync audio from video.
+  if (HasAudio() && !mOriginalSeekTarget->IsVideoOnly()) {
+    mAudio.ResetDemuxer();
+    mAudio.ResetState();
+  }
+
   if (HasVideo()) {
     DoVideoSeek();
   } else if (HasAudio()) {
     DoAudioSeek();
   } else {
     MOZ_CRASH();
   }
 }
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -169,17 +169,16 @@ private:
   // functions.
   void Output(TrackType aType, MediaData* aSample);
   void InputExhausted(TrackType aTrack);
   void Error(TrackType aTrack);
   void Reset(TrackType aTrack);
   void DrainComplete(TrackType aTrack);
 
   bool ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold);
-  void ResetDemuxers();
 
   size_t SizeOfQueue(TrackType aTrack);
 
   RefPtr<PDMFactory> mPlatform;
 
   class DecoderCallback : public MediaDataDecoderCallback {
   public:
     DecoderCallback(MediaFormatReader* aReader, TrackType aType)