Bug 1286793 - register visibility changes only when needed. r=dglastonbury
MozReview-Commit-ID: JTlDPh3ql7A
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -338,32 +338,35 @@ MediaDecoderStateMachine::Initialization
mPreservesPitch.Connect(aDecoder->CanonicalPreservesPitch());
mSameOriginMedia.Connect(aDecoder->CanonicalSameOriginMedia());
mMediaPrincipalHandle.Connect(aDecoder->CanonicalMediaPrincipalHandle());
mPlaybackBytesPerSecond.Connect(aDecoder->CanonicalPlaybackBytesPerSecond());
mPlaybackRateReliable.Connect(aDecoder->CanonicalPlaybackRateReliable());
mDecoderPosition.Connect(aDecoder->CanonicalDecoderPosition());
mMediaSeekable.Connect(aDecoder->CanonicalMediaSeekable());
mMediaSeekableOnlyInBufferedRanges.Connect(aDecoder->CanonicalMediaSeekableOnlyInBufferedRanges());
- mIsVisible.Connect(aDecoder->CanonicalIsVisible());
// Initialize watchers.
mWatchManager.Watch(mBuffered, &MediaDecoderStateMachine::BufferedRangeUpdated);
mWatchManager.Watch(mIsReaderSuspended, &MediaDecoderStateMachine::ReaderSuspendedChanged);
mWatchManager.Watch(mState, &MediaDecoderStateMachine::UpdateNextFrameStatus);
mWatchManager.Watch(mAudioCompleted, &MediaDecoderStateMachine::UpdateNextFrameStatus);
mWatchManager.Watch(mVideoCompleted, &MediaDecoderStateMachine::UpdateNextFrameStatus);
mWatchManager.Watch(mVolume, &MediaDecoderStateMachine::VolumeChanged);
mWatchManager.Watch(mLogicalPlaybackRate, &MediaDecoderStateMachine::LogicalPlaybackRateChanged);
mWatchManager.Watch(mPreservesPitch, &MediaDecoderStateMachine::PreservesPitchChanged);
mWatchManager.Watch(mEstimatedDuration, &MediaDecoderStateMachine::RecomputeDuration);
mWatchManager.Watch(mExplicitDuration, &MediaDecoderStateMachine::RecomputeDuration);
mWatchManager.Watch(mObservedDuration, &MediaDecoderStateMachine::RecomputeDuration);
mWatchManager.Watch(mPlayState, &MediaDecoderStateMachine::PlayStateChanged);
- mWatchManager.Watch(mIsVisible, &MediaDecoderStateMachine::VisibilityChanged);
+
+ if (MediaPrefs::MDSMSuspendBackgroundVideoEnabled()) {
+ mIsVisible.Connect(aDecoder->CanonicalIsVisible());
+ mWatchManager.Watch(mIsVisible, &MediaDecoderStateMachine::VisibilityChanged);
+ }
// Configure MediaDecoderReaderWrapper.
SetMediaDecoderReaderWrapperCallback();
}
void
MediaDecoderStateMachine::AudioAudibleChanged(bool aAudible)
{
@@ -1335,25 +1338,20 @@ void MediaDecoderStateMachine::PlayState
}
ScheduleStateMachine();
}
void MediaDecoderStateMachine::VisibilityChanged()
{
MOZ_ASSERT(OnTaskQueue());
- DECODER_LOG("VisibilityChanged: is visible = %d, video decode suspended = %d, "
- "reader suspended = %d",
+ DECODER_LOG("VisibilityChanged: mIsVisible=%d, "
+ "mVideoDecodeSuspended=%d, mIsReaderSuspended=%d",
mIsVisible.Ref(), mVideoDecodeSuspended, mIsReaderSuspended.Ref());
- // Not suspending background videos so there's nothing to do.
- if (!MediaPrefs::MDSMSuspendBackgroundVideoEnabled()) {
- return;
- }
-
if (!HasVideo()) {
return;
}
// If not playing then there's nothing to do.
if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
return;
}
@@ -2653,18 +2651,17 @@ bool MediaDecoderStateMachine::IsStateMa
{
MOZ_ASSERT(OnTaskQueue());
return mDispatchedStateMachine || mDelayedScheduler.IsScheduled();
}
bool MediaDecoderStateMachine::IsVideoDecodeSuspended() const
{
MOZ_ASSERT(OnTaskQueue());
- return (MediaPrefs::MDSMSuspendBackgroundVideoEnabled() && mVideoDecodeSuspended) ||
- mIsReaderSuspended;
+ return mVideoDecodeSuspended || mIsReaderSuspended;
}
void
MediaDecoderStateMachine::LogicalPlaybackRateChanged()
{
MOZ_ASSERT(OnTaskQueue());
if (mLogicalPlaybackRate == 0) {