Bug 1329110. Part 1 - add HandleWaitingForAudio(). draft
authorJW Wang <jwwang@mozilla.com>
Fri, 06 Jan 2017 17:43:05 +0800
changeset 458391 1e5c4640a4fc80a987d08b76aa2c97a5159be13d
parent 457885 e5b5f5d3a28fd6896fb891061b1cc78dca136770
child 458392 782aadbe8fbe0bbbc04fff7cab795bd5c66d8ed4
push id40941
push userjwwang@mozilla.com
push dateTue, 10 Jan 2017 07:42:53 +0000
bugs1329110
milestone53.0a1
Bug 1329110. Part 1 - add HandleWaitingForAudio(). MozReview-Commit-ID: B2ElMMYKt7m
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -198,16 +198,22 @@ public:
   virtual void HandleVideoNotDecoded(const MediaResult& aError);
   virtual void HandleAudioWaited(MediaData::Type aType);
   virtual void HandleVideoWaited(MediaData::Type aType);
   virtual void HandleNotWaited(const WaitForDataRejectValue& aRejection);
   virtual void HandleEndOfStream() {}
   virtual void HandleWaitingForData() {}
   virtual void HandleAudioCaptured() {}
 
+  virtual void HandleWaitingForAudio()
+  {
+    mMaster->WaitForData(MediaData::AUDIO_DATA);
+    HandleWaitingForData();
+  }
+
   virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
 
   virtual RefPtr<ShutdownPromise> HandleShutdown();
 
   virtual void HandleVideoSuspendTimeout() = 0;
 
   virtual void HandleResumeVideoDecoding();
 
@@ -493,16 +499,21 @@ public:
   }
 
   void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
   {
     mMaster->PushVideo(aVideo);
     MaybeFinishDecodeFirstFrame();
   }
 
+  void HandleWaitingForAudio() override
+  {
+    mMaster->WaitForData(MediaData::AUDIO_DATA);
+  }
+
   void HandleAudioNotDecoded(const MediaResult& aError) override;
   void HandleVideoNotDecoded(const MediaResult& aError) override;
 
   void HandleAudioWaited(MediaData::Type aType) override
   {
     mMaster->RequestAudioData();
   }
 
@@ -929,16 +940,24 @@ public:
 
     if (!mDoneVideoSeeking) {
       RequestVideoData();
       return;
     }
     MaybeFinishSeek();
   }
 
+  void HandleWaitingForAudio() override
+  {
+    if (!mSeekJob.mTarget->IsVideoOnly()) {
+      MOZ_ASSERT(!mDoneAudioSeeking);
+      mMaster->WaitForData(MediaData::AUDIO_DATA);
+    }
+  }
+
   void HandleAudioNotDecoded(const MediaResult& aError) override;
   void HandleVideoNotDecoded(const MediaResult& aError) override;
 
   void HandleAudioWaited(MediaData::Type aType) override
   {
     MOZ_ASSERT(!mDoneAudioSeeking || !mDoneVideoSeeking, "Seek shouldn't be finished");
 
     // Ignore pending requests from video-only seek.
@@ -1343,16 +1362,24 @@ private:
     if (aVideo->mTime > mCurrentTime) {
       mMaster->PushVideo(aVideo);
       FinishSeek();
     } else {
       RequestVideoData();
     }
   }
 
+  void HandleWaitingForAudio() override
+  {
+    MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
+    MOZ_ASSERT(NeedMoreVideo());
+    // We don't care about audio decode errors in this state which will be
+    // handled by other states after seeking.
+  }
+
   void HandleAudioNotDecoded(const MediaResult& aError) override;
   void HandleVideoNotDecoded(const MediaResult& aError) override;
 
   void HandleAudioWaited(MediaData::Type aType) override
   {
     // We don't care about audio in this state.
   }
 
@@ -1690,18 +1717,17 @@ StateObject::HandleNotWaited(const WaitF
 }
 
 void
 MediaDecoderStateMachine::
 StateObject::HandleAudioNotDecoded(const MediaResult& aError)
 {
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
-      mMaster->WaitForData(MediaData::AUDIO_DATA);
-      HandleWaitingForData();
+      MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
       mMaster->EnsureAudioDecodeTaskQueued();
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
       AudioQueue().Finish();
       HandleEndOfStream();
       break;
@@ -1928,17 +1954,17 @@ DecodingFirstFrameState::Enter()
 }
 
 void
 MediaDecoderStateMachine::
 DecodingFirstFrameState::HandleAudioNotDecoded(const MediaResult& aError)
 {
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
-      mMaster->WaitForData(MediaData::AUDIO_DATA);
+      MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
       mMaster->RequestAudioData();
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
       AudioQueue().Finish();
       MaybeFinishDecodeFirstFrame();
       break;
@@ -2151,17 +2177,17 @@ MediaDecoderStateMachine::
 AccurateSeekingState::HandleAudioNotDecoded(const MediaResult& aError)
 {
   if (mSeekJob.mTarget->IsVideoOnly()) {
     return;
   }
   MOZ_ASSERT(!mDoneAudioSeeking);
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
-      mMaster->WaitForData(MediaData::AUDIO_DATA);
+      MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
       RequestAudioData();
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
       AudioQueue().Finish();
       mDoneAudioSeeking = true;
       MaybeFinishSeek();
@@ -3006,17 +3032,23 @@ MediaDecoderStateMachine::RequestAudioDa
         // 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());
         mStateObj->HandleAudioDecoded(aAudio);
       },
       [this] (const MediaResult& aError) {
         SAMPLE_LOG("OnAudioNotDecoded aError=%u", aError.Code());
         mAudioDataRequest.Complete();
-        mStateObj->HandleAudioNotDecoded(aError);
+        switch (aError.Code()) {
+          case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+            mStateObj->HandleWaitingForAudio();
+            break;
+          default:
+            mStateObj->HandleAudioNotDecoded(aError);
+        }
       })
   );
 }
 
 void
 MediaDecoderStateMachine::EnsureVideoDecodeTaskQueued()
 {
   MOZ_ASSERT(OnTaskQueue());