| Index: media/base/wall_clock_time_source.cc
|
| diff --git a/media/base/wall_clock_time_source.cc b/media/base/wall_clock_time_source.cc
|
| index 1c59be948bbf6f22b2fe8472d93d3ac78f29e5c5..33ec372e5008ea732c1f7a600c15fbdc8d832841 100644
|
| --- a/media/base/wall_clock_time_source.cc
|
| +++ b/media/base/wall_clock_time_source.cc
|
| @@ -20,16 +20,16 @@ void WallClockTimeSource::StartTicking() {
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK(!ticking_);
|
| ticking_ = true;
|
| - reference_wall_ticks_ = tick_clock_->NowTicks();
|
| + reference_time_ = tick_clock_->NowTicks();
|
| }
|
|
|
| void WallClockTimeSource::StopTicking() {
|
| DVLOG(1) << __FUNCTION__;
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK(ticking_);
|
| - base_time_ = CurrentMediaTime_Locked();
|
| + base_timestamp_ = CurrentMediaTime_Locked();
|
| ticking_ = false;
|
| - reference_wall_ticks_ = tick_clock_->NowTicks();
|
| + reference_time_ = tick_clock_->NowTicks();
|
| }
|
|
|
| void WallClockTimeSource::SetPlaybackRate(double playback_rate) {
|
| @@ -38,8 +38,8 @@ void WallClockTimeSource::SetPlaybackRate(double playback_rate) {
|
| // Estimate current media time using old rate to use as a new base time for
|
| // the new rate.
|
| if (ticking_) {
|
| - base_time_ = CurrentMediaTime_Locked();
|
| - reference_wall_ticks_ = tick_clock_->NowTicks();
|
| + base_timestamp_ = CurrentMediaTime_Locked();
|
| + reference_time_ = tick_clock_->NowTicks();
|
| }
|
|
|
| playback_rate_ = playback_rate;
|
| @@ -49,7 +49,7 @@ void WallClockTimeSource::SetMediaTime(base::TimeDelta time) {
|
| DVLOG(1) << __FUNCTION__ << "(" << time.InMicroseconds() << ")";
|
| base::AutoLock auto_lock(lock_);
|
| CHECK(!ticking_);
|
| - base_time_ = time;
|
| + base_timestamp_ = time;
|
| }
|
|
|
| base::TimeDelta WallClockTimeSource::CurrentMediaTime() {
|
| @@ -61,29 +61,34 @@ bool WallClockTimeSource::GetWallClockTimes(
|
| const std::vector<base::TimeDelta>& media_timestamps,
|
| std::vector<base::TimeTicks>* wall_clock_times) {
|
| base::AutoLock auto_lock(lock_);
|
| - if (!ticking_ || !playback_rate_)
|
| - return false;
|
| -
|
| DCHECK(wall_clock_times->empty());
|
| - wall_clock_times->reserve(media_timestamps.size());
|
| - for (const auto& media_timestamp : media_timestamps) {
|
| - wall_clock_times->push_back(
|
| - reference_wall_ticks_ +
|
| - base::TimeDelta::FromMicroseconds(
|
| - (media_timestamp - base_time_).InMicroseconds() / playback_rate_));
|
| +
|
| + if (media_timestamps.empty()) {
|
| + wall_clock_times->push_back(reference_time_);
|
| + } else {
|
| + // When playback is paused (rate is zero), assume a rate of 1.0.
|
| + const double playback_rate = playback_rate_ ? playback_rate_ : 1.0;
|
| +
|
| + wall_clock_times->reserve(media_timestamps.size());
|
| + for (const auto& media_timestamp : media_timestamps) {
|
| + wall_clock_times->push_back(reference_time_ +
|
| + (media_timestamp - base_timestamp_) /
|
| + playback_rate);
|
| + }
|
| }
|
| - return true;
|
| +
|
| + return playback_rate_ && ticking_;
|
| }
|
|
|
| base::TimeDelta WallClockTimeSource::CurrentMediaTime_Locked() {
|
| lock_.AssertAcquired();
|
| if (!ticking_ || !playback_rate_)
|
| - return base_time_;
|
| + return base_timestamp_;
|
|
|
| base::TimeTicks now = tick_clock_->NowTicks();
|
| - return base_time_ +
|
| + return base_timestamp_ +
|
| base::TimeDelta::FromMicroseconds(
|
| - (now - reference_wall_ticks_).InMicroseconds() * playback_rate_);
|
| + (now - reference_time_).InMicroseconds() * playback_rate_);
|
| }
|
|
|
| } // namespace media
|
|
|