From 89fefa9d1b1afe1ddb5c8e08fc6607784fd7c6f1 Mon Sep 17 00:00:00 2001 From: Paul Adenot Date: Thu, 10 Jan 2013 12:26:18 +0100 Subject: [PATCH] Bug 828901 - Get the seek time as mBasePosition instead of the stream position in video-only stream when changing the playbackRate and seeking at the same time. r=kinetik --- content/media/MediaDecoderStateMachine.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/content/media/MediaDecoderStateMachine.cpp b/content/media/MediaDecoderStateMachine.cpp index 13dbc0ef6fa8..1f477979e4ec 100644 --- a/content/media/MediaDecoderStateMachine.cpp +++ b/content/media/MediaDecoderStateMachine.cpp @@ -2305,11 +2305,8 @@ int64_t MediaDecoderStateMachine::GetVideoStreamPosition() int64_t pos = DurationToUsecs(TimeStamp::Now() - mPlayStartTime) + mPlayDuration; pos -= mBasePosition; - if (pos >= 0) { - int64_t final = mBasePosition + pos * mPlaybackRate + mStartTime; - return final; - } - return mPlayDuration + mStartTime; + NS_ASSERTION(pos >= 0, "Video stream position should be positive."); + return mBasePosition + pos * mPlaybackRate + mStartTime; } int64_t MediaDecoderStateMachine::GetClock() { @@ -2768,12 +2765,14 @@ void MediaDecoderStateMachine::SetPlaybackRate(double aPlaybackRate) // Get position of the last time we changed the rate. if (!HasAudio()) { // mBasePosition is a position in the video stream, not an absolute time. - mBasePosition = GetVideoStreamPosition(); - if (IsPlaying()) { - mPlayDuration = mBasePosition - mStartTime; - mResetPlayStartTime = true; - mPlayStartTime = TimeStamp::Now(); + if (mState == DECODER_STATE_SEEKING) { + mBasePosition = mSeekTime; + } else { + mBasePosition = GetVideoStreamPosition(); } + mPlayDuration = mBasePosition - mStartTime; + mResetPlayStartTime = true; + mPlayStartTime = TimeStamp::Now(); } mPlaybackRate = aPlaybackRate; -- 2.11.4.GIT