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
--- 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