Bug 1285248. Part 2 - fix logic for video-only seek. draft
authorJW Wang <jwwang@mozilla.com>
Fri, 08 Jul 2016 11:52:40 +0800 (2016-07-08)
changeset 385372 7b9d361a700e020130254e523e272bf8c012527c
parent 385365 f17e5e969bcbca286d24f96da60c2db2dd161766
child 524917 e34440ecb706301ec5b591be0098400c1350c79d
push id22491
push userjwwang@mozilla.com
push dateFri, 08 Jul 2016 08:30:03 +0000 (2016-07-08)
bugs1285248
milestone50.0a1
Bug 1285248. Part 2 - fix logic for video-only seek. MozReview-Commit-ID: lopt6zxC5f
dom/media/AccurateSeekTask.cpp
--- a/dom/media/AccurateSeekTask.cpp
+++ b/dom/media/AccurateSeekTask.cpp
@@ -304,16 +304,24 @@ AccurateSeekTask::OnAudioDecoded(MediaDa
   MOZ_ASSERT(audio);
 
   // The MDSM::mDecodedAudioEndTime will be updated once the whole SeekTask is
   // resolved.
 
   SAMPLE_LOG("OnAudioDecoded [%lld,%lld] disc=%d",
     audio->mTime, audio->GetEndTime(), audio->mDiscontinuity);
 
+  // Video-only seek doesn't reset audio decoder. There might be pending audio
+  // requests when AccurateSeekTask::Seek() begins. We will just store the data
+  // without checking |mDiscontinuity| or calling DropAudioUpToSeekTarget().
+  if (mSeekJob.mTarget.IsVideoOnly()) {
+    mSeekedAudioData = audio.forget();
+    return;
+  }
+
   if (mFirstAudioSample) {
     mFirstAudioSample = false;
     MOZ_ASSERT(audio->mDiscontinuity);
   }
 
   AdjustFastSeekIfNeeded(audio);
 
   if (mSeekJob.mTarget.IsFast()) {
@@ -336,16 +344,21 @@ void
 AccurateSeekTask::OnNotDecoded(MediaData::Type aType,
                                MediaDecoderReader::NotDecodedReason aReason)
 {
   AssertOwnerThread();
   MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
 
   SAMPLE_LOG("OnNotDecoded type=%d reason=%u", aType, aReason);
 
+  // Ignore pending requests from video-only seek.
+  if (aType == MediaData::AUDIO_DATA && mSeekJob.mTarget.IsVideoOnly()) {
+    return;
+  }
+
   if (aReason == MediaDecoderReader::DECODE_ERROR) {
     // If this is a decode error, delegate to the generic error path.
     RejectIfExist(__func__);
     return;
   }
 
   // If the decoder is waiting for data, we tell it to call us back when the
   // data arrives.
@@ -441,16 +454,20 @@ AccurateSeekTask::SetCallbacks()
     } else {
       OnNotDecoded(MediaData::VIDEO_DATA,
         aData.as<MediaDecoderReader::NotDecodedReason>());
     }
   });
 
   mAudioWaitCallback = mReader->AudioWaitCallback().Connect(
     OwnerThread(), [this] (WaitCallbackData aData) {
+    // Ignore pending requests from video-only seek.
+    if (mSeekJob.mTarget.IsVideoOnly()) {
+      return;
+    }
     if (aData.is<MediaData::Type>()) {
       RequestAudioData();
     }
   });
 
   mVideoWaitCallback = mReader->VideoWaitCallback().Connect(
     OwnerThread(), [this] (WaitCallbackData aData) {
     if (aData.is<MediaData::Type>()) {