From 1058fbba54d4e48a1b34ecfb3e32e8d88e55dfb5 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Tue, 28 Mar 2017 17:20:17 +0800 Subject: [PATCH] Bug 1353607. P5 - change the type of mDecodedAudioEndTime/mDecodedVideoEndTime to TimeUnit. r=kikuo MozReview-Commit-ID: 2bVQD5BViU4 --HG-- extra : rebase_source : bfd903ba579728faee4e52028a475667b4345825 extra : intermediate-source : 7244b47b97aa15dbaea76e39646af208ef49640c extra : source : 3a568910e2e46d766531407a488a3d825700321c --- dom/media/MediaDecoderStateMachine.cpp | 32 +++++++++++--------------- dom/media/MediaDecoderStateMachine.h | 4 ++-- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp index 7b4909649683..a2288ec3d35f 100644 --- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -1892,8 +1892,7 @@ public: { // Resume the video decoder and seek to the last video frame. // This triggers a video-only seek which won't update the playback position. - StateObject::HandleResumeVideoDecoding( - TimeUnit::FromMicroseconds(mMaster->mDecodedVideoEndTime)); + StateObject::HandleResumeVideoDecoding(mMaster->mDecodedVideoEndTime); } void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) override @@ -2323,7 +2322,7 @@ DecodingState::NeedToSkipToNextKeyframe() && (mMaster->GetDecodedAudioDuration().ToMicroseconds() < mMaster->mLowAudioThreshold.ToMicroseconds() * mMaster->mPlaybackRate); bool isLowOnDecodedVideo = - (mMaster->GetClock().ToMicroseconds() - mMaster->mDecodedVideoEndTime) + (mMaster->GetClock() - mMaster->mDecodedVideoEndTime).ToMicroseconds() * mMaster->mPlaybackRate > LOW_VIDEO_THRESHOLD.ToMicroseconds(); bool lowBuffered = mMaster->HasLowBufferedData(); @@ -2612,8 +2611,6 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder, mCurrentFrameID(0), INIT_WATCHABLE(mObservedDuration, TimeUnit()), mReader(new MediaDecoderReaderWrapper(mTaskQueue, aReader)), - mDecodedAudioEndTime(0), - mDecodedVideoEndTime(0), mPlaybackRate(1.0), mLowAudioThreshold(detail::LOW_AUDIO_THRESHOLD), mAmpleAudioThreshold(detail::AMPLE_AUDIO_THRESHOLD), @@ -2764,9 +2761,7 @@ MediaDecoderStateMachine::GetDecodedAudioDuration() // mDecodedAudioEndTime might be smaller than GetClock() when there is // overlap between 2 adjacent audio samples or when we are playing // a chained ogg file. - auto t = std::max( - mDecodedAudioEndTime - GetClock().ToMicroseconds(), 0); - return TimeUnit::FromMicroseconds(t); + return std::max(mDecodedAudioEndTime - GetClock(), TimeUnit::Zero()); } // MediaSink not started. All audio samples are in the queue. return TimeUnit::FromMicroseconds(AudioQueue().Duration()); @@ -3170,8 +3165,8 @@ MediaDecoderStateMachine::RequestAudioData() MOZ_ASSERT(aAudio); mAudioDataRequest.Complete(); // audio->GetEndTime() is not always mono-increasing in chained ogg. - mDecodedAudioEndTime = - std::max(aAudio->GetEndTime(), mDecodedAudioEndTime); + mDecodedAudioEndTime = std::max( + TimeUnit::FromMicroseconds(aAudio->GetEndTime()), mDecodedAudioEndTime); LOGV("OnAudioDecoded [%" PRId64 ",%" PRId64 "]", aAudio->mTime, aAudio->GetEndTime()); mStateObj->HandleAudioDecoded(aAudio); @@ -3216,8 +3211,8 @@ MediaDecoderStateMachine::RequestVideoData(bool aSkipToNextKeyframe, MOZ_ASSERT(aVideo); mVideoDataRequest.Complete(); // Handle abnormal or negative timestamps. - mDecodedVideoEndTime = - std::max(mDecodedVideoEndTime, aVideo->GetEndTime()); + mDecodedVideoEndTime = std::max( + mDecodedVideoEndTime, TimeUnit::FromMicroseconds(aVideo->GetEndTime())); LOGV("OnVideoDecoded [%" PRId64 ",%" PRId64 "]", aVideo->mTime, aVideo->GetEndTime()); mStateObj->HandleVideoDecoded(aVideo, videoDecodeStartTime); @@ -3361,11 +3356,9 @@ MediaDecoderStateMachine::HasLowBufferedData(const TimeUnit& aThreshold) // We are never low in decoded data when we don't have audio/video or have // decoded all audio/video samples. TimeUnit endOfDecodedVideo = (HasVideo() && !VideoQueue().IsFinished()) - ? TimeUnit::FromMicroseconds(mDecodedVideoEndTime) - : TimeUnit::FromInfinity(); + ? mDecodedVideoEndTime : TimeUnit::FromInfinity(); TimeUnit endOfDecodedAudio = (HasAudio() && !AudioQueue().IsFinished()) - ? TimeUnit::FromMicroseconds(mDecodedAudioEndTime) - : TimeUnit::FromInfinity(); + ? mDecodedAudioEndTime : TimeUnit::FromInfinity(); auto endOfDecodedData = std::min(endOfDecodedVideo, endOfDecodedAudio); if (Duration() < endOfDecodedData) { @@ -3481,7 +3474,7 @@ MediaDecoderStateMachine::ResetDecode(TrackSet aTracks) MOZ_ASSERT(aTracks.contains(TrackInfo::kVideoTrack)); if (aTracks.contains(TrackInfo::kVideoTrack)) { - mDecodedVideoEndTime = 0; + mDecodedVideoEndTime = TimeUnit::Zero(); mVideoCompleted = false; VideoQueue().Reset(); mVideoDataRequest.DisconnectIfExists(); @@ -3489,7 +3482,7 @@ MediaDecoderStateMachine::ResetDecode(TrackSet aTracks) } if (aTracks.contains(TrackInfo::kAudioTrack)) { - mDecodedAudioEndTime = 0; + mDecodedAudioEndTime = TimeUnit::Zero(); mAudioCompleted = false; AudioQueue().Reset(); mAudioDataRequest.DisconnectIfExists(); @@ -3839,7 +3832,8 @@ MediaDecoderStateMachine::GetDebugInfo() mMediaSink->IsStarted() ? GetClock().ToMicroseconds() : -1, mMediaSink.get(), ToStateStr(), mPlayState.Ref(), mSentFirstFrameLoadedEvent, IsPlaying(), AudioRequestStatus(), - VideoRequestStatus(), mDecodedAudioEndTime, mDecodedVideoEndTime, + VideoRequestStatus(), mDecodedAudioEndTime.ToMicroseconds(), + mDecodedVideoEndTime.ToMicroseconds(), mAudioCompleted, mVideoCompleted) + mStateObj->GetDebugInfo() + nsCString("\n") + mMediaSink->GetDebugInfo(); diff --git a/dom/media/MediaDecoderStateMachine.h b/dom/media/MediaDecoderStateMachine.h index d00363487a95..3a87ff56be92 100644 --- a/dom/media/MediaDecoderStateMachine.h +++ b/dom/media/MediaDecoderStateMachine.h @@ -562,11 +562,11 @@ private: // The end time of the last decoded audio frame. This signifies the end of // decoded audio data. Used to check if we are low in decoded data. - int64_t mDecodedAudioEndTime; + media::TimeUnit mDecodedAudioEndTime; // The end time of the last decoded video frame. Used to check if we are low // on decoded video data. - int64_t mDecodedVideoEndTime; + media::TimeUnit mDecodedVideoEndTime; // Playback rate. 1.0 : normal speed, 0.5 : two times slower. double mPlaybackRate;