Bug 1314884. Part 4 - extract the code of HandleSeek() to the parent class.
DormantState, DecodingState, SeekingState, BufferingState and CompletedState have exactly the same implementation of HandleSeek().
We can extract the code to avoid duplication.
MozReview-Commit-ID: 8maxjtLoQ1Q
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -195,17 +195,17 @@ public:
// Event handlers for various events.
virtual void HandleCDMProxyReady() {}
virtual void HandleAudioDecoded(MediaData* aAudio) {}
virtual void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) {}
virtual void HandleEndOfStream() {}
virtual void HandleWaitingForData() {}
virtual void HandleAudioCaptured() {}
- virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) = 0;
+ virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
virtual RefPtr<ShutdownPromise> HandleShutdown();
virtual void HandleVideoSuspendTimeout() = 0;
virtual void HandleResumeVideoDecoding();
virtual void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) {}
@@ -429,18 +429,16 @@ public:
mPendingSeek.RejectIfExists(__func__);
}
State GetState() const override
{
return DECODER_STATE_DORMANT;
}
- RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
-
void HandleVideoSuspendTimeout() override
{
// Do nothing since we've released decoders in Enter().
}
void HandleResumeVideoDecoding() override
{
// Do nothing since we won't resume decoding until exiting dormant.
@@ -585,18 +583,16 @@ public:
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
{
mMaster->Push(aVideo, MediaData::VIDEO_DATA);
MaybeStopPrerolling();
CheckSlowDecoding(aDecodeStart);
}
- RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
-
void HandleEndOfStream() override;
void HandleWaitingForData() override
{
MaybeStopPrerolling();
}
void HandleAudioCaptured() override
@@ -843,18 +839,16 @@ public:
MOZ_ASSERT(false);
}
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
{
MOZ_ASSERT(false);
}
- RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
-
void HandleVideoSuspendTimeout() override
{
// Do nothing since we want a valid video frame to show when seek is done.
}
void HandleResumeVideoDecoding() override
{
// We set mVideoDecodeSuspended to false in Enter().
@@ -962,18 +956,16 @@ public:
// This might be the sample we need to exit buffering.
// Schedule Step() to check it.
mMaster->Push(aVideo, MediaData::VIDEO_DATA);
mMaster->ScheduleStateMachine();
}
void HandleEndOfStream() override;
- RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
-
void HandleVideoSuspendTimeout() override
{
if (mMaster->HasVideo()) {
mMaster->mVideoDecodeSuspended = true;
mMaster->mOnPlaybackEvent.Notify(MediaEventType::EnterVideoSuspend);
Reader()->SetVideoBlankDecode(true);
}
}
@@ -1054,18 +1046,16 @@ public:
}
}
State GetState() const override
{
return DECODER_STATE_COMPLETED;
}
- RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
-
void HandleAudioCaptured() override
{
// MediaSink is changed. Schedule Step() to check if we can start playback.
mMaster->ScheduleStateMachine();
}
void HandleVideoSuspendTimeout() override
{
@@ -1129,16 +1119,26 @@ public:
}
void HandleResumeVideoDecoding() override
{
MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
}
};
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+StateObject::HandleSeek(SeekTarget aTarget)
+{
+ SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+ SeekJob seekJob;
+ seekJob.mTarget = aTarget;
+ return SetState<SeekingState>(Move(seekJob));
+}
+
RefPtr<ShutdownPromise>
MediaDecoderStateMachine::
StateObject::HandleShutdown()
{
return SetState<ShutdownState>();
}
static void
@@ -1271,26 +1271,16 @@ DecodeMetadataState::OnMetadataRead(Meta
// Metadata parsing was successful but we're still waiting for CDM caps
// to become available so that we can build the correct decryptor/decoder.
SetState<WaitForCDMState>();
} else {
SetState<DecodingFirstFrameState>(SeekJob{});
}
}
-RefPtr<MediaDecoder::SeekPromise>
-MediaDecoderStateMachine::
-DormantState::HandleSeek(SeekTarget aTarget)
-{
- // Exit dormant when the user wants to seek.
- SeekJob seekJob;
- seekJob.mTarget = aTarget;
- return SetState<SeekingState>(Move(seekJob));
-}
-
void
MediaDecoderStateMachine::
DormantState::HandlePlayStateChanged(MediaDecoder::PlayState aPlayState)
{
if (aPlayState == MediaDecoder::PLAY_STATE_PLAYING) {
// Exit dormant when the user wants to play.
MOZ_ASSERT(!Info().IsEncrypted() || mMaster->mCDMProxy);
MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
@@ -1345,20 +1335,17 @@ DecodingFirstFrameState::HandleSeek(Seek
mPendingSeek.mTarget = aTarget;
return mPendingSeek.mPromise.Ensure(__func__);
}
// Since ForceZeroStartTime() is true, we should've transitioned to SEEKING
// in Enter() if there is any pending seek.
MOZ_ASSERT(!mPendingSeek.Exists());
- SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
- SeekJob seekJob;
- seekJob.mTarget = aTarget;
- return SetState<SeekingState>(Move(seekJob));
+ return StateObject::HandleSeek(aTarget);
}
void
MediaDecoderStateMachine::
DecodingFirstFrameState::MaybeFinishDecodeFirstFrame()
{
MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
@@ -1405,26 +1392,16 @@ DecodingState::Enter()
mMaster->ScheduleStateMachine();
// Will enter dormant when playback is paused for a while.
if (mMaster->mPlayState == MediaDecoder::PLAY_STATE_PAUSED) {
StartDormantTimer();
}
}
-RefPtr<MediaDecoder::SeekPromise>
-MediaDecoderStateMachine::
-DecodingState::HandleSeek(SeekTarget aTarget)
-{
- SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
- SeekJob seekJob;
- seekJob.mTarget = aTarget;
- return SetState<SeekingState>(Move(seekJob));
-}
-
void
MediaDecoderStateMachine::
DecodingState::HandleEndOfStream()
{
if (mMaster->CheckIfDecodeComplete()) {
SetState<CompletedState>();
} else {
MaybeStopPrerolling();
@@ -1460,26 +1437,16 @@ DecodingState::MaybeStartBuffering()
(mMaster->OutOfDecodedAudio() && Reader()->IsWaitingAudioData()) ||
(mMaster->OutOfDecodedVideo() && Reader()->IsWaitingVideoData());
}
if (shouldBuffer) {
SetState<BufferingState>();
}
}
-RefPtr<MediaDecoder::SeekPromise>
-MediaDecoderStateMachine::
-SeekingState::HandleSeek(SeekTarget aTarget)
-{
- SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
- SeekJob seekJob;
- seekJob.mTarget = aTarget;
- return SetState<SeekingState>(Move(seekJob));
-}
-
void
MediaDecoderStateMachine::
SeekingState::SeekCompleted()
{
int64_t seekTime = mSeekTask->GetSeekTarget().GetTime().ToMicroseconds();
int64_t newCurrentTime = seekTime;
// Setup timestamp state.
@@ -1607,36 +1574,16 @@ BufferingState::HandleEndOfStream()
if (mMaster->CheckIfDecodeComplete()) {
SetState<CompletedState>();
} else {
// Check if we can exit buffering.
mMaster->ScheduleStateMachine();
}
}
-RefPtr<MediaDecoder::SeekPromise>
-MediaDecoderStateMachine::
-BufferingState::HandleSeek(SeekTarget aTarget)
-{
- SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
- SeekJob seekJob;
- seekJob.mTarget = aTarget;
- return SetState<SeekingState>(Move(seekJob));
-}
-
-RefPtr<MediaDecoder::SeekPromise>
-MediaDecoderStateMachine::
-CompletedState::HandleSeek(SeekTarget aTarget)
-{
- SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
- SeekJob seekJob;
- seekJob.mTarget = aTarget;
- return SetState<SeekingState>(Move(seekJob));
-}
-
RefPtr<ShutdownPromise>
MediaDecoderStateMachine::
ShutdownState::Enter()
{
auto master = mMaster;
master->mIsShutdown = true;
master->mDelayedScheduler.Reset();