From c157381ae5828b227a1aecbc2010586d2a4f3bca Mon Sep 17 00:00:00 2001 From: Matthew Gregan Date: Thu, 10 Jun 2010 15:46:58 +1200 Subject: [PATCH] Bug 568162 - More accurate frame end time after seeking for WebM. r=cpearce --- content/media/webm/nsWebMReader.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/media/webm/nsWebMReader.cpp b/content/media/webm/nsWebMReader.cpp index 37a53e335ff2..339650d3e9c9 100644 --- a/content/media/webm/nsWebMReader.cpp +++ b/content/media/webm/nsWebMReader.cpp @@ -626,12 +626,10 @@ nsresult nsWebMReader::Seek(PRInt64 aTarget, PRInt64 aStartTime, PRInt64 aEndTim return NS_ERROR_FAILURE; } if (HasVideo()) { - nsAutoPtr video; PRBool eof = PR_FALSE; PRInt64 startTime = -1; - video = nsnull; while (HasVideo() && !eof) { - while (mVideoQueue.GetSize() == 0 && !eof) { + while (mVideoQueue.GetSize() < 2 && !eof) { PRBool skip = PR_FALSE; eof = !DecodeVideoFrame(skip, 0); MonitorAutoExit exitReaderMon(mMonitor); @@ -640,20 +638,22 @@ nsresult nsWebMReader::Seek(PRInt64 aTarget, PRInt64 aStartTime, PRInt64 aEndTim return NS_ERROR_FAILURE; } } - if (mVideoQueue.GetSize() == 0) { + if (mVideoQueue.GetSize() < 2) { break; } - video = mVideoQueue.PeekFront(); + nsAutoPtr video(mVideoQueue.PopFront()); + nsAutoPtr videoNext(mVideoQueue.PeekFront()); // If the frame end time is less than the seek target, we won't want // to display this frame after the seek, so discard it. - if (video && video->mTime + 40 < aTarget) { + if (video && videoNext && videoNext->mTime < aTarget) { if (startTime == -1) { startTime = video->mTime; } - mVideoQueue.PopFront(); video = nsnull; + videoNext.forget(); } else { - video.forget(); + videoNext.forget(); + mVideoQueue.PushFront(video.forget()); break; } }