void MediaSourceReader::ContinueShutdown() { ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); if (mTrackBuffers.Length()) { mTrackBuffers[0]->Shutdown()->Then(GetTaskQueue(), __func__, this, &MediaSourceReader::ContinueShutdown, &MediaSourceReader::ContinueShutdown); mShutdownTrackBuffers.AppendElement(mTrackBuffers[0]); mTrackBuffers.RemoveElementAt(0); return; } mAudioTrack = nullptr; mAudioSourceDecoder = nullptr; mVideoTrack = nullptr; mVideoSourceDecoder = nullptr; #ifdef MOZ_FMP4 if (mSharedDecoderManager) { mSharedDecoderManager->Shutdown(); mSharedDecoderManager = nullptr; } #endif MOZ_ASSERT(mAudioPromise.IsEmpty()); MOZ_ASSERT(mVideoPromise.IsEmpty()); mAudioWaitPromise.RejectIfExists(WaitForDataRejectValue(MediaData::AUDIO_DATA, WaitForDataRejectValue::SHUTDOWN), __func__); mVideoWaitPromise.RejectIfExists(WaitForDataRejectValue(MediaData::VIDEO_DATA, WaitForDataRejectValue::SHUTDOWN), __func__); MediaDecoderReader::Shutdown()->ChainTo(mMediaSourceShutdownPromise.Steal(), __func__); }
nsresult MediaSourceReader::ResetDecode() { MOZ_ASSERT(OnTaskQueue()); ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); MSE_DEBUG(""); // Any previous requests we've been waiting on are now unwanted. mAudioRequest.DisconnectIfExists(); mVideoRequest.DisconnectIfExists(); mAudioSeekRequest.DisconnectIfExists(); mVideoSeekRequest.DisconnectIfExists(); // Additionally, reject any outstanding promises _we_ made that we might have // been waiting on the above to fulfill. mAudioPromise.RejectIfExists(CANCELED, __func__); mVideoPromise.RejectIfExists(CANCELED, __func__); mSeekPromise.RejectIfExists(NS_OK, __func__); // Do the same for any data wait promises. mAudioWaitPromise.RejectIfExists(WaitForDataRejectValue(MediaData::AUDIO_DATA, WaitForDataRejectValue::CANCELED), __func__); mVideoWaitPromise.RejectIfExists(WaitForDataRejectValue(MediaData::VIDEO_DATA, WaitForDataRejectValue::CANCELED), __func__); // Reset miscellaneous seeking state. mWaitingForSeekData = false; mPendingSeekTime = -1; // Reset force video decode ahead. mForceVideoDecodeAhead = false; // Reset all the readers. if (GetAudioReader()) { GetAudioReader()->ResetDecode(); } if (GetVideoReader()) { GetVideoReader()->ResetDecode(); } return MediaDecoderReader::ResetDecode(); }