Bug 1311872. Part 4 - exit dormant in response to user actions. draft
authorJW Wang <jwwang@mozilla.com>
Fri, 21 Oct 2016 15:52:17 +0800
changeset 433057 99d074cd5cfbeaeacdfac4fc1950f84bd0c54214
parent 433056 b50a257dcdfac102c06add85c0eb1cbc5c33d704
child 433058 531e8540f356d95e96795b762f81b04f660473d6
push id34470
push userjwwang@mozilla.com
push dateThu, 03 Nov 2016 03:05:34 +0000
bugs1311872
milestone52.0a1
Bug 1311872. Part 4 - exit dormant in response to user actions. MozReview-Commit-ID: CTXUlpfLNBQ
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -417,17 +417,18 @@ private:
   bool mPendingDormant = false;
   SeekJob mPendingSeek;
 };
 
 /**
  * Purpose: release decoder resources to save memory and hardware resources.
  *
  * Transition to:
- *   DECODING_FIRSTFRAME when being asked to exit dormant.
+ *   DECODING_FIRSTFRAME when play state changes to PLAYING.
+ *   SEEKING if any seek request.
  */
 class MediaDecoderStateMachine::DormantState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit DormantState(Master* aPtr) : StateObject(aPtr) {}
 
   void Enter(SeekJob aPendingSeek)
@@ -449,34 +450,36 @@ public:
 
   State GetState() const override
   {
     return DECODER_STATE_DORMANT;
   }
 
   bool HandleDormant(bool aDormant) override;
 
-  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
-  {
-    SLOG("Not Enough Data to seek at this stage, queuing seek");
-    mPendingSeek.RejectIfExists(__func__);
-    mPendingSeek.mTarget = aTarget;
-    return mPendingSeek.mPromise.Ensure(__func__);
-  }
+  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
 
   void HandleVideoSuspendTimeout() override
   {
     // Do nothing since we've released decoders in Enter().
   }
 
   void HandleResumeVideoDecoding() override
   {
     // Do nothing since we won't resume decoding until exiting dormant.
   }
 
+  void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) override
+  {
+    if (aPlayState == MediaDecoder::PLAY_STATE_PLAYING) {
+      // Exit dormant when the user wants to play.
+      HandleDormant(false);
+    }
+  }
+
 private:
   SeekJob mPendingSeek;
 };
 
 /**
  * Purpose: decode the 1st audio and video frames to fire the 'loadeddata' event.
  *
  * Transition to:
@@ -1355,16 +1358,27 @@ DormantState::HandleDormant(bool aDorman
 {
   if (!aDormant) {
     MOZ_ASSERT(!Info().IsEncrypted() || mMaster->mCDMProxy);
     SetState<DecodingFirstFrameState>(Move(mPendingSeek));
   }
   return true;
 }
 
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+DormantState::HandleSeek(SeekTarget aTarget)
+{
+  // Exit dormant when the user wants to seek.
+  mPendingSeek.RejectIfExists(__func__);
+  SeekJob seekJob;
+  seekJob.mTarget = aTarget;
+  return SetState<SeekingState>(Move(seekJob));
+}
+
 bool
 MediaDecoderStateMachine::
 WaitForCDMState::HandleCDMProxyReady()
 {
   if (mPendingDormant) {
     SetState<DormantState>(Move(mPendingSeek));
   } else {
     SetState<DecodingFirstFrameState>(Move(mPendingSeek));