Bug 1322800 part 3 - move NextFrameSeekTask::Handle{Audio,Video,Not}{Decoded,Waited}(); r?jwwang draft
authorKaku Kuo <kaku@mozilla.com>
Wed, 14 Dec 2016 14:51:17 +0800
changeset 450258 1e6c181cc659c8a1aa7871427365a55fdd6589db
parent 450257 b1452ec4c110156f519e964e15cc84bbfb07ecd7
child 450259 3f6d8fe1b3e88b844488c9c325cbf20b42869120
push id38817
push userbmo:kaku@mozilla.com
push dateFri, 16 Dec 2016 08:40:33 +0000
reviewersjwwang
bugs1322800
milestone53.0a1
Bug 1322800 part 3 - move NextFrameSeekTask::Handle{Audio,Video,Not}{Decoded,Waited}(); r?jwwang MozReview-Commit-ID: 4AaVfc3avOP
dom/media/MediaDecoderStateMachine.cpp
dom/media/NextFrameSeekTask.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1397,16 +1397,155 @@ private:
              }));
 
     if (!mTask->IsVideoRequestPending() && mTask->NeedMoreVideo()) {
       mTask->RequestVideoData();
     }
     mTask->MaybeFinishSeek(); // Might resolve mSeekTaskPromise and modify audio queue.
   }
 
+  void HandleAudioDecoded(MediaData* aAudio) override
+  {
+    MOZ_ASSERT(aAudio);
+    MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+    // The MDSM::mDecodedAudioEndTime will be updated once the whole SeekTask is
+    // resolved.
+
+    SSAMPLELOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
+
+    // We accept any audio data here.
+    mTask->mSeekedAudioData = aAudio;
+
+    mTask->MaybeFinishSeek();
+  }
+
+  void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
+  {
+    MOZ_ASSERT(aVideo);
+    MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+    // The MDSM::mDecodedVideoEndTime will be updated once the whole SeekTask is
+    // resolved.
+
+    SSAMPLELOG("OnVideoDecoded [%lld,%lld]", aVideo->mTime, aVideo->GetEndTime());
+
+    if (aVideo->mTime > mTask->mCurrentTime) {
+      mTask->mSeekedVideoData = aVideo;
+    }
+
+    if (mTask->NeedMoreVideo()) {
+      mTask->RequestVideoData();
+      return;
+    }
+
+    mTask->MaybeFinishSeek();
+  }
+
+  void HandleNotDecoded(MediaData::Type aType, const MediaResult& aError) override
+  {
+    switch (aType) {
+    case MediaData::AUDIO_DATA:
+    {
+      MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+      SSAMPLELOG("OnAudioNotDecoded (aError=%u)", aError.Code());
+
+      // We don't really handle audio deocde error here. Let MDSM to trigger further
+      // audio decoding tasks if it needs to play audio, and MDSM will then receive
+      // the decoding state from MediaDecoderReader.
+
+      mTask->MaybeFinishSeek();
+      break;
+    }
+    case MediaData::VIDEO_DATA:
+    {
+      MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+      SSAMPLELOG("OnVideoNotDecoded (aError=%u)", aError.Code());
+
+      if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+        mTask->mIsVideoQueueFinished = true;
+      }
+
+      // Video seek not finished.
+      if (mTask->NeedMoreVideo()) {
+        switch (aError.Code()) {
+          case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+            Reader()->WaitForData(MediaData::VIDEO_DATA);
+            break;
+          case NS_ERROR_DOM_MEDIA_CANCELED:
+            mTask->RequestVideoData();
+            break;
+          case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+            MOZ_ASSERT(false, "Shouldn't want more data for ended video.");
+            break;
+          default:
+            // Reject the promise since we can't finish video seek anyway.
+            mTask->RejectIfExist(aError, __func__);
+            break;
+        }
+        return;
+      }
+
+      mTask->MaybeFinishSeek();
+      break;
+    }
+    default:
+      MOZ_ASSERT_UNREACHABLE("We cannot handle RAW_DATA or NULL_DATA here.");
+    }
+  }
+
+  void HandleAudioWaited(MediaData::Type aType) override
+  {
+    MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+    // We don't make an audio decode request here, instead, let MDSM to
+    // trigger further audio decode tasks if MDSM itself needs to play audio.
+    mTask->MaybeFinishSeek();
+  }
+
+  void HandleVideoWaited(MediaData::Type aType) override
+  {
+    MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+    if (mTask->NeedMoreVideo()) {
+      mTask->RequestVideoData();
+      return;
+    }
+    mTask->MaybeFinishSeek();
+  }
+
+  void HandleNotWaited(const WaitForDataRejectValue& aRejection) override
+  {
+    MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
+
+    switch(aRejection.mType) {
+    case MediaData::AUDIO_DATA:
+    {
+      // We don't make an audio decode request here, instead, let MDSM to
+      // trigger further audio decode tasks if MDSM itself needs to play audio.
+      mTask->MaybeFinishSeek();
+      break;
+    }
+    case MediaData::VIDEO_DATA:
+    {
+      if (mTask->NeedMoreVideo()) {
+        // Reject if we can't finish video seeking.
+        mTask->RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+        return;
+      }
+      mTask->MaybeFinishSeek();
+      break;
+    }
+    default:
+      MOZ_ASSERT_UNREACHABLE("We cannot handle RAW_DATA or NULL_DATA here.");
+    }
+  }
+
   int64_t CalculateNewCurrentTime() const override
   {
     // The HTMLMediaElement.currentTime should be updated to the seek target
     // which has been updated to the next frame's time.
     return mTask->mTarget.GetTime().ToMicroseconds();
   }
 
   void OnSeekTaskResolved(const SeekTaskResolveValue& aValue)
