Chromium Code Reviews| Index: media/renderers/audio_renderer_impl.cc |
| diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc |
| index c653bfccbdcbe95ac2c3ba0a522a46b9ec607e66..4672504f2d5c68455c02250fc67e4fd7649d6155 100644 |
| --- a/media/renderers/audio_renderer_impl.cc |
| +++ b/media/renderers/audio_renderer_impl.cc |
| @@ -57,6 +57,7 @@ AudioRendererImpl::AudioRendererImpl( |
| received_end_of_stream_(false), |
| rendered_end_of_stream_(false), |
| is_suspending_(false), |
| + last_media_time_(kNoTimestamp), |
| weak_factory_(this) { |
| audio_buffer_stream_->set_splice_observer(base::Bind( |
| &AudioRendererImpl::OnNewSpliceBuffer, weak_factory_.GetWeakPtr())); |
| @@ -171,11 +172,27 @@ void AudioRendererImpl::SetMediaTime(base::TimeDelta time) { |
| last_render_time_ = stop_rendering_time_ = base::TimeTicks(); |
| first_packet_timestamp_ = kNoTimestamp; |
| audio_clock_.reset(new AudioClock(time, audio_parameters_.sample_rate())); |
| + last_media_time_ = kNoTimestamp; |
| } |
| base::TimeDelta AudioRendererImpl::CurrentMediaTime() { |
| base::AutoLock auto_lock(lock_); |
| + // Re-use last reported time if rendering has stopped to avoid confusing blink |
| + // layer (avoid currentTime advancing while after signaling buffer underflow). |
|
sandersd (OOO until July 31)
2016/10/17 23:37:37
Remove 'while'.
chcunningham
2016/10/17 23:49:17
Done.
|
| + // TODO(chcunningham): Do this in blink instead. Patching it here for now |
| + // because HTMLMediaElement's currentTime is a mess. |
| + if (!rendering_ && last_media_time_ != kNoTimestamp) { |
| + // If rendering stops, be sure to at least report the front time of the most |
| + // recently rendered audio buffer. |
| + if (last_media_time_ < audio_clock_->front_timestamp()) |
| + last_media_time_ = audio_clock_->front_timestamp(); |
| + |
| + DVLOG(3) << __func__ << " Returning cached time while rendering stopped:" |
| + << last_media_time_.InMicroseconds(); |
| + return last_media_time_; |
| + } |
| + |
| // Return the current time based on the known extents of the rendered audio |
| // data plus an estimate based on the last time those values were calculated. |
| base::TimeDelta current_media_time = audio_clock_->front_timestamp(); |
| @@ -186,6 +203,7 @@ base::TimeDelta AudioRendererImpl::CurrentMediaTime() { |
| current_media_time = audio_clock_->back_timestamp(); |
| } |
| + last_media_time_ = current_media_time; |
| return current_media_time; |
| } |
| @@ -430,6 +448,7 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, |
| audio_clock_.reset( |
| new AudioClock(base::TimeDelta(), audio_parameters_.sample_rate())); |
| + last_media_time_ = kNoTimestamp; |
| audio_buffer_stream_->Initialize( |
| stream, base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, |