| /* | 
 |  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #include "webrtc/test/drifting_clock.h" | 
 | #include "webrtc/base/checks.h" | 
 |  | 
 | namespace webrtc { | 
 | namespace test { | 
 | const float DriftingClock::kDoubleSpeed = 2.0f; | 
 | const float DriftingClock::kNoDrift = 1.0f; | 
 | const float DriftingClock::kHalfSpeed = 0.5f; | 
 |  | 
 | DriftingClock::DriftingClock(Clock* clock, float speed) | 
 |     : clock_(clock), | 
 |       drift_(speed - 1.0f), | 
 |       start_time_(clock_->TimeInMicroseconds()) { | 
 |   RTC_CHECK(clock); | 
 |   RTC_CHECK_GT(speed, 0.0f); | 
 | } | 
 |  | 
 | float DriftingClock::Drift() const { | 
 |   int64_t now = clock_->TimeInMicroseconds(); | 
 |   RTC_DCHECK_GE(now, start_time_); | 
 |   return (now - start_time_) * drift_; | 
 | } | 
 |  | 
 | int64_t DriftingClock::TimeInMilliseconds() const { | 
 |   return clock_->TimeInMilliseconds() + Drift() / 1000.; | 
 | } | 
 |  | 
 | int64_t DriftingClock::TimeInMicroseconds() const { | 
 |   return clock_->TimeInMicroseconds() + Drift(); | 
 | } | 
 |  | 
 | void DriftingClock::CurrentNtp(uint32_t& seconds, uint32_t& fractions) const { | 
 |   // NTP precision is 1/2^32 seconds, i.e. 2^32 ntp fractions = 1 second. | 
 |   const double kNtpFracPerMicroSecond = 4294.967296;  // = 2^32 / 10^6 | 
 |  | 
 |   clock_->CurrentNtp(seconds, fractions); | 
 |   uint64_t total_fractions = (static_cast<uint64_t>(seconds) << 32) | fractions; | 
 |   total_fractions += Drift() * kNtpFracPerMicroSecond; | 
 |   seconds = total_fractions >> 32; | 
 |   fractions = static_cast<uint32_t>(total_fractions); | 
 | } | 
 |  | 
 | int64_t DriftingClock::CurrentNtpInMilliseconds() const { | 
 |   return clock_->CurrentNtpInMilliseconds() + Drift() / 1000.; | 
 | } | 
 | }  // namespace test | 
 | }  // namespace webrtc |