Bug 1307699. Part 5 - move mSeekTask into SeekingState. draft
authorJW Wang <jwwang@mozilla.com>
Wed, 05 Oct 2016 14:59:24 +0800
changeset 421417 fb650453c4e5ef9fe8db28668efd90ff9a681c26
parent 421416 7f6379a6d3eb5084bd8802c4814768820cf2e323
child 421418 a78dc1d17678b585aa8db4d7bb2d5b466363d521
push id31488
push userjwwang@mozilla.com
push dateThu, 06 Oct 2016 02:31:05 +0000
bugs1307699
milestone52.0a1
Bug 1307699. Part 5 - move mSeekTask into SeekingState. MozReview-Commit-ID: AdVCoOPDG4F
dom/media/MediaDecoderStateMachine.cpp
dom/media/MediaDecoderStateMachine.h
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -672,21 +672,21 @@ public:
   void Enter() override
   {
     // SeekTask will register its callbacks to MediaDecoderReaderWrapper.
     mMaster->CancelMediaDecoderReaderWrapperCallback();
 
     // Create a new SeekTask instance for the incoming seek task.
     if (mSeekJob.mTarget.IsAccurate() ||
         mSeekJob.mTarget.IsFast()) {
-      mMaster->mSeekTask = new AccurateSeekTask(
+      mSeekTask = new AccurateSeekTask(
         mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
         mMaster->mInfo, mMaster->Duration(), mMaster->GetMediaTime());
     } else if (mSeekJob.mTarget.IsNextFrame()) {
-      mMaster->mSeekTask = new NextFrameSeekTask(
+      mSeekTask = new NextFrameSeekTask(
         mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
         mMaster->mInfo, mMaster->Duration(),mMaster->GetMediaTime(),
         mMaster->AudioQueue(), mMaster->VideoQueue());
     } else {
       MOZ_DIAGNOSTIC_ASSERT(false, "Cannot handle this seek task.");
     }
 
     // Don't stop playback for a video-only seek since audio is playing.
@@ -694,34 +694,34 @@ public:
       mMaster->StopPlayback();
     }
 
     // mSeekJob.mTarget.mTime might be different from
     // mSeekTask->GetSeekTarget().mTime because the seek task might clamp the
     // seek target to [0, duration]. We want to update the playback position to
     // the clamped value.
     mMaster->UpdatePlaybackPositionInternal(
-      mMaster->mSeekTask->GetSeekTarget().GetTime().ToMicroseconds());
+      mSeekTask->GetSeekTarget().GetTime().ToMicroseconds());
 
     if (mSeekJob.mTarget.mEventVisibility ==
         MediaDecoderEventVisibility::Observable) {
       mMaster->mOnPlaybackEvent.Notify(MediaEventType::SeekStarted);
     }
 
     // Reset our state machine and decoding pipeline before seeking.
-    if (mMaster->mSeekTask->NeedToResetMDSM()) {
+    if (mSeekTask->NeedToResetMDSM()) {
       if (mSeekJob.mTarget.IsVideoOnly()) {
         mMaster->Reset(TrackInfo::kVideoTrack);
       } else {
         mMaster->Reset();
       }
     }
 
     // Do the seek.
-    mSeekTaskRequest.Begin(mMaster->mSeekTask->Seek(mMaster->Duration())
+    mSeekTaskRequest.Begin(mSeekTask->Seek(mMaster->Duration())
       ->Then(OwnerThread(), __func__,
              [this] (const SeekTaskResolveValue& aValue) {
                OnSeekTaskResolved(aValue);
              },
              [this] (const SeekTaskRejectValue& aValue) {
                OnSeekTaskRejected(aValue);
              }));
 
@@ -729,20 +729,20 @@ public:
     MOZ_ASSERT(!mMaster->mCurrentSeek.Exists());
     mMaster->mCurrentSeek = Move(mSeekJob);
   }
 
   void Exit() override
   {
     mSeekTaskRequest.DisconnectIfExists();
 
-    if (mMaster->mSeekTask) {
+    if (mSeekTask) {
       mMaster->mCurrentSeek.RejectIfExists(__func__);
-      mMaster->mSeekTask->Discard();
-      mMaster->mSeekTask = nullptr;
+      mSeekTask->Discard();
+      mSeekTask = nullptr;
 
       // Reset the MediaDecoderReaderWrapper's callbask.
       mMaster->SetMediaDecoderReaderWrapperCallback();
     }
   }
 
   State GetState() const override
   {
@@ -832,17 +832,17 @@ private:
       mMaster->VideoQueue().Finish();
     }
 
     mMaster->DecodeError(aValue.mError);
   }
 
   void SeekCompleted()
   {
-    int64_t seekTime = mMaster->mSeekTask->GetSeekTarget().GetTime().ToMicroseconds();
+    int64_t seekTime = mSeekTask->GetSeekTarget().GetTime().ToMicroseconds();
     int64_t newCurrentTime = seekTime;
 
     // Setup timestamp state.
     RefPtr<MediaData> video = mMaster->VideoQueue().PeekFront();
     if (seekTime == mMaster->Duration().ToMicroseconds()) {
       newCurrentTime = seekTime;
     } else if (mMaster->HasAudio()) {
       RefPtr<MediaData> audio = mMaster->AudioQueue().PeekFront();
@@ -906,16 +906,17 @@ private:
       mMaster->mOnPlaybackEvent.Notify(MediaEventType::Invalidate);
     }
 
     SetState(nextState);
   }
 
   SeekJob mSeekJob;
   MozPromiseRequestHolder<SeekTask::SeekTaskPromise> mSeekTaskRequest;
+  RefPtr<SeekTask> mSeekTask;
 };
 
 class MediaDecoderStateMachine::BufferingState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit BufferingState(Master* aPtr) : StateObject(aPtr) {}
 
@@ -2137,17 +2138,17 @@ void MediaDecoderStateMachine::Visibilit
     mReader->SetVideoBlankDecode(false);
 
     if (mIsReaderSuspended) {
       return;
     }
 
     // If an existing seek is in flight don't bother creating a new
     // one to catch up.
-    if (mSeekTask || mQueuedSeek.Exists()) {
+    if (mState == DECODER_STATE_SEEKING || mQueuedSeek.Exists()) {
       return;
     }
 
     // Start counting recovery time from right now.
     TimeStamp start = TimeStamp::Now();
     // Local reference to mInfo, so that it will be copied in the lambda below.
     MediaInfo& info = mInfo;
     bool hw = mReader->VideoIsHardwareAccelerated();
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -614,19 +614,16 @@ private:
     return mPlayState == MediaDecoder::PLAY_STATE_PLAYING ||
            mNextPlayState == MediaDecoder::PLAY_STATE_PLAYING;
   }
 
   // Queued seek - moves to mCurrentSeek when DecodeFirstFrame completes.
   SeekJob mQueuedSeek;
   SeekJob mCurrentSeek;
 
-  // mSeekTask is responsible for executing the current seek request.
-  RefPtr<SeekTask> mSeekTask;
-
   // Media Fragment end time in microseconds. Access controlled by decoder monitor.
   int64_t mFragmentEndTime;
 
   // The media sink resource.  Used on the state machine thread.
   RefPtr<media::MediaSink> mMediaSink;
 
   const RefPtr<MediaDecoderReaderWrapper> mReader;