Bug 1325905. Part 4 - let DecodingFirstFrameState override Handle{Audio,Video}NotDecoded. draft
authorJW Wang <jwwang@mozilla.com>
Wed, 21 Dec 2016 18:16:25 +0800
changeset 454468 3b69a728ed9c1433f398b9e5688b19ea3849eb3c
parent 454467 25b04e270326bbf2ca10a5be6b670f0962bc57ae
child 454469 dcf003553f40620139b37c799b2674f551bd546f
push id39938
push userjwwang@mozilla.com
push dateThu, 29 Dec 2016 11:35:09 +0000
bugs1325905
milestone53.0a1
Bug 1325905. Part 4 - let DecodingFirstFrameState override Handle{Audio,Video}NotDecoded. We want to call Request{Audio,Video}Data() instead of Ensure{Audio,Video}DecodeTaskQueued which checks mState and breaks the encapsulation of the state objects. MozReview-Commit-ID: 87CwSdtTwi4
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -492,20 +492,18 @@ public:
   }
 
   void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
   {
     mMaster->PushVideo(aVideo);
     MaybeFinishDecodeFirstFrame();
   }
 
-  void HandleEndOfStream() override
-  {
-    MaybeFinishDecodeFirstFrame();
-  }
+  void HandleAudioNotDecoded(const MediaResult& aError) override;
+  void HandleVideoNotDecoded(const MediaResult& aError) override;
 
   void HandleVideoSuspendTimeout() override
   {
     // Do nothing for we need to decode the 1st video frame to get the dimensions.
   }
 
   void HandleResumeVideoDecoding() override
   {
@@ -1899,16 +1897,56 @@ DecodingFirstFrameState::Enter()
   MOZ_ASSERT(!mMaster->mVideoDecodeSuspended);
 
   // Dispatch tasks to decode first frames.
   mMaster->DispatchDecodeTasksIfNeeded();
 }
 
 void
 MediaDecoderStateMachine::
+DecodingFirstFrameState::HandleAudioNotDecoded(const MediaResult& aError)
+{
+  switch (aError.Code()) {
+    case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+      mMaster->WaitForData(MediaData::AUDIO_DATA);
+      break;
+    case NS_ERROR_DOM_MEDIA_CANCELED:
+      mMaster->RequestAudioData();
+      break;
+    case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+      AudioQueue().Finish();
+      MaybeFinishDecodeFirstFrame();
+      break;
+    default:
+      mMaster->DecodeError(aError);
+  }
+}
+
+void
+MediaDecoderStateMachine::
+DecodingFirstFrameState::HandleVideoNotDecoded(const MediaResult& aError)
+{
+  switch (aError.Code()) {
+    case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+      mMaster->WaitForData(MediaData::VIDEO_DATA);
+      break;
+    case NS_ERROR_DOM_MEDIA_CANCELED:
+      mMaster->RequestVideoData(false, media::TimeUnit());
+      break;
+    case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+      VideoQueue().Finish();
+      MaybeFinishDecodeFirstFrame();
+      break;
+    default:
+      mMaster->DecodeError(aError);
+  }
+}
+
+void
+MediaDecoderStateMachine::
 DecodingFirstFrameState::MaybeFinishDecodeFirstFrame()
 {
   MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
 
   if ((mMaster->IsAudioDecoding() && AudioQueue().GetSize() == 0) ||
       (mMaster->IsVideoDecoding() && VideoQueue().GetSize() == 0)) {
     return;
   }