Bug 1325317. Part 1 - move StopMediaSink() out of MediaDecoderStateMachine::Reset().
MozReview-Commit-ID: 6Bso8uxM7Ee
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -428,16 +428,17 @@ public:
? mMaster->GetClock()
: mMaster->GetMediaTime();
mPendingSeek.mTarget.emplace(t, SeekTarget::Accurate);
// SeekJob asserts |mTarget.IsValid() == !mPromise.IsEmpty()| so we
// need to create the promise even it is not used at all.
RefPtr<MediaDecoder::SeekPromise> x = mPendingSeek.mPromise.Ensure(__func__);
mMaster->Reset();
+ mMaster->StopMediaSink();
mMaster->mReader->ReleaseResources();
}
void Exit() override
{
// mPendingSeek is either moved when exiting dormant or
// should be rejected here before transition to SHUTDOWN.
mPendingSeek.RejectIfExists(__func__);
@@ -969,16 +970,17 @@ private:
{
mDoneAudioSeeking = !Info().HasAudio() || mSeekJob.mTarget->IsVideoOnly();
mDoneVideoSeeking = !Info().HasVideo();
if (mSeekJob.mTarget->IsVideoOnly()) {
mMaster->Reset(TrackInfo::kVideoTrack);
} else {
mMaster->Reset();
+ mMaster->StopMediaSink();
}
DemuxerSeek();
}
int64_t CalculateNewCurrentTime() const override
{
const int64_t seekTime = mSeekJob.mTarget->GetTime().ToMicroseconds();
@@ -2266,17 +2268,17 @@ ShutdownState::Enter()
}
master->mAudioDataRequest.DisconnectIfExists();
master->mVideoDataRequest.DisconnectIfExists();
master->mAudioWaitRequest.DisconnectIfExists();
master->mVideoWaitRequest.DisconnectIfExists();
master->Reset();
-
+ master->StopMediaSink();
master->mMediaSink->Shutdown();
// Prevent dangling pointers by disconnecting the listeners.
master->mAudioQueueListener.Disconnect();
master->mVideoQueueListener.Disconnect();
master->mMetadataManager.Disconnect();
master->mOnMediaNotSeekable.Disconnect();
@@ -3377,24 +3379,16 @@ MediaDecoderStateMachine::Reset(TrackSet
MOZ_ASSERT(IsShutdown() ||
mState == DECODER_STATE_SEEKING ||
mState == DECODER_STATE_DORMANT);
// Assert that aTracks specifies to reset the video track because we
// don't currently support resetting just the audio track.
MOZ_ASSERT(aTracks.contains(TrackInfo::kVideoTrack));
- if (aTracks.contains(TrackInfo::kAudioTrack) &&
- aTracks.contains(TrackInfo::kVideoTrack)) {
- // Stop the audio thread. Otherwise, MediaSink might be accessing AudioQueue
- // outside of the decoder monitor while we are clearing the queue and causes
- // crash for no samples to be popped.
- StopMediaSink();
- }
-
if (aTracks.contains(TrackInfo::kVideoTrack)) {
mDecodedVideoEndTime = 0;
mVideoCompleted = false;
VideoQueue().Reset();
mVideoDataRequest.DisconnectIfExists();
mVideoWaitRequest.DisconnectIfExists();
}