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