Bug 1367701 P1 - add a virtual Transit() method; r?jwwang draft
authorKaku Kuo <kaku@mozilla.com>
Thu, 25 May 2017 15:02:34 +0800
changeset 584344 1b4968125d4a11514e5ba5db0840f06385d239a4
parent 584343 a92adcc3f5afd50f83eca34257151722f4d26ef1
child 584345 c1ba7088e3a018cc14d6c2ed885dca7e5a2c6270
push id60698
push userbmo:kaku@mozilla.com
push dateThu, 25 May 2017 09:22:08 +0000
reviewersjwwang
bugs1367701
milestone55.0a1
Bug 1367701 P1 - add a virtual Transit() method; r?jwwang MozReview-Commit-ID: L0HnYfTdL57
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1020,16 +1020,17 @@ public:
     // We set mVideoDecodeSuspended to false in Enter().
     MOZ_ASSERT(false, "Shouldn't have suspended video decoding.");
   }
 
 protected:
   SeekJob mSeekJob;
 
   virtual void DoSeek() = 0;
+  virtual void Transit() { SetState<DecodingState>(); }
   void SeekCompleted();
   virtual TimeUnit CalculateNewCurrentTime() const = 0;
 };
 
 class MediaDecoderStateMachine::AccurateSeekingState
   : public MediaDecoderStateMachine::SeekingState
 {
 public:
@@ -1756,16 +1757,18 @@ public:
     mAccurateSeekRequest.DisconnectIfExists();
     mFutureSeekJob.RejectIfExists(__func__);
     AccurateSeekingState::Exit();
   }
 
 private:
   MozPromiseRequestHolder<MediaDecoder::SeekPromise> mAccurateSeekRequest;
   SeekJob mFutureSeekJob;
+
+  void Transit() override { // No transition after seek completed. }
 };
 
 RefPtr<MediaDecoder::SeekPromise>
 MediaDecoderStateMachine::DormantState::HandleSeek(SeekTarget aTarget)
 {
   if (aTarget.IsNextFrame()) {
     // NextFrameSeekingState doesn't reset the decoder unlike
     // AccurateSeekingState. So we first must come out of dormant by seeking to
@@ -2530,19 +2533,17 @@ SeekingState::SeekCompleted()
   SLOG("Seek completed, mCurrentPosition=%" PRId64,
        mMaster->mCurrentPosition.Ref().ToMicroseconds());
 
   if (mMaster->VideoQueue().PeekFront()) {
     mMaster->mMediaSink->Redraw(Info().mVideo);
     mMaster->mOnPlaybackEvent.Notify(MediaEventType::Invalidate);
   }
 
-  if (mSeekJob.mTransition) {
-    SetState<DecodingState>();
-  }
+  Transit();
 }
 
 void
 MediaDecoderStateMachine::
 BufferingState::DispatchDecodeTasksIfNeeded()
 {
   if (mMaster->IsAudioDecoding()
       && !mMaster->HaveEnoughDecodedAudio()