Bug 1295921 - P4: Clean up suspend timer canceling. r?jwwang
MozReview-Commit-ID: 9yObB8msjtY
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -539,16 +539,22 @@ MediaDecoder::OnPlaybackEvent(MediaEvent
Invalidate();
break;
case MediaEventType::EnterVideoSuspend:
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("mozentervideosuspend"));
break;
case MediaEventType::ExitVideoSuspend:
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("mozexitvideosuspend"));
break;
+ case MediaEventType::BeginVideoSuspend:
+ mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("mozbeginvideosuspend"));
+ break;
+ case MediaEventType::CancelVideoSuspend:
+ mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("mozcancelvideosuspend"));
+ break;
}
}
void
MediaDecoder::OnPlaybackErrorEvent(const MediaResult& aError)
{
DecodeError(aError);
}
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -2135,17 +2135,17 @@ ShutdownState::Enter()
{
auto master = mMaster;
master->mIsShutdown = true;
master->mDelayedScheduler.Reset();
// Shutdown happens while decode timer is active, we need to disconnect and
// dispose of the timer.
- master->mVideoDecodeSuspendTimer.Reset();
+ master->CancelSuspendTimer();
master->mCDMProxyPromise.DisconnectIfExists();
if (master->IsPlaying()) {
master->StopPlayback();
}
// To break the cycle-reference between MediaDecoderReaderWrapper and MDSM.
@@ -2860,17 +2860,17 @@ MediaDecoderStateMachine::Shutdown()
return mStateObj->HandleShutdown();
}
void MediaDecoderStateMachine::PlayStateChanged()
{
MOZ_ASSERT(OnTaskQueue());
if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
- mVideoDecodeSuspendTimer.Reset();
+ CancelSuspendTimer();
} else if (mMinimizePreroll) {
// Once we start playing, we don't want to minimize our prerolling, as we
// assume the user is likely to want to keep playing in future. This needs to
// happen before we invoke StartDecoding().
mMinimizePreroll = false;
DispatchDecodeTasksIfNeeded();
}
@@ -2885,24 +2885,26 @@ void MediaDecoderStateMachine::Visibilit
// Start timer to trigger suspended decoding state when going invisible.
if (!mIsVisible) {
TimeStamp target = TimeStamp::Now() + SuspendBackgroundVideoDelay();
RefPtr<MediaDecoderStateMachine> self = this;
mVideoDecodeSuspendTimer.Ensure(target,
[=]() { self->OnSuspendTimerResolved(); },
- [=]() { self->OnSuspendTimerRejected(); });
+ [] () { MOZ_DIAGNOSTIC_ASSERT(false); });
+ mOnPlaybackEvent.Notify(MediaEventType::BeginVideoSuspend);
+
return;
}
// Resuming from suspended decoding
// If suspend timer exists, destroy it.
- mVideoDecodeSuspendTimer.Reset();
+ CancelSuspendTimer();
if (mVideoDecodeSuspended) {
mStateObj->HandleResumeVideoDecoding();
}
}
void MediaDecoderStateMachine::BufferedRangeUpdated()
{
@@ -3772,19 +3774,21 @@ void
MediaDecoderStateMachine::OnSuspendTimerResolved()
{
DECODER_LOG("OnSuspendTimerResolved");
mVideoDecodeSuspendTimer.CompleteRequest();
mStateObj->HandleVideoSuspendTimeout();
}
void
-MediaDecoderStateMachine::OnSuspendTimerRejected()
+MediaDecoderStateMachine::CancelSuspendTimer()
{
- DECODER_LOG("OnSuspendTimerRejected");
+ DECODER_LOG("CancelSuspendTimer");
MOZ_ASSERT(OnTaskQueue());
- MOZ_ASSERT(!mVideoDecodeSuspended);
- mVideoDecodeSuspendTimer.CompleteRequest();
+ if (mVideoDecodeSuspendTimer.IsScheduled()) {
+ mOnPlaybackEvent.Notify(MediaEventType::CancelVideoSuspend);
+ }
+ mVideoDecodeSuspendTimer.Reset();
}
} // namespace mozilla
#undef NS_DispatchToMainThread
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -116,17 +116,19 @@ extern LazyLogModule gMediaSampleLog;
enum class MediaEventType : int8_t {
PlaybackStarted,
PlaybackStopped,
PlaybackEnded,
SeekStarted,
Invalidate,
EnterVideoSuspend,
- ExitVideoSuspend
+ ExitVideoSuspend,
+ BeginVideoSuspend,
+ CancelVideoSuspend
};
/*
The state machine class. This manages the decoding and seeking in the
MediaDecoderReader on the decode task queue, and A/V sync on the shared
state machine thread, and controls the audio "push" thread.
All internal state is synchronised via the decoder monitor. State changes
@@ -659,17 +661,17 @@ private:
MediaEventListener mVideoCallback;
MediaEventListener mAudioWaitCallback;
MediaEventListener mVideoWaitCallback;
const char* AudioRequestStatus() const;
const char* VideoRequestStatus() const;
void OnSuspendTimerResolved();
- void OnSuspendTimerRejected();
+ void CancelSuspendTimer();
// True if we shouldn't play our audio (but still write it to any capturing
// streams). When this is true, the audio thread will never start again after
// it has stopped.
bool mAudioCaptured;
// True if all audio frames are already rendered.
bool mAudioCompleted = false;