Bug 1329110. Part 2 - add HandleAudioCanceled().
MozReview-Commit-ID: IlzcucZOHpo
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -204,16 +204,21 @@ public:
virtual void HandleAudioCaptured() {}
virtual void HandleWaitingForAudio()
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
HandleWaitingForData();
}
+ virtual void HandleAudioCanceled()
+ {
+ mMaster->EnsureAudioDecodeTaskQueued();
+ }
+
virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
virtual RefPtr<ShutdownPromise> HandleShutdown();
virtual void HandleVideoSuspendTimeout() = 0;
virtual void HandleResumeVideoDecoding();
@@ -504,16 +509,21 @@ public:
MaybeFinishDecodeFirstFrame();
}
void HandleWaitingForAudio() override
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
}
+ void HandleAudioCanceled() override
+ {
+ mMaster->RequestAudioData();
+ }
+
void HandleAudioNotDecoded(const MediaResult& aError) override;
void HandleVideoNotDecoded(const MediaResult& aError) override;
void HandleAudioWaited(MediaData::Type aType) override
{
mMaster->RequestAudioData();
}
@@ -948,16 +958,24 @@ public:
void HandleWaitingForAudio() override
{
if (!mSeekJob.mTarget->IsVideoOnly()) {
MOZ_ASSERT(!mDoneAudioSeeking);
mMaster->WaitForData(MediaData::AUDIO_DATA);
}
}
+ void HandleAudioCanceled() override
+ {
+ if (!mSeekJob.mTarget->IsVideoOnly()) {
+ MOZ_ASSERT(!mDoneAudioSeeking);
+ RequestAudioData();
+ }
+ }
+
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.
@@ -1370,16 +1388,24 @@ private:
void HandleWaitingForAudio() 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 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 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.
}
@@ -1720,17 +1746,17 @@ void
MediaDecoderStateMachine::
StateObject::HandleAudioNotDecoded(const MediaResult& aError)
{
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_CANCELED:
- mMaster->EnsureAudioDecodeTaskQueued();
+ MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
AudioQueue().Finish();
HandleEndOfStream();
break;
default:
mMaster->DecodeError(aError);
}
@@ -1957,17 +1983,17 @@ void
MediaDecoderStateMachine::
DecodingFirstFrameState::HandleAudioNotDecoded(const MediaResult& aError)
{
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_CANCELED:
- mMaster->RequestAudioData();
+ MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
AudioQueue().Finish();
MaybeFinishDecodeFirstFrame();
break;
default:
mMaster->DecodeError(aError);
}
@@ -2180,17 +2206,17 @@ AccurateSeekingState::HandleAudioNotDeco
return;
}
MOZ_ASSERT(!mDoneAudioSeeking);
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_CANCELED:
- RequestAudioData();
+ MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
AudioQueue().Finish();
mDoneAudioSeeking = true;
MaybeFinishSeek();
break;
default:
mMaster->DecodeError(aError);
@@ -3036,16 +3062,19 @@ MediaDecoderStateMachine::RequestAudioDa
},
[this] (const MediaResult& aError) {
SAMPLE_LOG("OnAudioNotDecoded aError=%u", aError.Code());
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;
default:
mStateObj->HandleAudioNotDecoded(aError);
}
})
);
}
void