--- a/dom/media/NextFrameSeekTask.cpp
+++ b/dom/media/NextFrameSeekTask.cpp
@@ -60,159 +60,41 @@ NextFrameSeekTask::CalculateNewCurrentTi
 {
   AssertOwnerThread();
   return 0;
 }
 
 void
 NextFrameSeekTask::HandleAudioDecoded(MediaData* aAudio)
 {
-  AssertOwnerThread();
-  MOZ_ASSERT(aAudio);
-  MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
-
-  // The MDSM::mDecodedAudioEndTime will be updated once the whole SeekTask is
-  // resolved.
-
-  SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
-
-  // We accept any audio data here.
-  mSeekedAudioData = aAudio;
-
-  MaybeFinishSeek();
 }
 
 void
 NextFrameSeekTask::HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart)
 {
-  AssertOwnerThread();
-  MOZ_ASSERT(aVideo);
-  MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
-
-  // The MDSM::mDecodedVideoEndTime will be updated once the whole SeekTask is
-  // resolved.
-
-  SAMPLE_LOG("OnVideoDecoded [%lld,%lld]", aVideo->mTime, aVideo->GetEndTime());
-
-  if (aVideo->mTime > mCurrentTime) {
-    mSeekedVideoData = aVideo;
-  }
-
-  if (NeedMoreVideo()) {
-    RequestVideoData();
-    return;
-  }
-
-  MaybeFinishSeek();
 }
 
 void
 NextFrameSeekTask::HandleNotDecoded(MediaData::Type aType, const MediaResult& aError)
 {
-  AssertOwnerThread();
-  switch (aType) {
-  case MediaData::AUDIO_DATA:
-  {
-    MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
-
-    SAMPLE_LOG("OnAudioNotDecoded (aError=%u)", aError.Code());
-
-    // We don't really handle audio deocde error here. Let MDSM to trigger further
-    // audio decoding tasks if it needs to play audio, and MDSM will then receive
-    // the decoding state from MediaDecoderReader.
-
-    MaybeFinishSeek();
-    break;
-  }
-  case MediaData::VIDEO_DATA:
-  {
-    MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
-
-    SAMPLE_LOG("OnVideoNotDecoded (aError=%u)", aError.Code());
-
-    if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
-      mIsVideoQueueFinished = true;
-    }
-
-    // Video seek not finished.
-    if (NeedMoreVideo()) {
-      switch (aError.Code()) {
-        case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
-          mReader->WaitForData(MediaData::VIDEO_DATA);
-          break;
-        case NS_ERROR_DOM_MEDIA_CANCELED:
-          RequestVideoData();
-          break;
-        case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
-          MOZ_ASSERT(false, "Shouldn't want more data for ended video.");
-          break;
-        default:
-          // Reject the promise since we can't finish video seek anyway.
-          RejectIfExist(aError, __func__);
-          break;
-      }
-      return;
-    }
-
-    MaybeFinishSeek();
-    break;
-  }
-  default:
-    MOZ_ASSERT_UNREACHABLE("We cannot handle RAW_DATA or NULL_DATA here.");
-  }
 }
 
 void
 NextFrameSeekTask::HandleAudioWaited(MediaData::Type aType)
 {
-  AssertOwnerThread();
-
-  // We don't make an audio decode request here, instead, let MDSM to
-  // trigger further audio decode tasks if MDSM itself needs to play audio.
-  MaybeFinishSeek();
 }
 
 void
 NextFrameSeekTask::HandleVideoWaited(MediaData::Type aType)
 {
-  AssertOwnerThread();
-
-  if (NeedMoreVideo()) {
-    RequestVideoData();
-    return;
-  }
-  MaybeFinishSeek();
 }
 
 void
 NextFrameSeekTask::HandleNotWaited(const WaitForDataRejectValue& aRejection)
 {
-  AssertOwnerThread();
-
-  switch(aRejection.mType) {
-  case MediaData::AUDIO_DATA:
-  {
-    // We don't make an audio decode request here, instead, let MDSM to
-    // trigger further audio decode tasks if MDSM itself needs to play audio.
-    MaybeFinishSeek();
-    break;
-  }
-  case MediaData::VIDEO_DATA:
-  {
-    if (NeedMoreVideo()) {
-      // Reject if we can't finish video seeking.
-      RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
-      return;
-    }
-    MaybeFinishSeek();
-    break;
-  }
-  default:
-    MOZ_ASSERT_UNREACHABLE("We cannot handle RAW_DATA or NULL_DATA here.");
-  }
 }
 
 /*
  * Remove samples from the queue until aCompare() returns false.
  * aCompare A function object with the signature bool(int64_t) which returns
  *          true for samples that should be removed.
  */
 template <typename Function> static void