diff options
author | kylep@chromium.org <kylep@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-06 22:35:19 +0000 |
---|---|---|
committer | kylep@chromium.org <kylep@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-06 22:35:19 +0000 |
commit | ba466dbd2288baf8474020a626ef39cb4e570e70 (patch) | |
tree | 97e8138fb61aa183bb82db576dc5d7205b630d7f /media | |
parent | 3fc364f9059372255062f7e5d009cce3b4d349f2 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | media/filters/video_renderer_base_unittest.cc | 2 |
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()); |