Bug 1367701 P1 - add a virtual Transit() method; r?jwwang
MozReview-Commit-ID: L0HnYfTdL57
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1020,16 +1020,17 @@ public:
// We set mVideoDecodeSuspended to false in Enter().
MOZ_ASSERT(false, "Shouldn't have suspended video decoding.");
}
protected:
SeekJob mSeekJob;
virtual void DoSeek() = 0;
+ virtual void Transit() { SetState<DecodingState>(); }
void SeekCompleted();
virtual TimeUnit CalculateNewCurrentTime() const = 0;
};
class MediaDecoderStateMachine::AccurateSeekingState
: public MediaDecoderStateMachine::SeekingState
{
public:
@@ -1756,16 +1757,18 @@ public:
mAccurateSeekRequest.DisconnectIfExists();
mFutureSeekJob.RejectIfExists(__func__);
AccurateSeekingState::Exit();
}
private:
MozPromiseRequestHolder<MediaDecoder::SeekPromise> mAccurateSeekRequest;
SeekJob mFutureSeekJob;
+
+ void Transit() override { // No transition after seek completed. }
};
RefPtr<MediaDecoder::SeekPromise>
MediaDecoderStateMachine::DormantState::HandleSeek(SeekTarget aTarget)
{
if (aTarget.IsNextFrame()) {
// NextFrameSeekingState doesn't reset the decoder unlike
// AccurateSeekingState. So we first must come out of dormant by seeking to
@@ -2530,19 +2533,17 @@ SeekingState::SeekCompleted()
SLOG("Seek completed, mCurrentPosition=%" PRId64,
mMaster->mCurrentPosition.Ref().ToMicroseconds());
if (mMaster->VideoQueue().PeekFront()) {
mMaster->mMediaSink->Redraw(Info().mVideo);
mMaster->mOnPlaybackEvent.Notify(MediaEventType::Invalidate);
}
- if (mSeekJob.mTransition) {
- SetState<DecodingState>();
- }
+ Transit();
}
void
MediaDecoderStateMachine::
BufferingState::DispatchDecodeTasksIfNeeded()
{
if (mMaster->IsAudioDecoding()
&& !mMaster->HaveEnoughDecodedAudio()