Bug 1307022. Part 2 - move some code from OnAudioDecoded() to various state objects. draft
authorJW Wang <jwwang@mozilla.com>
Fri, 30 Sep 2016 16:45:48 +0800
changeset 420433 5ffb641f917a37c3972149dd34162991f54246e8
parent 420432 24eeaa9d41ca54d6b03ea9b5289d1cd2b25c095a
child 420434 efefc27e8c9364fa67c6f7acfe31ca1e3f7c311a
push id31197
push userjwwang@mozilla.com
push dateTue, 04 Oct 2016 06:29:16 +0000
bugs1307022
milestone52.0a1
Bug 1307022. Part 2 - move some code from OnAudioDecoded() to various state objects. MozReview-Commit-ID: OgboEaJBdj
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -207,16 +207,18 @@ public:
     RefPtr<MediaDecoder::SeekPromise> unused =
       mMaster->mQueuedSeek.mPromise.Ensure(__func__);
     SetState(DECODER_STATE_DORMANT);
     return true;
   }
 
   virtual bool HandleCDMProxyReady() { return false; }
 
+  virtual bool HandleAudioDecoded(MediaData* aAudio) { return false; }
+
 protected:
   using Master = MediaDecoderStateMachine;
   explicit StateObject(Master* aPtr) : mMaster(aPtr) {}
   TaskQueue* OwnerThread() const { return mMaster->mTaskQueue; }
   MediaResource* Resource() const { return mMaster->mResource; }
   MediaDecoderReaderWrapper* Reader() const { return mMaster->mReader; }
 
   // Note this function will delete the current state object.
@@ -410,16 +412,23 @@ public:
   {
     mMaster->DecodeFirstFrame();
   }
 
   State GetState() const override
   {
     return DECODER_STATE_DECODING_FIRSTFRAME;
   }
+
+  bool HandleAudioDecoded(MediaData* aAudio) override
+  {
+    mMaster->Push(aAudio, MediaData::AUDIO_DATA);
+    mMaster->MaybeFinishDecodeFirstFrame();
+    return true;
+  }
 };
 
 class MediaDecoderStateMachine::DecodingState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit DecodingState(Master* aPtr) : StateObject(aPtr) {}
 
@@ -476,16 +485,23 @@ public:
     mMaster->MaybeStartBuffering();
   }
 
   State GetState() const override
   {
     return DECODER_STATE_DECODING;
   }
 
+  bool HandleAudioDecoded(MediaData* aAudio) override
+  {
+    mMaster->Push(aAudio, MediaData::AUDIO_DATA);
+    mMaster->MaybeStopPrerolling();
+    return true;
+  }
+
 private:
   // Time at which we started decoding.
   TimeStamp mDecodeStartTime;
 };
 
 class MediaDecoderStateMachine::SeekingState
   : public MediaDecoderStateMachine::StateObject
 {
@@ -511,16 +527,22 @@ public:
     if (mMaster->mCurrentSeek.mTarget.IsVideoOnly()) {
       mMaster->mCurrentSeek.mTarget.SetType(SeekTarget::Accurate);
       mMaster->mCurrentSeek.mTarget.SetVideoOnly(false);
     }
     mMaster->mQueuedSeek = Move(mMaster->mCurrentSeek);
     SetState(DECODER_STATE_DORMANT);
     return true;
   }
+
+  bool HandleAudioDecoded(MediaData* aAudio) override
+  {
+    MOZ_ASSERT(false);
+    return true;
+  }
 };
 
 class MediaDecoderStateMachine::BufferingState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit BufferingState(Master* aPtr) : StateObject(aPtr) {}
 
@@ -583,16 +605,25 @@ public:
     SetState(DECODER_STATE_DECODING);
   }
 
   State GetState() const override
   {
     return DECODER_STATE_BUFFERING;
   }
 
+  bool HandleAudioDecoded(MediaData* aAudio) override
+  {
+    // This might be the sample we need to exit buffering.
+    // Schedule Step() to check it.
+    mMaster->Push(aAudio, MediaData::AUDIO_DATA);
+    mMaster->ScheduleStateMachine();
+    return true;
+  }
+
 private:
   TimeStamp mBufferingStart;
 };
 
 class MediaDecoderStateMachine::CompletedState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
@@ -1013,50 +1044,24 @@ MediaDecoderStateMachine::NeedToDecodeAu
          ((!mSentFirstFrameLoadedEvent && AudioQueue().GetSize() == 0) ||
           (!mMinimizePreroll && !HaveEnoughDecodedAudio()));
 }
 
 void
 MediaDecoderStateMachine::OnAudioDecoded(MediaData* aAudio)
 {
   MOZ_ASSERT(OnTaskQueue());
-  MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
   MOZ_ASSERT(aAudio);
 
   // audio->GetEndTime() is not always mono-increasing in chained ogg.
   mDecodedAudioEndTime = std::max(aAudio->GetEndTime(), mDecodedAudioEndTime);
 
   SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
 
-  switch (mState) {
-    case DECODER_STATE_BUFFERING: {
-      // If we're buffering, this may be the sample we need to stop buffering.
-      // Save it and schedule the state machine.
-      Push(aAudio, MediaData::AUDIO_DATA);
-      ScheduleStateMachine();
-      return;
-    }
-
-    case DECODER_STATE_DECODING_FIRSTFRAME: {
-      Push(aAudio, MediaData::AUDIO_DATA);
-      MaybeFinishDecodeFirstFrame();
-      return;
-    }
-
-    case DECODER_STATE_DECODING: {
-      Push(aAudio, MediaData::AUDIO_DATA);
-      MaybeStopPrerolling();
-      return;
-    }
-
-    default: {
-      // Ignore other cases.
-      return;
-    }
-  }
+  mStateObj->HandleAudioDecoded(aAudio);
 }
 
 void
 MediaDecoderStateMachine::Push(MediaData* aSample, MediaData::Type aSampleType)
 {
   MOZ_ASSERT(OnTaskQueue());
   MOZ_ASSERT(aSample);