summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorkylep@chromium.org <kylep@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-06 22:35:19 +0000
committerkylep@chromium.org <kylep@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-06 22:35:19 +0000
commitba466dbd2288baf8474020a626ef39cb4e570e70 (patch)
tree97e8138fb61aa183bb82db576dc5d7205b630d7f /media
parent3fc364f9059372255062f7e5d009cce3b4d349f2 (diff)
downloadchromium_src-ba466dbd2288baf8474020a626ef39cb4e570e70.zip
chromium_src-ba466dbd2288baf8474020a626ef39cb4e570e70.tar.gz
chromium_src-ba466dbd2288baf8474020a626ef39cb4e570e70.tar.bz2
Fix video sync error when framerate or playback rate is low
BUG=18441 TEST=play a low framerate video or under low rate and verify it stays synced Review URL: http://codereview.chromium.org/160620 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@22683 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/filters/video_renderer_base.cc19
-rw-r--r--media/filters/video_renderer_base_unittest.cc2
2 files changed, 15 insertions, 6 deletions
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc
index 6161852..9f832b4 100644
--- a/media/filters/video_renderer_base.cc
+++ b/media/filters/video_renderer_base.cc
@@ -27,10 +27,13 @@ static const size_t kMaxFrames = 3;
// A higher value will be a slower frame rate, which looks worse but allows the
// audio renderer to catch up faster. A lower value will be a smoother frame
// rate, but results in the video being out of sync for longer.
-//
-// TODO(scherkus): what if the native frame rate is 15 or 10 fps?
static const int64 kMaxSleepMilliseconds = 60;
+// The number of milliseconds to idle when we do not have anything to do.
+// Nothing special about the value, other than we're being more OS-friendly
+// than sleeping for 1 millisecond.
+static const int kIdleMilliseconds = 10;
+
VideoRendererBase::VideoRendererBase()
: width_(0),
height_(0),
@@ -193,10 +196,9 @@ void VideoRendererBase::ThreadMain() {
return;
}
- // Sleep for 10 milliseconds while paused. Nothing special about the value,
- // other than we're being more OS-friendly than sleeping for 1 millisecond.
+ // Sleep while paused or seeking.
if (state == kPaused || state == kSeeking || playback_rate == 0) {
- PlatformThread::Sleep(10);
+ PlatformThread::Sleep(kIdleMilliseconds);
continue;
}
@@ -211,6 +213,13 @@ void VideoRendererBase::ThreadMain() {
continue;
}
+ // Idle if the next frame is too far ahead.
+ base::TimeDelta diff = current_frame_->GetTimestamp() - host()->GetTime();
+ if (diff.InMilliseconds() > kIdleMilliseconds) {
+ PlatformThread::Sleep(kIdleMilliseconds);
+ continue;
+ }
+
// Otherwise we're playing, so advance the frame and keep reading from the
// decoder. |frames_| might be empty if we seeked to the very end of the
// media where no frames were available.
diff --git a/media/filters/video_renderer_base_unittest.cc b/media/filters/video_renderer_base_unittest.cc
index be5afe1..14f7259 100644
--- a/media/filters/video_renderer_base_unittest.cc
+++ b/media/filters/video_renderer_base_unittest.cc
@@ -27,7 +27,7 @@ class MockVideoRendererBase : public VideoRendererBase {
virtual ~MockVideoRendererBase() {}
// VideoRendererBase implementation.
- MOCK_METHOD1(OnInitialize, bool (VideoDecoder* decoder));
+ MOCK_METHOD1(OnInitialize, bool(VideoDecoder* decoder));
MOCK_METHOD0(OnStop, void());
MOCK_METHOD0(OnFrameAvailable, void());