Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Unified Diff: media/base/wall_clock_time_source.cc

Issue 1160853006: Improve audio/video sync during underflow, reduce underflow frequency. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/wall_clock_time_source.h ('k') | media/base/wall_clock_time_source_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « media/base/wall_clock_time_source.h ('k') | media/base/wall_clock_time_source_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698