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 10 namespace media { 11 WallClockTimeSource()12WallClockTimeSource::WallClockTimeSource() 13 : tick_clock_(new base::DefaultTickClock()), 14 ticking_(false), 15 playback_rate_(1.0f) { 16 } 17 ~WallClockTimeSource()18WallClockTimeSource::~WallClockTimeSource() { 19 } 20 StartTicking()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 StopTicking()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 SetPlaybackRate(float playback_rate)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 SetMediaTime(base::TimeDelta time)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 CurrentMediaTime()58base::TimeDelta WallClockTimeSource::CurrentMediaTime() { 59 base::AutoLock auto_lock(lock_); 60 return CurrentMediaTime_Locked(); 61 } 62 CurrentMediaTimeForSyncingVideo()63base::TimeDelta WallClockTimeSource::CurrentMediaTimeForSyncingVideo() { 64 return CurrentMediaTime(); 65 } 66 SetTickClockForTesting(scoped_ptr<base::TickClock> tick_clock)67void WallClockTimeSource::SetTickClockForTesting( 68 scoped_ptr<base::TickClock> tick_clock) { 69 tick_clock_.swap(tick_clock); 70 } 71 CurrentMediaTime_Locked()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