Bug 1329110. Part 3 - add HandleEndOfAudio(). draft
authorJW Wang <jwwang@mozilla.com>
Fri, 06 Jan 2017 17:54:59 +0800
changeset 458393 583335191dc21448946205533a71d09dcb2011b3
parent 458392 782aadbe8fbe0bbbc04fff7cab795bd5c66d8ed4
child 458394 d1466f6ddb0b8b8069a96d9e9f3be9ac388c2a9b
push id40941
push userjwwang@mozilla.com
push dateTue, 10 Jan 2017 07:42:53 +0000
bugs1329110
milestone53.0a1
Bug 1329110. Part 3 - add HandleEndOfAudio(). MozReview-Commit-ID: KGiWU8t79pv
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -209,16 +209,22 @@ public:
     HandleWaitingForData();
   }
 
   virtual void HandleAudioCanceled()
   {
     mMaster->EnsureAudioDecodeTaskQueued();
   }
 
+  virtual void HandleEndOfAudio()
+  {
+    AudioQueue().Finish();
+    HandleEndOfStream();
+  }
+
   virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
 
   virtual RefPtr<ShutdownPromise> HandleShutdown();
 
   virtual void HandleVideoSuspendTimeout() = 0;
 
   virtual void HandleResumeVideoDecoding();
 
@@ -514,16 +520,22 @@ public:
     mMaster->WaitForData(MediaData::AUDIO_DATA);
   }
 
   void HandleAudioCanceled() override
   {
     mMaster->RequestAudioData();
   }
 
+  void HandleEndOfAudio() override
+  {
+    AudioQueue().Finish();
+    MaybeFinishDecodeFirstFrame();
+  }
+
   void HandleAudioNotDecoded(const MediaResult& aError) override;
   void HandleVideoNotDecoded(const MediaResult& aError) override;
 
   void HandleAudioWaited(MediaData::Type aType) override
   {
     mMaster->RequestAudioData();
   }
 
@@ -966,16 +978,26 @@ public:
   void HandleAudioCanceled() override
   {
     if (!mSeekJob.mTarget->IsVideoOnly()) {
       MOZ_ASSERT(!mDoneAudioSeeking);
       RequestAudioData();
     }
   }
 
+  void HandleEndOfAudio() override
+  {
+    if (!mSeekJob.mTarget->IsVideoOnly()) {
+      MOZ_ASSERT(!mDoneAudioSeeking);
+      AudioQueue().Finish();
+      mDoneAudioSeeking = true;
+      MaybeFinishSeek();
+    }
+  }
+
   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.
@@ -1396,16 +1418,24 @@ private:
   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 HandleEndOfAudio() 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.
   }
 
@@ -1749,18 +1779,17 @@ StateObject::HandleAudioNotDecoded(const
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
-      AudioQueue().Finish();
-      HandleEndOfStream();
+      MOZ_ASSERT(false);
       break;
     default:
       mMaster->DecodeError(aError);
   }
 }
 
 void
 MediaDecoderStateMachine::
@@ -1986,18 +2015,17 @@ DecodingFirstFrameState::HandleAudioNotD
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
-      AudioQueue().Finish();
-      MaybeFinishDecodeFirstFrame();
+      MOZ_ASSERT(false);
       break;
     default:
       mMaster->DecodeError(aError);
   }
 }
 
 void
 MediaDecoderStateMachine::
@@ -2209,19 +2237,17 @@ AccurateSeekingState::HandleAudioNotDeco
   switch (aError.Code()) {
     case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_CANCELED:
       MOZ_ASSERT(false);
       break;
     case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
-      AudioQueue().Finish();
-      mDoneAudioSeeking = true;
-      MaybeFinishSeek();
+      MOZ_ASSERT(false);
       break;
     default:
       mMaster->DecodeError(aError);
   }
 }
 
 void
 MediaDecoderStateMachine::
@@ -3065,16 +3091,19 @@ MediaDecoderStateMachine::RequestAudioDa
         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;
+          case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+            mStateObj->HandleEndOfAudio();
+            break;
           default:
             mStateObj->HandleAudioNotDecoded(aError);
         }
       })
   );
 }
 
 void