Bug 1331331. Part 2 - switch to ErrorState in DecodeError(). draft
authorJW Wang <jwwang@mozilla.com>
Mon, 16 Jan 2017 17:53:48 +0800
changeset 463444 7d874b402c1e84d2daa9db0897ad3e35b3862bec
parent 463443 0214e2b07b1250dcc2c16e782778f39cee91e560
child 542679 d79e7fd6aedc25db0ff047d9bc89e23d42b05d83
push id42067
push userjwwang@mozilla.com
push dateThu, 19 Jan 2017 03:24:25 +0000
bugs1331331
milestone53.0a1
Bug 1331331. Part 2 - switch to ErrorState in DecodeError(). We also store MediaResult in ErrorState so it can dump the error code/message in DumpDebugInfo() which is useful in debugging mochitest failures. MozReview-Commit-ID: AfJH21h5CGy
dom/media/MediaDecoderStateMachine.cpp
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -230,16 +230,18 @@ public:
   {
     Crash("Unexpected event!", __func__);
   }
   virtual void HandleEndOfVideo()
   {
     Crash("Unexpected event!", __func__);
   }
 
+  void HandleDecodeError(const MediaResult& aError);
+
   virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
 
   virtual RefPtr<ShutdownPromise> HandleShutdown();
 
   virtual void HandleVideoSuspendTimeout() = 0;
 
   virtual void HandleResumeVideoDecoding();
 
@@ -1819,18 +1821,19 @@ private:
  *   SHUTDOWN if BeginShutdown() is called on MDSM.
  */
 class MediaDecoderStateMachine::ErrorState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit ErrorState(Master* aPtr) : StateObject(aPtr) {}
 
-  void Enter()
+  void Enter(MediaResult aError)
   {
+    mError = Move(aError);
     mMaster->StopPlayback();
     mMaster->ResetDecode();
     mMaster->StopMediaSink();
     Reader()->ReleaseResources();
   }
 
   State GetState() const override
   {
@@ -1839,16 +1842,24 @@ public:
 
   RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
   {
     return MediaDecoder::SeekPromise::CreateAndReject(true, __func__);
   }
 
   void HandleVideoSuspendTimeout() override {}
   void HandleResumeVideoDecoding() override {}
+
+  void DumpDebugInfo() override
+  {
+    SDUMP("mError code=%u msg=%s", mError.Code(), mError.Message().get());
+  }
+
+private:
+  MediaResult mError = NS_OK;
 };
 
 /**
  * Purpose: release all resources allocated by MDSM.
  *
  * Transition to:
  *   None since this is the final state.
  *
@@ -1891,16 +1902,23 @@ public:
   }
 
   void HandleResumeVideoDecoding() override
   {
     MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
   }
 };
 
+void
+MediaDecoderStateMachine::
+StateObject::HandleDecodeError(const MediaResult& aError)
+{
+  SetState<ErrorState>(aError);
+}
+
 RefPtr<MediaDecoder::SeekPromise>
 MediaDecoderStateMachine::
 StateObject::HandleSeek(SeekTarget aTarget)
 {
   SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
   SeekJob seekJob;
   seekJob.mTarget = Some(aTarget);
   return SetSeekingState(Move(seekJob), EventVisibility::Observable);
@@ -3262,16 +3280,17 @@ bool MediaDecoderStateMachine::HasLowBuf
 void
 MediaDecoderStateMachine::DecodeError(const MediaResult& aError)
 {
   MOZ_ASSERT(OnTaskQueue());
   MOZ_ASSERT(!IsShutdown());
   DECODER_WARN("Decode error");
   // Notify the decode error and MediaDecoder will shut down MDSM.
   mOnPlaybackErrorEvent.Notify(aError);
+  mStateObj->HandleDecodeError(aError);
 }
 
 void
 MediaDecoderStateMachine::EnqueueLoadedMetadataEvent()
 {
   MOZ_ASSERT(OnTaskQueue());
   MediaDecoderEventVisibility visibility =
     mSentLoadedMetadataEvent ? MediaDecoderEventVisibility::Suppressed