Bug 1300956. Part 8 - Implement CompletedState.
MozReview-Commit-ID: KsgjLPShe2N
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -341,16 +341,43 @@ public:
}
State GetState() const override
{
return DECODER_STATE_BUFFERING;
}
};
+class MediaDecoderStateMachine::CompletedState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit CompletedState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter() override
+ {
+ mMaster->ScheduleStateMachine();
+ }
+
+ void Exit() override
+ {
+ mMaster->mSentPlaybackEndedEvent = false;
+ }
+
+ void Step() override
+ {
+ mMaster->StepCompleted();
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_COMPLETED;
+ }
+};
+
#define INIT_WATCHABLE(name, val) \
name(val, "MediaDecoderStateMachine::" #name)
#define INIT_MIRROR(name, val) \
name(mTaskQueue, val, "MediaDecoderStateMachine::" #name " (Mirror)")
#define INIT_CANONICAL(name, val) \
name(mTaskQueue, val, "MediaDecoderStateMachine::" #name " (Canonical)")
MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
@@ -1226,16 +1253,19 @@ MediaDecoderStateMachine::SetState(State
mStateObj = MakeUnique<DecodingState>(this);
break;
case DECODER_STATE_SEEKING:
mStateObj = MakeUnique<SeekingState>(this);
break;
case DECODER_STATE_BUFFERING:
mStateObj = MakeUnique<BufferingState>(this);
break;
+ case DECODER_STATE_COMPLETED:
+ mStateObj = MakeUnique<CompletedState>(this);
+ break;
default:
mStateObj = nullptr;
break;
}
EnterState();
}
@@ -1246,19 +1276,16 @@ MediaDecoderStateMachine::ExitState()
if (mStateObj) {
MOZ_ASSERT(mState == mStateObj->GetState());
mStateObj->Exit();
return;
}
switch (mState) {
- case DECODER_STATE_COMPLETED:
- mSentPlaybackEndedEvent = false;
- break;
case DECODER_STATE_SHUTDOWN:
MOZ_DIAGNOSTIC_ASSERT(false, "Shouldn't escape the SHUTDOWN state.");
break;
default:
break;
}
}
@@ -1269,19 +1296,16 @@ MediaDecoderStateMachine::EnterState()
if (mStateObj) {
MOZ_ASSERT(mState == mStateObj->GetState());
mStateObj->Enter();
return;
}
switch (mState) {
- case DECODER_STATE_COMPLETED:
- ScheduleStateMachine();
- break;
case DECODER_STATE_SHUTDOWN:
mIsShutdown = true;
break;
default:
break;
}
}
@@ -2427,24 +2451,16 @@ MediaDecoderStateMachine::RunStateMachin
mDelayedScheduler.Reset(); // Must happen on state machine task queue.
mDispatchedStateMachine = false;
if (mStateObj) {
mStateObj->Step();
return;
}
-
- switch (mState) {
- case DECODER_STATE_COMPLETED:
- StepCompleted();
- return;
- default:
- return;
- }
}
void
MediaDecoderStateMachine::StepDecoding()
{
MOZ_ASSERT(OnTaskQueue());
if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING && IsPlaying()) {