Bug 1309142. Part 2 - add StateObject::HandleShutdown().
MozReview-Commit-ID: 64VPA1fxLzF
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -209,16 +209,18 @@ public:
virtual bool HandleEndOfStream() { return false; }
virtual bool HandleWaitingForData() { return false; }
virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) = 0;
virtual bool HandleAudioCaptured() { return false; }
+ virtual RefPtr<ShutdownPromise> HandleShutdown();
+
virtual void DumpDebugInfo() {}
protected:
using Master = MediaDecoderStateMachine;
explicit StateObject(Master* aPtr) : mMaster(aPtr) {}
TaskQueue* OwnerThread() const { return mMaster->mTaskQueue; }
MediaResource* Resource() const { return mMaster->mResource; }
MediaDecoderReaderWrapper* Reader() const { return mMaster->mReader; }
@@ -880,16 +882,22 @@ public:
return true;
}
RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
{
MOZ_DIAGNOSTIC_ASSERT(false, "Can't seek in shutdown state.");
return MediaDecoder::SeekPromise::CreateAndReject(true, __func__);
}
+
+ RefPtr<ShutdownPromise> HandleShutdown() override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
+ return nullptr;
+ }
};
bool
MediaDecoderStateMachine::
StateObject::HandleDormant(bool aDormant)
{
if (!aDormant) {
return true;
@@ -901,16 +909,30 @@ StateObject::HandleDormant(bool aDormant
// SeekJob asserts |mTarget.IsValid() == !mPromise.IsEmpty()| so we
// need to create the promise even it is not used at all.
RefPtr<MediaDecoder::SeekPromise> unused =
mMaster->mQueuedSeek.mPromise.Ensure(__func__);
SetState<DormantState>();
return true;
}
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::
+StateObject::HandleShutdown()
+{
+ auto master = mMaster;
+ SetState<ShutdownState>();
+
+ return master->mReader->Shutdown()
+ ->Then(master->OwnerThread(), __func__, master,
+ &MediaDecoderStateMachine::FinishShutdown,
+ &MediaDecoderStateMachine::FinishShutdown)
+ ->CompletionPromise();
+}
+
void
MediaDecoderStateMachine::
DecodeMetadataState::OnMetadataRead(MetadataHolder* aMetadata)
{
mMetadataRequest.Complete();
// Set mode to PLAYBACK after reading metadata.
Resource()->SetReadMode(MediaCacheStream::MODE_PLAYBACK);
@@ -2139,26 +2161,17 @@ MediaDecoderStateMachine::SetDormant(boo
MOZ_ASSERT(OnTaskQueue());
mStateObj->HandleDormant(aDormant);
}
RefPtr<ShutdownPromise>
MediaDecoderStateMachine::Shutdown()
{
MOZ_ASSERT(OnTaskQueue());
-
- mStateObj->SetState<ShutdownState>();
-
- // Put a task in the decode queue to shutdown the reader.
- // the queue to spin down.
- return mReader->Shutdown()
- ->Then(OwnerThread(), __func__, this,
- &MediaDecoderStateMachine::FinishShutdown,
- &MediaDecoderStateMachine::FinishShutdown)
- ->CompletionPromise();
+ return mStateObj->HandleShutdown();
}
void MediaDecoderStateMachine::PlayStateChanged()
{
MOZ_ASSERT(OnTaskQueue());
if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
mVideoDecodeSuspendTimer.Reset();