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 |