From c49e7c5523df7164ddada93fb8d826e96d0752f3 Mon Sep 17 00:00:00 2001 From: dalecurtis Date: Mon, 18 May 2015 22:33:28 -0700 Subject: [PATCH] Don't return wall clock times when time isn't ticking. The video renderer may request wall clock times before the audio renderer has notified the renderer that it has underflowed. We should refuse to convert wall clock times as soon as an underflow state is detected, instead of waiting for the renderer to pause everything on the media thread (which may be backed up for decoding or other events). BUG=489503 TEST=modified underflow test. Review URL: https://codereview.chromium.org/1137323005 Cr-Commit-Position: refs/heads/master@{#330481} --- media/renderers/audio_renderer_impl.cc | 4 +++- media/renderers/audio_renderer_impl_unittest.cc | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc index d17a0689134d6..fe439e25b4edb 100644 --- a/media/renderers/audio_renderer_impl.cc +++ b/media/renderers/audio_renderer_impl.cc @@ -170,8 +170,10 @@ bool AudioRendererImpl::GetWallClockTimes( const std::vector& media_timestamps, std::vector* wall_clock_times) { base::AutoLock auto_lock(lock_); - if (last_render_ticks_.is_null() || !playback_rate_) + if (last_render_ticks_.is_null() || !playback_rate_ || + buffering_state_ != BUFFERING_HAVE_ENOUGH || !sink_playing_) { return false; + } DCHECK(wall_clock_times->empty()); wall_clock_times->reserve(media_timestamps.size()); diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc index 1fe5bdd0a8b3a..119fb76b46491 100644 --- a/media/renderers/audio_renderer_impl_unittest.cc +++ b/media/renderers/audio_renderer_impl_unittest.cc @@ -519,6 +519,10 @@ TEST_F(AudioRendererImplTest, Underflow_Flush) { WaitForPendingRead(); StopTicking(); + // After time stops ticking wall clock times should not be returned. + EXPECT_FALSE( + renderer_->GetWallClockTimes(std::vector(1), nullptr)); + // We shouldn't expect another buffering state change when flushing. FlushDuringPendingRead(); }