| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..67b16f717952c29dc1d8e7fe5abb174a0ec60bef
|
| --- /dev/null
|
| +++ b/media/base/wall_clock_time_source.cc
|
| @@ -0,0 +1,65 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "media/base/wall_clock_time_source.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/time/default_tick_clock.h"
|
| +
|
| +namespace media {
|
| +
|
| +WallClockTimeSource::WallClockTimeSource()
|
| + : tick_clock_(new base::DefaultTickClock()),
|
| + ticking_(false),
|
| + playback_rate_(1.0f) {
|
| +}
|
| +
|
| +WallClockTimeSource::~WallClockTimeSource() {
|
| +}
|
| +
|
| +void WallClockTimeSource::StartTicking() {
|
| + DCHECK(!ticking_);
|
| + ticking_ = true;
|
| + reference_wall_ticks_ = tick_clock_->NowTicks();
|
| +}
|
| +
|
| +void WallClockTimeSource::StopTicking() {
|
| + DCHECK(ticking_);
|
| + base_time_ = CurrentMediaTime();
|
| + ticking_ = false;
|
| + reference_wall_ticks_ = tick_clock_->NowTicks();
|
| +}
|
| +
|
| +void WallClockTimeSource::SetPlaybackRate(float 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();
|
| + reference_wall_ticks_ = tick_clock_->NowTicks();
|
| + }
|
| +
|
| + playback_rate_ = playback_rate;
|
| +}
|
| +
|
| +void WallClockTimeSource::SetMediaTime(base::TimeDelta time) {
|
| + CHECK(!ticking_);
|
| + base_time_ = time;
|
| +}
|
| +
|
| +base::TimeDelta WallClockTimeSource::CurrentMediaTime() {
|
| + if (!ticking_)
|
| + return base_time_;
|
| +
|
| + base::TimeTicks now = tick_clock_->NowTicks();
|
| + return base_time_ +
|
| + base::TimeDelta::FromMicroseconds(
|
| + (now - reference_wall_ticks_).InMicroseconds() * playback_rate_);
|
| +}
|
| +
|
| +void WallClockTimeSource::SetTickClockForTesting(
|
| + scoped_ptr<base::TickClock> tick_clock) {
|
| + tick_clock_.swap(tick_clock);
|
| +}
|
| +
|
| +} // namespace media
|
|
|