Bug 1322800 part 12 - move all SeekingState data members; r?jwwang draft
authorKaku Kuo <kaku@mozilla.com>
Wed, 14 Dec 2016 16:27:03 +0800
changeset 450340 5d222dd4abb4382bc06e036b66e8cbce92982477
parent 450339 337900aa0f40f68ceb495f4775b4fce358243133
child 450341 1b38e6931e5c8f6acbb11dd348beddf373bc7d11
push id38836
push userbmo:kaku@mozilla.com
push dateFri, 16 Dec 2016 10:40:27 +0000
reviewersjwwang
bugs1322800
milestone53.0a1
Bug 1322800 part 12 - move all SeekingState data members; r?jwwang MozReview-Commit-ID: BL4vUw3zErL
dom/media/MediaDecoderStateMachine.cpp
dom/media/NextFrameSeekTask.cpp
dom/media/NextFrameSeekTask.h
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1362,32 +1362,35 @@ public:
   {
     MOZ_ASSERT(aSeekJob.mTarget.IsNextFrame());
     return SeekingState::Enter(Move(aSeekJob), aVisibility);
   }
 
 private:
   void CreateSeekTask() override
   {
+    mCurrentTime = mMaster->GetMediaTime();
+    mDuration = mMaster->Duration();
+
     mSeekTask = new NextFrameSeekTask(
       mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
       Info(), mMaster->Duration(),mMaster->GetMediaTime(),
       AudioQueue(), VideoQueue());
 
     mTask = static_cast<NextFrameSeekTask*>(mSeekTask.get());
   }
 
   void ResetMDSM() override
   {
     // Do nothing.
   }
 
   void DoSeek() override
   {
-    auto currentTime = mTask->mCurrentTime;
+    auto currentTime = mCurrentTime;
     DiscardFrames(VideoQueue(), [currentTime] (int64_t aSampleTime) {
       return aSampleTime <= currentTime;
     });
 
     mSeekTaskRequest.Begin(mSeekTask->Seek(mMaster->Duration())
       ->Then(OwnerThread(), __func__,
              [this] (const SeekTaskResolveValue& aValue) {
                OnSeekTaskResolved(aValue);
@@ -1408,33 +1411,33 @@ private:
     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;
+    mSeekedAudioData = aAudio;
 
     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 (aVideo->mTime > mCurrentTime) {
+      mSeekedVideoData = aVideo;
     }
 
     if (NeedMoreVideo()) {
       RequestVideoData();
       return;
     }
 
     MaybeFinishSeek();
@@ -1458,17 +1461,17 @@ private:
     }
     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;
+        mIsVideoQueueFinished = true;
       }
 
       // Video seek not finished.
       if (NeedMoreVideo()) {
         switch (aError.Code()) {
           case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
             Reader()->WaitForData(MediaData::VIDEO_DATA);
             break;
@@ -1594,19 +1597,19 @@ private:
   {
     Reader()->RequestVideoData(false, media::TimeUnit());
   }
 
   bool NeedMoreVideo() const
   {
     // Need to request video when we have none and video queue is not finished.
     return VideoQueue().GetSize() == 0 &&
-           !mTask->mSeekedVideoData &&
+           !mSeekedVideoData &&
            !VideoQueue().IsFinished() &&
-           !mTask->mIsVideoQueueFinished;
+           !mIsVideoQueueFinished;
   }
 
   bool IsVideoRequestPending() const
   {
     return Reader()->IsRequestingVideoData() || Reader()->IsWaitingVideoData();
   }
 
   bool IsAudioSeekComplete() const
@@ -1625,20 +1628,20 @@ private:
 
   // Update the seek target's time before resolving this seek task, the updated
   // time will be used in the MDSM::SeekCompleted() to update the MDSM's position.
   void UpdateSeekTargetTime()
   {
     RefPtr<MediaData> data = VideoQueue().PeekFront();
     if (data) {
       mSeekJob.mTarget.SetTime(TimeUnit::FromMicroseconds(data->mTime));
-    } else if (mTask->mSeekedVideoData) {
-      mSeekJob.mTarget.SetTime(TimeUnit::FromMicroseconds(mTask->mSeekedVideoData->mTime));
-    } else if (mTask->mIsVideoQueueFinished || VideoQueue().AtEndOfStream()) {
-      mSeekJob.mTarget.SetTime(mTask->mDuration);
+    } else if (mSeekedVideoData) {
+      mSeekJob.mTarget.SetTime(TimeUnit::FromMicroseconds(mSeekedVideoData->mTime));
+    } else if (mIsVideoQueueFinished || VideoQueue().AtEndOfStream()) {
+      mSeekJob.mTarget.SetTime(mDuration);
     } else {
       MOZ_ASSERT(false, "No data!");
     }
   }
 
   void MaybeFinishSeek()
   {
     if (IsAudioSeekComplete() && IsVideoSeekComplete()) {
@@ -1648,16 +1651,30 @@ private:
       DiscardFrames(AudioQueue(), [time] (int64_t aSampleTime) {
         return aSampleTime < time;
       });
 
       mTask->Resolve(__func__); // Call to MDSM::SeekCompleted();
     }
   }
 
+  /*
+   * Internal state.
+   */
+  int64_t mCurrentTime;
+  media::TimeUnit mDuration;
+
+  /*
+   * Information which are going to be returned to MDSM.
+   */
+  RefPtr<MediaData> mSeekedAudioData;
+  RefPtr<MediaData> mSeekedVideoData;
+  bool mIsAudioQueueFinished = false;
+  bool mIsVideoQueueFinished = false;
+
   // For refactoring only, will be removed later.
   RefPtr<NextFrameSeekTask> mTask;
 
 };
 
 /**
  * Purpose: stop playback until enough data is decoded to continue playback.
  *
--- a/dom/media/NextFrameSeekTask.cpp
+++ b/dom/media/NextFrameSeekTask.cpp
@@ -24,18 +24,16 @@ NextFrameSeekTask::NextFrameSeekTask(con
                                      MediaDecoderReaderWrapper* aReader,
                                      const SeekTarget& aTarget,
                                      const MediaInfo& aInfo,
                                      const media::TimeUnit& aDuration,
                                      int64_t aCurrentTime,
                                      MediaQueue<MediaData>& aAudioQueue,
                                      MediaQueue<MediaData>& aVideoQueue)
   : SeekTask(aDecoderID, aThread, aReader, aTarget)
-  , mCurrentTime(aCurrentTime)
-  , mDuration(aDuration)
 {
   AssertOwnerThread();
   MOZ_ASSERT(aInfo.HasVideo());
 }
 
 NextFrameSeekTask::~NextFrameSeekTask()
 {
   AssertOwnerThread();
--- a/dom/media/NextFrameSeekTask.h
+++ b/dom/media/NextFrameSeekTask.h
@@ -48,20 +48,14 @@ public:
 
   void HandleAudioWaited(MediaData::Type aType) override;
 
   void HandleVideoWaited(MediaData::Type aType) override;
 
   void HandleNotWaited(const WaitForDataRejectValue& aRejection) override;
 
   ~NextFrameSeekTask();
-
-  /*
-   * Internal state.
-   */
-  const int64_t mCurrentTime;
-  media::TimeUnit mDuration;
 };
 
 } // namespace media
 } // namespace mozilla
 
 #endif /* NEXTFRAME_SEEK_TASK_H */