mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 03:35:33 +00:00
Bug 1329110. Part 5 - split Split StateObject::HandleVideoNotDecoded into small functions. r=kaku
MozReview-Commit-ID: Bfyekr4I6OX --HG-- extra : rebase_source : 43579faa96eba1e2fae2db98a7336aa928006661 extra : source : ea122d8b79c7cb87ec3671cc849d1358cf97976d
This commit is contained in:
parent
c981850d84
commit
b338772d2a
@ -194,7 +194,6 @@ public:
|
||||
virtual void HandleCDMProxyReady() {}
|
||||
virtual void HandleAudioDecoded(MediaData* aAudio) {}
|
||||
virtual void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) {}
|
||||
virtual void HandleVideoNotDecoded(const MediaResult& aError);
|
||||
virtual void HandleAudioWaited(MediaData::Type aType);
|
||||
virtual void HandleVideoWaited(MediaData::Type aType);
|
||||
virtual void HandleNotWaited(const WaitForDataRejectValue& aRejection);
|
||||
@ -219,6 +218,23 @@ public:
|
||||
HandleEndOfStream();
|
||||
}
|
||||
|
||||
virtual void HandleWaitingForVideo()
|
||||
{
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
HandleWaitingForData();
|
||||
}
|
||||
|
||||
virtual void HandleVideoCanceled()
|
||||
{
|
||||
mMaster->EnsureVideoDecodeTaskQueued();
|
||||
}
|
||||
|
||||
virtual void HandleEndOfVideo()
|
||||
{
|
||||
VideoQueue().Finish();
|
||||
HandleEndOfStream();
|
||||
}
|
||||
|
||||
virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
|
||||
|
||||
virtual RefPtr<ShutdownPromise> HandleShutdown();
|
||||
@ -530,7 +546,21 @@ public:
|
||||
MaybeFinishDecodeFirstFrame();
|
||||
}
|
||||
|
||||
void HandleVideoNotDecoded(const MediaResult& aError) override;
|
||||
void HandleWaitingForVideo() override
|
||||
{
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
}
|
||||
|
||||
void HandleVideoCanceled() override
|
||||
{
|
||||
mMaster->RequestVideoData(false, media::TimeUnit());
|
||||
}
|
||||
|
||||
void HandleEndOfVideo() override
|
||||
{
|
||||
VideoQueue().Finish();
|
||||
MaybeFinishDecodeFirstFrame();
|
||||
}
|
||||
|
||||
void HandleAudioWaited(MediaData::Type aType) override
|
||||
{
|
||||
@ -850,7 +880,6 @@ public:
|
||||
|
||||
void HandleAudioDecoded(MediaData* aAudio) override = 0;
|
||||
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override = 0;
|
||||
void HandleVideoNotDecoded(const MediaResult& aError) override = 0;
|
||||
void HandleAudioWaited(MediaData::Type aType) override = 0;
|
||||
void HandleVideoWaited(MediaData::Type aType) override = 0;
|
||||
void HandleNotWaited(const WaitForDataRejectValue& aRejection) override = 0;
|
||||
@ -990,7 +1019,30 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void HandleVideoNotDecoded(const MediaResult& aError) override;
|
||||
void HandleWaitingForVideo() override
|
||||
{
|
||||
MOZ_ASSERT(!mDoneVideoSeeking);
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
}
|
||||
|
||||
void HandleVideoCanceled() override
|
||||
{
|
||||
MOZ_ASSERT(!mDoneVideoSeeking);
|
||||
RequestVideoData();
|
||||
}
|
||||
|
||||
void HandleEndOfVideo() override
|
||||
{
|
||||
MOZ_ASSERT(!mDoneVideoSeeking);
|
||||
if (mFirstVideoFrameAfterSeek) {
|
||||
// Hit the end of stream. Move mFirstVideoFrameAfterSeek into
|
||||
// mSeekedVideoData so we have something to display after seeking.
|
||||
mMaster->PushVideo(mFirstVideoFrameAfterSeek);
|
||||
}
|
||||
VideoQueue().Finish();
|
||||
mDoneVideoSeeking = true;
|
||||
MaybeFinishSeek();
|
||||
}
|
||||
|
||||
void HandleAudioWaited(MediaData::Type aType) override
|
||||
{
|
||||
@ -1427,7 +1479,27 @@ private:
|
||||
// handled by other states after seeking.
|
||||
}
|
||||
|
||||
void HandleVideoNotDecoded(const MediaResult& aError) override;
|
||||
void HandleWaitingForVideo() override
|
||||
{
|
||||
MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
|
||||
MOZ_ASSERT(NeedMoreVideo());
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
}
|
||||
|
||||
void HandleVideoCanceled() override
|
||||
{
|
||||
MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
|
||||
MOZ_ASSERT(NeedMoreVideo());
|
||||
RequestVideoData();
|
||||
}
|
||||
|
||||
void HandleEndOfVideo() override
|
||||
{
|
||||
MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
|
||||
MOZ_ASSERT(NeedMoreVideo());
|
||||
VideoQueue().Finish();
|
||||
FinishSeek();
|
||||
}
|
||||
|
||||
void HandleAudioWaited(MediaData::Type aType) override
|
||||
{
|
||||
@ -1720,8 +1792,6 @@ public:
|
||||
return DECODER_STATE_SHUTDOWN;
|
||||
}
|
||||
|
||||
void HandleVideoNotDecoded(const MediaResult& aError) override {}
|
||||
|
||||
RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(false, "Can't seek in shutdown state.");
|
||||
@ -1766,27 +1836,6 @@ StateObject::HandleNotWaited(const WaitForDataRejectValue& aRejection)
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
MediaDecoderStateMachine::
|
||||
StateObject::HandleVideoNotDecoded(const MediaResult& aError)
|
||||
{
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
HandleWaitingForData();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
mMaster->EnsureVideoDecodeTaskQueued();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
VideoQueue().Finish();
|
||||
HandleEndOfStream();
|
||||
break;
|
||||
default:
|
||||
mMaster->DecodeError(aError);
|
||||
}
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoder::SeekPromise>
|
||||
MediaDecoderStateMachine::
|
||||
StateObject::HandleSeek(SeekTarget aTarget)
|
||||
@ -1983,26 +2032,6 @@ DecodingFirstFrameState::Enter()
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
@ -2182,57 +2211,6 @@ SeekingState::SeekCompleted()
|
||||
SetState<DecodingState>();
|
||||
}
|
||||
|
||||
void
|
||||
MediaDecoderStateMachine::
|
||||
AccurateSeekingState::HandleVideoNotDecoded(const MediaResult& aError)
|
||||
{
|
||||
MOZ_ASSERT(!mDoneVideoSeeking);
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
RequestVideoData();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
if (mFirstVideoFrameAfterSeek) {
|
||||
// Hit the end of stream. Move mFirstVideoFrameAfterSeek into
|
||||
// mSeekedVideoData so we have something to display after seeking.
|
||||
mMaster->PushVideo(mFirstVideoFrameAfterSeek);
|
||||
}
|
||||
VideoQueue().Finish();
|
||||
mDoneVideoSeeking = true;
|
||||
MaybeFinishSeek();
|
||||
break;
|
||||
default:
|
||||
mMaster->DecodeError(aError);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MediaDecoderStateMachine::
|
||||
NextFrameSeekingState::HandleVideoNotDecoded(const MediaResult& aError)
|
||||
{
|
||||
MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
|
||||
MOZ_ASSERT(NeedMoreVideo());
|
||||
// Video seek not finished.
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mMaster->WaitForData(MediaData::VIDEO_DATA);
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
RequestVideoData();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
VideoQueue().Finish();
|
||||
FinishSeek();
|
||||
break;
|
||||
default:
|
||||
// Raise an error since we can't finish video seek anyway.
|
||||
mMaster->DecodeError(aError);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MediaDecoderStateMachine::
|
||||
BufferingState::DispatchDecodeTasksIfNeeded()
|
||||
@ -3081,7 +3059,19 @@ MediaDecoderStateMachine::RequestVideoData(bool aSkipToNextKeyframe,
|
||||
[this] (const MediaResult& aError) {
|
||||
SAMPLE_LOG("OnVideoNotDecoded aError=%u", aError.Code());
|
||||
mVideoDataRequest.Complete();
|
||||
mStateObj->HandleVideoNotDecoded(aError);
|
||||
switch (aError.Code()) {
|
||||
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
|
||||
mStateObj->HandleWaitingForVideo();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_CANCELED:
|
||||
mStateObj->HandleVideoCanceled();
|
||||
break;
|
||||
case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
|
||||
mStateObj->HandleEndOfVideo();
|
||||
break;
|
||||
default:
|
||||
DecodeError(aError);
|
||||
}
|
||||
})
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user