From 87ac9d5c416e0926a1d87f26be851b9aa363c977 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Mon, 1 Sep 2014 14:52:39 +1000 Subject: [PATCH] Bug 1055843 - Do not pause when playbackRate = 0. Instead don't play anything. r=padenot --- content/html/content/src/HTMLMediaElement.cpp | 6 +++--- content/media/MediaDecoder.cpp | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/content/html/content/src/HTMLMediaElement.cpp b/content/html/content/src/HTMLMediaElement.cpp index 5196215fb7a..ba692e972ea 100755 --- a/content/html/content/src/HTMLMediaElement.cpp +++ b/content/html/content/src/HTMLMediaElement.cpp @@ -3840,9 +3840,9 @@ HTMLMediaElement::SetPlaybackRate(double aPlaybackRate, ErrorResult& aRv) mPlaybackRate = ClampPlaybackRate(aPlaybackRate); - if (mPlaybackRate < 0 || - mPlaybackRate > THRESHOLD_HIGH_PLAYBACKRATE_AUDIO || - mPlaybackRate < THRESHOLD_LOW_PLAYBACKRATE_AUDIO) { + if (mPlaybackRate != 0.0 && + (mPlaybackRate < 0 || mPlaybackRate > THRESHOLD_HIGH_PLAYBACKRATE_AUDIO || + mPlaybackRate < THRESHOLD_LOW_PLAYBACKRATE_AUDIO)) { SetMutedInternal(mMuted | MUTED_BY_INVALID_PLAYBACK_RATE); } else { SetMutedInternal(mMuted & ~MUTED_BY_INVALID_PLAYBACK_RATE); diff --git a/content/media/MediaDecoder.cpp b/content/media/MediaDecoder.cpp index b8ab53a00c1..9fed2fca1ed 100644 --- a/content/media/MediaDecoder.cpp +++ b/content/media/MediaDecoder.cpp @@ -609,6 +609,9 @@ nsresult MediaDecoder::Play() MOZ_ASSERT(NS_IsMainThread()); ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); NS_ASSERTION(mDecoderStateMachine != nullptr, "Should have state machine."); + if (mPausedForPlaybackRateNull) { + return NS_OK; + } nsresult res = ScheduleStateMachineThread(); NS_ENSURE_SUCCESS(res,res); if ((mPlayState == PLAY_STATE_LOADING && mIsDormant) || mPlayState == PLAY_STATE_SEEKING) { @@ -1437,17 +1440,23 @@ bool MediaDecoder::OnStateMachineThread() const void MediaDecoder::SetPlaybackRate(double aPlaybackRate) { - if (aPlaybackRate == 0) { + if (aPlaybackRate == mInitialPlaybackRate) { + return; + } + + if (aPlaybackRate == 0.0) { mPausedForPlaybackRateNull = true; + mInitialPlaybackRate = aPlaybackRate; Pause(); return; } else if (mPausedForPlaybackRateNull) { + // Play() uses mPausedForPlaybackRateNull value, so must reset it first + mPausedForPlaybackRateNull = false; // If the playbackRate is no longer null, restart the playback, iff the // media was playing. if (mOwner && !mOwner->GetPaused()) { Play(); } - mPausedForPlaybackRateNull = false; } if (mDecoderStateMachine) {