15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/wall_clock_time_source.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/logging.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/time/default_tick_clock.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace media {
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WallClockTimeSource::WallClockTimeSource()
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : tick_clock_(new base::DefaultTickClock()),
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ticking_(false),
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      playback_rate_(1.0f) {
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WallClockTimeSource::~WallClockTimeSource() {
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WallClockTimeSource::StartTicking() {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DVLOG(1) << __FUNCTION__;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock auto_lock(lock_);
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!ticking_);
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ticking_ = true;
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reference_wall_ticks_ = tick_clock_->NowTicks();
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WallClockTimeSource::StopTicking() {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DVLOG(1) << __FUNCTION__;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock auto_lock(lock_);
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(ticking_);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base_time_ = CurrentMediaTime_Locked();
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ticking_ = false;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reference_wall_ticks_ = tick_clock_->NowTicks();
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WallClockTimeSource::SetPlaybackRate(float playback_rate) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")";
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock auto_lock(lock_);
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Estimate current media time using old rate to use as a new base time for
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the new rate.
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (ticking_) {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base_time_ = CurrentMediaTime_Locked();
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    reference_wall_ticks_ = tick_clock_->NowTicks();
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  playback_rate_ = playback_rate;
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WallClockTimeSource::SetMediaTime(base::TimeDelta time) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DVLOG(1) << __FUNCTION__ << "(" << time.InMicroseconds() << ")";
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock auto_lock(lock_);
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CHECK(!ticking_);
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base_time_ = time;
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)base::TimeDelta WallClockTimeSource::CurrentMediaTime() {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock auto_lock(lock_);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return CurrentMediaTime_Locked();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::TimeDelta WallClockTimeSource::CurrentMediaTimeForSyncingVideo() {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return CurrentMediaTime();
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WallClockTimeSource::SetTickClockForTesting(
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<base::TickClock> tick_clock) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tick_clock_.swap(tick_clock);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::TimeDelta WallClockTimeSource::CurrentMediaTime_Locked() {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  lock_.AssertAcquired();
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!ticking_)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return base_time_;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks now = tick_clock_->NowTicks();
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return base_time_ +
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         base::TimeDelta::FromMicroseconds(
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             (now - reference_wall_ticks_).InMicroseconds() * playback_rate_);
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace media
84