diff --git a/content/media/nsBuiltinDecoderStateMachine.cpp b/content/media/nsBuiltinDecoderStateMachine.cpp index 6bce566a33d9..48be18750d5d 100644 --- a/content/media/nsBuiltinDecoderStateMachine.cpp +++ b/content/media/nsBuiltinDecoderStateMachine.cpp @@ -164,7 +164,7 @@ PRBool nsBuiltinDecoderStateMachine::HasFutureAudio() const { mDecoder->GetMonitor().AssertCurrentThreadIn(); PRBool aboveLowAudioThreshold = PR_FALSE; if (mAudioEndTime != -1) { - aboveLowAudioThreshold = mAudioEndTime - mCurrentFrameTime + mStartTime > LOW_AUDIO_MS; + aboveLowAudioThreshold = mAudioEndTime - GetMediaTime() > LOW_AUDIO_MS; } return HasAudio() && !mAudioCompleted && @@ -259,7 +259,7 @@ void nsBuiltinDecoderStateMachine::DecodeLoop() PRInt64 audioDecoded = 0; { MonitorAutoEnter mon(mDecoder->GetMonitor()); - currentTime = mCurrentFrameTime + mStartTime; + currentTime = GetMediaTime(); audioDecoded = mReader->mAudioQueue.Duration(); if (mAudioEndTime != -1) { audioDecoded += mAudioEndTime - currentTime; @@ -451,7 +451,7 @@ void nsBuiltinDecoderStateMachine::AudioLoop() break; } - PRInt64 audioAhead = mAudioEndTime - mCurrentFrameTime - mStartTime; + PRInt64 audioAhead = mAudioEndTime - GetMediaTime(); if (audioAhead > AMPLE_AUDIO_MS) { // We've pushed enough audio onto the hardware that we've queued up a // significant amount ahead of the playback position. The decode @@ -653,7 +653,7 @@ void nsBuiltinDecoderStateMachine::UpdatePlaybackPosition(PRInt64 aTime) } // Notify DOM of any queued up audioavailable events - mEventManager.DispatchPendingEvents(mCurrentFrameTime + mStartTime); + mEventManager.DispatchPendingEvents(GetMediaTime()); } void nsBuiltinDecoderStateMachine::ClearPositionChangeFlag() @@ -989,6 +989,7 @@ nsresult nsBuiltinDecoderStateMachine::Run() StopPlayback(AUDIO_SHUTDOWN); StopDecodeThreads(); ResetPlayback(); + PRInt64 currentTime = GetMediaTime(); nsresult res; { MonitorAutoExit exitMon(mDecoder->GetMonitor()); @@ -997,7 +998,7 @@ nsresult nsBuiltinDecoderStateMachine::Run() res = mReader->Seek(seekTime, mStartTime, mEndTime, - mCurrentFrameTime + mStartTime); + currentTime); } if (NS_SUCCEEDED(res)){ PRInt64 audioTime = seekTime; @@ -1035,7 +1036,7 @@ nsresult nsBuiltinDecoderStateMachine::Run() // if we need to seek again. nsCOMPtr stopEvent; - if (mCurrentFrameTime == mEndTime) { + if (GetMediaTime() == mEndTime) { LOG(PR_LOG_DEBUG, ("%p Changed state from SEEKING (to %lldms) to COMPLETED", mDecoder, seekTime)); stopEvent = NS_NewRunnableMethod(mDecoder, &nsBuiltinDecoder::SeekingStoppedAtEnd); diff --git a/content/media/nsBuiltinDecoderStateMachine.h b/content/media/nsBuiltinDecoderStateMachine.h index a934911eec1c..ddc1e003ec0f 100644 --- a/content/media/nsBuiltinDecoderStateMachine.h +++ b/content/media/nsBuiltinDecoderStateMachine.h @@ -338,6 +338,16 @@ protected: // be held. PRBool IsPlaying(); + // Returns the "media time". This is the absolute time which the media + // playback has reached. i.e. this returns values in the range + // [mStartTime, mEndTime], and mStartTime will not be 0 if the media does + // not start at 0. Note this is different to the value returned + // by GetCurrentTime(), which is in the range [0,duration]. + PRInt64 GetMediaTime() const { + mDecoder->GetMonitor().AssertCurrentThreadIn(); + return mStartTime + mCurrentFrameTime; + } + // Monitor on mAudioStream. This monitor must be held in order to delete // or use the audio stream. This stops us destroying the audio stream // while it's being used on another thread (typically when it's being