| Index: media/renderers/renderer_impl.cc
|
| diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
|
| index 7381e94ef695c43036c62291bbbcb0f918057fa6..94fbe94eaff5593ed3b185bb542c33ec06a969aa 100644
|
| --- a/media/renderers/renderer_impl.cc
|
| +++ b/media/renderers/renderer_impl.cc
|
| @@ -32,6 +32,8 @@ static const int kDefaultVideoUnderflowThresholdMs = 3000;
|
|
|
| static const int kAudioRestartUnderflowThresholdMs = 2000;
|
|
|
| +static const int kTimeUpdateIntervalMs = 50;
|
| +
|
| class RendererImpl::RendererClientInternal : public RendererClient {
|
| public:
|
| RendererClientInternal(DemuxerStream::Type type, RendererImpl* renderer)
|
| @@ -58,6 +60,11 @@ class RendererImpl::RendererClientInternal : public RendererClient {
|
| DCHECK(type_ == DemuxerStream::VIDEO);
|
| renderer_->OnVideoOpacityChange(opaque);
|
| }
|
| + void OnTimeUpdate(base::TimeDelta curr_time,
|
| + base::TimeDelta max_time,
|
| + base::TimeTicks capture_time) override {
|
| + NOTREACHED();
|
| + }
|
|
|
| private:
|
| DemuxerStream::Type type_;
|
| @@ -243,6 +250,7 @@ void RendererImpl::RestartStreamPlayback(DemuxerStream* stream,
|
| if (time_ticking_) {
|
| time_ticking_ = false;
|
| time_source_->StopTicking();
|
| + CancelPeriodicMediaTimeUpdates();
|
| }
|
| audio_renderer_->Flush(
|
| base::Bind(&RendererImpl::RestartAudioRenderer, weak_this_, time));
|
| @@ -300,7 +308,7 @@ void RendererImpl::SetVolume(float volume) {
|
| base::TimeDelta RendererImpl::GetMediaTime() {
|
| // No BelongsToCurrentThread() checking because this can be called from other
|
| // threads.
|
| - return time_source_->CurrentMediaTime();
|
| + return time_source_->CurrentMediaTime(nullptr);
|
| }
|
|
|
| bool RendererImpl::HasAudio() {
|
| @@ -743,6 +751,7 @@ void RendererImpl::PausePlayback() {
|
| if (time_ticking_) {
|
| time_ticking_ = false;
|
| time_source_->StopTicking();
|
| + CancelPeriodicMediaTimeUpdates();
|
| }
|
| if (playback_rate_ > 0 && video_renderer_)
|
| video_renderer_->OnTimeStateChanged(false);
|
| @@ -757,6 +766,8 @@ void RendererImpl::StartPlayback() {
|
|
|
| time_ticking_ = true;
|
| time_source_->StartTicking();
|
| + SchedulePeriodicMediaTimeUpdates();
|
| +
|
| if (playback_rate_ > 0 && video_renderer_)
|
| video_renderer_->OnTimeStateChanged(true);
|
| }
|
| @@ -848,4 +859,40 @@ void RendererImpl::OnVideoOpacityChange(bool opaque) {
|
| client_->OnVideoOpacityChange(opaque);
|
| }
|
|
|
| +void RendererImpl::UpdateMediaTime() {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + DCHECK(time_ticking_);
|
| +
|
| + base::TimeTicks capture_time;
|
| + base::TimeDelta curr_time = time_source_->CurrentMediaTime(&capture_time);
|
| + // Allow some slop to account for delays in scheduling time update tasks.
|
| + base::TimeDelta max_time =
|
| + curr_time + base::TimeDelta::FromMilliseconds(2 * kTimeUpdateIntervalMs);
|
| + client_->OnTimeUpdate(curr_time, max_time, capture_time);
|
| +}
|
| +
|
| +void RendererImpl::SchedulePeriodicMediaTimeUpdates() {
|
| + DVLOG(2) << __func__;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + base::TimeTicks capture_time;
|
| + base::TimeDelta curr_time = time_source_->CurrentMediaTime(&capture_time);
|
| + client_->OnTimeUpdate(curr_time, curr_time, capture_time);
|
| +
|
| + time_update_timer_.Start(
|
| + FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeUpdateIntervalMs),
|
| + base::Bind(&RendererImpl::UpdateMediaTime, weak_this_));
|
| +}
|
| +
|
| +void RendererImpl::CancelPeriodicMediaTimeUpdates() {
|
| + DVLOG(2) << __func__;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + time_update_timer_.Stop();
|
| +
|
| + base::TimeTicks capture_time;
|
| + base::TimeDelta curr_time = time_source_->CurrentMediaTime(&capture_time);
|
| + client_->OnTimeUpdate(curr_time, curr_time, capture_time);
|
| +}
|
| +
|
| } // namespace media
|
|
|