Index: media/mojo/services/mojo_renderer_service.cc |
diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc |
index 40c7006c1f10d6dfa8373197958cd537d86c6ec2..729ce955f6fdcf36ddbc64d1ebe95a2d106819d3 100644 |
--- a/media/mojo/services/mojo_renderer_service.cc |
+++ b/media/mojo/services/mojo_renderer_service.cc |
@@ -29,6 +29,7 @@ MojoRendererService::MojoRendererService( |
: binding_(this, std::move(request)), |
mojo_cdm_service_context_(mojo_cdm_service_context), |
state_(STATE_UNINITIALIZED), |
+ playback_rate_(0), |
audio_sink_(std::move(audio_sink)), |
video_sink_(std::move(video_sink)), |
renderer_(std::move(renderer)), |
@@ -87,6 +88,7 @@ void MojoRendererService::StartPlayingFrom(base::TimeDelta time_delta) { |
void MojoRendererService::SetPlaybackRate(double playback_rate) { |
DVLOG(2) << __FUNCTION__ << ": " << playback_rate; |
DCHECK(state_ == STATE_PLAYING || state_ == STATE_ERROR); |
+ playback_rate_ = playback_rate; |
renderer_->SetPlaybackRate(playback_rate); |
} |
@@ -188,26 +190,32 @@ void MojoRendererService::OnRendererInitializeDone( |
} |
void MojoRendererService::UpdateMediaTime(bool force) { |
- base::TimeDelta media_time = renderer_->GetMediaTime(); |
+ const base::TimeDelta media_time = renderer_->GetMediaTime(); |
if (!force && media_time == last_media_time_) |
return; |
- client_->OnTimeUpdate(media_time, media_time); |
+ base::TimeDelta max_time = media_time; |
+ // Allow some slop to account for delays in scheduling time update tasks. |
+ if (time_update_timer_.IsRunning() && (playback_rate_ > 0)) |
+ max_time += base::TimeDelta::FromMilliseconds(2 * kTimeUpdateIntervalMs); |
+ |
+ client_->OnTimeUpdate(media_time, max_time, base::TimeTicks::Now()); |
last_media_time_ = media_time; |
} |
void MojoRendererService::CancelPeriodicMediaTimeUpdates() { |
DVLOG(2) << __FUNCTION__; |
- UpdateMediaTime(false); |
+ |
time_update_timer_.Stop(); |
+ UpdateMediaTime(false); |
} |
void MojoRendererService::SchedulePeriodicMediaTimeUpdates() { |
DVLOG(2) << __FUNCTION__; |
+ |
UpdateMediaTime(true); |
time_update_timer_.Start( |
- FROM_HERE, |
- base::TimeDelta::FromMilliseconds(kTimeUpdateIntervalMs), |
+ FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeUpdateIntervalMs), |
base::Bind(&MojoRendererService::UpdateMediaTime, weak_this_, false)); |
} |