Bug 1309142. Part 1 - move some code to the entry action of ShutdownState.
MozReview-Commit-ID: 81RgoNaTDVH
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -858,20 +858,17 @@ private:
};
class MediaDecoderStateMachine::ShutdownState
: public MediaDecoderStateMachine::StateObject
{
public:
explicit ShutdownState(Master* aPtr) : StateObject(aPtr) {}
- void Enter() override
- {
- mMaster->mIsShutdown = true;
- }
+ void Enter() override;
void Exit() override
{
MOZ_DIAGNOSTIC_ASSERT(false, "Shouldn't escape the SHUTDOWN state.");
}
State GetState() const override
{
@@ -1360,16 +1357,78 @@ CompletedState::HandleSeek(SeekTarget aT
SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SeekJob seekJob;
seekJob.mTarget = aTarget;
RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
SetState<SeekingState>(Move(seekJob));
return p.forget();
}
+void
+MediaDecoderStateMachine::
+ShutdownState::Enter()
+{
+ auto master = mMaster;
+
+ master->mIsShutdown = true;
+ master->mDelayedScheduler.Reset();
+ master->mBufferedUpdateRequest.DisconnectIfExists();
+ master->mQueuedSeek.RejectIfExists(__func__);
+
+ // Shutdown happens while decode timer is active, we need to disconnect and
+ // dispose of the timer.
+ master->mVideoDecodeSuspendTimer.Reset();
+
+ master->mCDMProxyPromise.DisconnectIfExists();
+
+ if (master->IsPlaying()) {
+ master->StopPlayback();
+ }
+
+ // To break the cycle-reference between MediaDecoderReaderWrapper and MDSM.
+ master->CancelMediaDecoderReaderWrapperCallback();
+
+ master->Reset();
+
+ master->mMediaSink->Shutdown();
+
+ // Prevent dangling pointers by disconnecting the listeners.
+ master->mAudioQueueListener.Disconnect();
+ master->mVideoQueueListener.Disconnect();
+ master->mMetadataManager.Disconnect();
+
+ // Disconnect canonicals and mirrors before shutting down our task queue.
+ master->mBuffered.DisconnectIfConnected();
+ master->mIsReaderSuspended.DisconnectIfConnected();
+ master->mEstimatedDuration.DisconnectIfConnected();
+ master->mExplicitDuration.DisconnectIfConnected();
+ master->mPlayState.DisconnectIfConnected();
+ master->mNextPlayState.DisconnectIfConnected();
+ master->mVolume.DisconnectIfConnected();
+ master->mPreservesPitch.DisconnectIfConnected();
+ master->mSameOriginMedia.DisconnectIfConnected();
+ master->mMediaPrincipalHandle.DisconnectIfConnected();
+ master->mPlaybackBytesPerSecond.DisconnectIfConnected();
+ master->mPlaybackRateReliable.DisconnectIfConnected();
+ master->mDecoderPosition.DisconnectIfConnected();
+ master->mMediaSeekable.DisconnectIfConnected();
+ master->mMediaSeekableOnlyInBufferedRanges.DisconnectIfConnected();
+ master->mIsVisible.DisconnectIfConnected();
+
+ master->mDuration.DisconnectAll();
+ master->mIsShutdown.DisconnectAll();
+ master->mNextFrameStatus.DisconnectAll();
+ master->mCurrentPosition.DisconnectAll();
+ master->mPlaybackOffset.DisconnectAll();
+ master->mIsAudioDataAudible.DisconnectAll();
+
+ // Shut down the watch manager to stop further notifications.
+ master->mWatchManager.Shutdown();
+}
+
#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,
@@ -2083,74 +2142,16 @@ MediaDecoderStateMachine::SetDormant(boo
RefPtr<ShutdownPromise>
MediaDecoderStateMachine::Shutdown()
{
MOZ_ASSERT(OnTaskQueue());
mStateObj->SetState<ShutdownState>();
- mDelayedScheduler.Reset();
-
- mBufferedUpdateRequest.DisconnectIfExists();
-
- mQueuedSeek.RejectIfExists(__func__);
-
- // Shutdown happens will decode timer is active, we need to disconnect and
- // dispose of the timer.
- mVideoDecodeSuspendTimer.Reset();
-
- mCDMProxyPromise.DisconnectIfExists();
-
- if (IsPlaying()) {
- StopPlayback();
- }
-
- // To break the cycle-reference between MediaDecoderReaderWrapper and MDSM.
- CancelMediaDecoderReaderWrapperCallback();
-
- Reset();
-
- mMediaSink->Shutdown();
-
- // Prevent dangling pointers by disconnecting the listeners.
- mAudioQueueListener.Disconnect();
- mVideoQueueListener.Disconnect();
- mMetadataManager.Disconnect();
-
- // Disconnect canonicals and mirrors before shutting down our task queue.
- mBuffered.DisconnectIfConnected();
- mIsReaderSuspended.DisconnectIfConnected();
- mEstimatedDuration.DisconnectIfConnected();
- mExplicitDuration.DisconnectIfConnected();
- mPlayState.DisconnectIfConnected();
- mNextPlayState.DisconnectIfConnected();
- mVolume.DisconnectIfConnected();
- mPreservesPitch.DisconnectIfConnected();
- mSameOriginMedia.DisconnectIfConnected();
- mMediaPrincipalHandle.DisconnectIfConnected();
- mPlaybackBytesPerSecond.DisconnectIfConnected();
- mPlaybackRateReliable.DisconnectIfConnected();
- mDecoderPosition.DisconnectIfConnected();
- mMediaSeekable.DisconnectIfConnected();
- mMediaSeekableOnlyInBufferedRanges.DisconnectIfConnected();
- mIsVisible.DisconnectIfConnected();
-
- mDuration.DisconnectAll();
- mIsShutdown.DisconnectAll();
- mNextFrameStatus.DisconnectAll();
- mCurrentPosition.DisconnectAll();
- mPlaybackOffset.DisconnectAll();
- mIsAudioDataAudible.DisconnectAll();
-
- // Shut down the watch manager to stop further notifications.
- mWatchManager.Shutdown();
-
- DECODER_LOG("Shutdown started");
-
// 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();
}