Bug 1329110. Part 2 - add HandleAudioCanceled(). draft
authorJW Wang <jwwang@mozilla.com>
Fri, 06 Jan 2017 17:49:11 +0800
changeset 458392 782aadbe8fbe0bbbc04fff7cab795bd5c66d8ed4
parent 458391 1e5c4640a4fc80a987d08b76aa2c97a5159be13d
child 458393 583335191dc21448946205533a71d09dcb2011b3
push id40941
push userjwwang@mozilla.com
push dateTue, 10 Jan 2017 07:42:53 +0000
bugs1329110
milestone53.0a1
Bug 1329110. Part 2 - add HandleAudioCanceled(). MozReview-Commit-ID: IlzcucZOHpo
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -204,16 +204,21 @@ public:
   virtual void HandleAudioCaptured() {}
 
   virtual void HandleWaitingForAudio()
   {
     mMaster->WaitForData(MediaData::AUDIO_DATA);
     HandleWaitingForData();
   }
 
+  virtual void HandleAudioCanceled()
+  {
+    mMaster->EnsureAudioDecodeTaskQueued();
+  }
+
   virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
 
   virtual RefPtr<ShutdownPromise> HandleShutdown();
 
   virtual void HandleVideoSuspendTimeout() = 0;
 
   virtual void HandleResumeVideoDecoding();
 
@@ -504,16 +509,21 @@ public:
     MaybeFinishDecodeFirstFrame();
   }
 
   void HandleWaitingForAudio() override
   {
     mMaster->WaitForData(MediaData::AUDIO_DATA);
   }
 
+  void HandleAudioCanceled() override
+  {
+    mMaster->RequestAudioData();
+  }
+
   void HandleAudioNotDecoded(const MediaResult& aError) override;
   void HandleVideoNotDecoded(const MediaResult& aError) override;
 
   void HandleAudioWaited(MediaData::Type aType) override
   {
     mMaster->RequestAudioData();
   }
 
@@ -948,16 +958,24 @@ public:
   void HandleWaitingForAudio() override
   {
     if (!mSeekJob.mTarget->IsVideoOnly()) {
       MOZ_ASSERT(!mDoneAudioSeeking);
       mMaster->WaitForData(MediaData::AUDIO_DATA);
     }
   }
 
+  void HandleAudioCanceled() override
+  {
+    if (!mSeekJob.mTarget->IsVideoOnly()) {
+      MOZ_ASSERT(!mDoneAudioSeeking);
+      RequestAudioData();
+    }
+  }
+
   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.
@@ -1370,16 +1388,24 @@ private:
   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 HandleAudioCanceled() 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.
   }
 
@@ -1720,17 +1746,17 @@ void
 MediaDecoderStateMachine::
 StateObject::HandleAudioNotDecoded(const MediaResult& aError)
 {
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
-      mMaster->EnsureAudioDecodeTaskQueued();
+      MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
       AudioQueue().Finish();
       HandleEndOfStream();
       break;
     default:
       mMaster->DecodeError(aError);
   }
@@ -1957,17 +1983,17 @@ void
 MediaDecoderStateMachine::
 DecodingFirstFrameState::HandleAudioNotDecoded(const MediaResult& aError)
 {
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
-      mMaster->RequestAudioData();
+      MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
       AudioQueue().Finish();
       MaybeFinishDecodeFirstFrame();
       break;
     default:
       mMaster->DecodeError(aError);
   }
@@ -2180,17 +2206,17 @@ AccurateSeekingState::HandleAudioNotDeco
     return;
   }
   MOZ_ASSERT(!mDoneAudioSeeking);
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
-      RequestAudioData();
+      MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
       AudioQueue().Finish();
       mDoneAudioSeeking = true;
       MaybeFinishSeek();
       break;
     default:
       mMaster->DecodeError(aError);
@@ -3036,16 +3062,19 @@ MediaDecoderStateMachine::RequestAudioDa
       },
       [this] (const MediaResult& aError) {
         SAMPLE_LOG("OnAudioNotDecoded aError=%u", aError.Code());
         mAudioDataRequest.Complete();
         switch (aError.Code()) {
           case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
             mStateObj->HandleWaitingForAudio();
             break;
+          case NS_ERROR_DOM_MEDIA_CANCELED:
+            mStateObj->HandleAudioCanceled();
+            break;
           default:
             mStateObj->HandleAudioNotDecoded(aError);
         }
       })
   );
 }
 
 void