Chromium Code Reviews| Index: media/mojo/clients/mojo_renderer.cc |
| diff --git a/media/mojo/clients/mojo_renderer.cc b/media/mojo/clients/mojo_renderer.cc |
| index aea977fa43c37dc9566ce06485204591de5596ff..36690163b3645cf2d89194eda04cb00a24e209e0 100644 |
| --- a/media/mojo/clients/mojo_renderer.cc |
| +++ b/media/mojo/clients/mojo_renderer.cc |
| @@ -28,7 +28,8 @@ MojoRenderer::MojoRenderer( |
| video_overlay_factory_(std::move(video_overlay_factory)), |
| video_renderer_sink_(video_renderer_sink), |
| remote_renderer_info_(remote_renderer.PassInterface()), |
| - binding_(this) { |
| + binding_(this), |
| + media_time_interpolator_(&media_clock_) { |
| DVLOG(1) << __FUNCTION__; |
| } |
| @@ -167,34 +168,47 @@ void MojoRenderer::Flush(const base::Closure& flush_cb) { |
| return; |
| } |
| + { |
| + base::AutoLock auto_lock(lock_); |
| + if (media_time_interpolator_.interpolating()) |
| + media_time_interpolator_.StopInterpolating(); |
| + } |
| + |
| flush_cb_ = flush_cb; |
| remote_renderer_->Flush( |
| base::Bind(&MojoRenderer::OnFlushed, base::Unretained(this))); |
| } |
| void MojoRenderer::StartPlayingFrom(base::TimeDelta time) { |
| - DVLOG(2) << __FUNCTION__; |
| + DVLOG(2) << __FUNCTION__ << "(" << time << ")"; |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| DCHECK(remote_renderer_.is_bound()); |
| { |
| base::AutoLock auto_lock(lock_); |
| - time_ = time; |
| + media_time_interpolator_.SetBounds(time, time, media_clock_.NowTicks()); |
| + media_time_interpolator_.StartInterpolating(); |
| + last_media_time_ = base::TimeDelta(); |
| } |
| remote_renderer_->StartPlayingFrom(time); |
| } |
| void MojoRenderer::SetPlaybackRate(double playback_rate) { |
| - DVLOG(2) << __FUNCTION__; |
| + DVLOG(2) << __FUNCTION__ << "(" << playback_rate << ")"; |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| DCHECK(remote_renderer_.is_bound()); |
| remote_renderer_->SetPlaybackRate(playback_rate); |
| + |
| + { |
| + base::AutoLock auto_lock(lock_); |
| + media_time_interpolator_.SetPlaybackRate(playback_rate); |
| + } |
| } |
| void MojoRenderer::SetVolume(float volume) { |
| - DVLOG(2) << __FUNCTION__; |
| + DVLOG(2) << __FUNCTION__ << "(" << volume << ")"; |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| DCHECK(remote_renderer_.is_bound()); |
| @@ -203,8 +217,15 @@ void MojoRenderer::SetVolume(float volume) { |
| base::TimeDelta MojoRenderer::GetMediaTime() { |
| base::AutoLock auto_lock(lock_); |
| - DVLOG(3) << __FUNCTION__ << ": " << time_.InMilliseconds() << " ms"; |
| - return time_; |
| + base::TimeDelta media_time = media_time_interpolator_.GetInterpolatedTime(); |
| + if (media_time < last_media_time_) { |
| + DVLOG(2) << __func__ << ": actual=" << media_time |
|
alokp
2016/09/08 17:37:52
We have the same logic in AudioRendererImpl. In fa
DaleCurtis
2016/09/08 17:45:29
That seems reasonable to me.
alokp
2016/09/08 19:30:50
Done. Please check PipelineImpl and AudioRendererI
|
| + << " clamped=" << last_media_time_; |
| + return last_media_time_; |
| + } |
| + DVLOG(3) << __FUNCTION__ << ": " << media_time.InMilliseconds() << " ms"; |
| + last_media_time_ = media_time; |
| + return last_media_time_; |
| } |
| bool MojoRenderer::HasAudio() { |
| @@ -234,12 +255,14 @@ bool MojoRenderer::HasVideo() { |
| } |
| void MojoRenderer::OnTimeUpdate(base::TimeDelta time, |
| - base::TimeDelta max_time) { |
| - DVLOG(3) << __FUNCTION__ << ": " << time << ", " << max_time; |
| + base::TimeDelta max_time, |
| + base::TimeTicks capture_time) { |
| + DVLOG(4) << __FUNCTION__ << "(" << time << ", " << max_time << ", " |
| + << capture_time << ")"; |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| base::AutoLock auto_lock(lock_); |
| - time_ = time; |
| + media_time_interpolator_.SetBounds(time, max_time, capture_time); |
| } |
| void MojoRenderer::OnBufferingStateChange(mojom::BufferingState state) { |