1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "media/base/wall_clock_time_source.h" 6 7#include "base/logging.h" 8#include "base/time/default_tick_clock.h" 9 10namespace media { 11 12WallClockTimeSource::WallClockTimeSource() 13 : tick_clock_(new base::DefaultTickClock()), 14 ticking_(false), 15 playback_rate_(1.0f) { 16} 17 18WallClockTimeSource::~WallClockTimeSource() { 19} 20 21void WallClockTimeSource::StartTicking() { 22 DVLOG(1) << __FUNCTION__; 23 base::AutoLock auto_lock(lock_); 24 DCHECK(!ticking_); 25 ticking_ = true; 26 reference_wall_ticks_ = tick_clock_->NowTicks(); 27} 28 29void WallClockTimeSource::StopTicking() { 30 DVLOG(1) << __FUNCTION__; 31 base::AutoLock auto_lock(lock_); 32 DCHECK(ticking_); 33 base_time_ = CurrentMediaTime_Locked(); 34 ticking_ = false; 35 reference_wall_ticks_ = tick_clock_->NowTicks(); 36} 37 38void WallClockTimeSource::SetPlaybackRate(float playback_rate) { 39 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")"; 40 base::AutoLock auto_lock(lock_); 41 // Estimate current media time using old rate to use as a new base time for 42 // the new rate. 43 if (ticking_) { 44 base_time_ = CurrentMediaTime_Locked(); 45 reference_wall_ticks_ = tick_clock_->NowTicks(); 46 } 47 48 playback_rate_ = playback_rate; 49} 50 51void WallClockTimeSource::SetMediaTime(base::TimeDelta time) { 52 DVLOG(1) << __FUNCTION__ << "(" << time.InMicroseconds() << ")"; 53 base::AutoLock auto_lock(lock_); 54 CHECK(!ticking_); 55 base_time_ = time; 56} 57 58base::TimeDelta WallClockTimeSource::CurrentMediaTime() { 59 base::AutoLock auto_lock(lock_); 60 return CurrentMediaTime_Locked(); 61} 62 63base::TimeDelta WallClockTimeSource::CurrentMediaTimeForSyncingVideo() { 64 return CurrentMediaTime(); 65} 66 67void WallClockTimeSource::SetTickClockForTesting( 68 scoped_ptr<base::TickClock> tick_clock) { 69 tick_clock_.swap(tick_clock); 70} 71 72base::TimeDelta WallClockTimeSource::CurrentMediaTime_Locked() { 73 lock_.AssertAcquired(); 74 if (!ticking_) 75 return base_time_; 76 77 base::TimeTicks now = tick_clock_->NowTicks(); 78 return base_time_ + 79 base::TimeDelta::FromMicroseconds( 80 (now - reference_wall_ticks_).InMicroseconds() * playback_rate_); 81} 82 83} // namespace media 84