Bug 1329110. Part 1 - add HandleWaitingForAudio().
MozReview-Commit-ID: B2ElMMYKt7m
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -198,16 +198,22 @@ public:
virtual void HandleVideoNotDecoded(const MediaResult& aError);
virtual void HandleAudioWaited(MediaData::Type aType);
virtual void HandleVideoWaited(MediaData::Type aType);
virtual void HandleNotWaited(const WaitForDataRejectValue& aRejection);
virtual void HandleEndOfStream() {}
virtual void HandleWaitingForData() {}
virtual void HandleAudioCaptured() {}
+ virtual void HandleWaitingForAudio()
+ {
+ mMaster->WaitForData(MediaData::AUDIO_DATA);
+ HandleWaitingForData();
+ }
+
virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
virtual RefPtr<ShutdownPromise> HandleShutdown();
virtual void HandleVideoSuspendTimeout() = 0;
virtual void HandleResumeVideoDecoding();
@@ -493,16 +499,21 @@ public:
}
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
{
mMaster->PushVideo(aVideo);
MaybeFinishDecodeFirstFrame();
}
+ void HandleWaitingForAudio() override
+ {
+ mMaster->WaitForData(MediaData::AUDIO_DATA);
+ }
+
void HandleAudioNotDecoded(const MediaResult& aError) override;
void HandleVideoNotDecoded(const MediaResult& aError) override;
void HandleAudioWaited(MediaData::Type aType) override
{
mMaster->RequestAudioData();
}
@@ -929,16 +940,24 @@ public:
if (!mDoneVideoSeeking) {
RequestVideoData();
return;
}
MaybeFinishSeek();
}
+ void HandleWaitingForAudio() override
+ {
+ if (!mSeekJob.mTarget->IsVideoOnly()) {
+ MOZ_ASSERT(!mDoneAudioSeeking);
+ mMaster->WaitForData(MediaData::AUDIO_DATA);
+ }
+ }
+
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.
@@ -1343,16 +1362,24 @@ private:
if (aVideo->mTime > mCurrentTime) {
mMaster->PushVideo(aVideo);
FinishSeek();
} else {
RequestVideoData();
}
}
+ 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 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.
}
@@ -1690,18 +1717,17 @@ StateObject::HandleNotWaited(const WaitF
}
void
MediaDecoderStateMachine::
StateObject::HandleAudioNotDecoded(const MediaResult& aError)
{
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
- mMaster->WaitForData(MediaData::AUDIO_DATA);
- HandleWaitingForData();
+ MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_CANCELED:
mMaster->EnsureAudioDecodeTaskQueued();
break;
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
AudioQueue().Finish();
HandleEndOfStream();
break;
@@ -1928,17 +1954,17 @@ DecodingFirstFrameState::Enter()
}
void
MediaDecoderStateMachine::
DecodingFirstFrameState::HandleAudioNotDecoded(const MediaResult& aError)
{
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
- mMaster->WaitForData(MediaData::AUDIO_DATA);
+ MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_CANCELED:
mMaster->RequestAudioData();
break;
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
AudioQueue().Finish();
MaybeFinishDecodeFirstFrame();
break;
@@ -2151,17 +2177,17 @@ MediaDecoderStateMachine::
AccurateSeekingState::HandleAudioNotDecoded(const MediaResult& aError)
{
if (mSeekJob.mTarget->IsVideoOnly()) {
return;
}
MOZ_ASSERT(!mDoneAudioSeeking);
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
- mMaster->WaitForData(MediaData::AUDIO_DATA);
+ MOZ_ASSERT(false);
break;
case NS_ERROR_DOM_MEDIA_CANCELED:
RequestAudioData();
break;
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
AudioQueue().Finish();
mDoneAudioSeeking = true;
MaybeFinishSeek();
@@ -3006,17 +3032,23 @@ MediaDecoderStateMachine::RequestAudioDa
// audio->GetEndTime() is not always mono-increasing in chained ogg.
mDecodedAudioEndTime = std::max(aAudio->GetEndTime(), mDecodedAudioEndTime);
SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
mStateObj->HandleAudioDecoded(aAudio);
},
[this] (const MediaResult& aError) {
SAMPLE_LOG("OnAudioNotDecoded aError=%u", aError.Code());
mAudioDataRequest.Complete();
- mStateObj->HandleAudioNotDecoded(aError);
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+ mStateObj->HandleWaitingForAudio();
+ break;
+ default:
+ mStateObj->HandleAudioNotDecoded(aError);
+ }
})
);
}
void
MediaDecoderStateMachine::EnsureVideoDecodeTaskQueued()
{
MOZ_ASSERT(OnTaskQueue());