Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / media / cast / common / clock_drift_smoother.cc
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/cast/common/clock_drift_smoother.h"
6
7 #include "base/logging.h"
8
9 namespace media {
10 namespace cast {
11
12 ClockDriftSmoother::ClockDriftSmoother(base::TimeDelta time_constant)
13     : time_constant_(time_constant),
14       estimate_us_(0.0) {
15   DCHECK(time_constant_ > base::TimeDelta());
16 }
17
18 ClockDriftSmoother::~ClockDriftSmoother() {}
19
20 base::TimeDelta ClockDriftSmoother::Current() const {
21   DCHECK(!last_update_time_.is_null());
22   return base::TimeDelta::FromMicroseconds(
23       static_cast<int64>(estimate_us_ + 0.5));  // Round to nearest microsecond.
24 }
25
26 void ClockDriftSmoother::Reset(base::TimeTicks now,
27                                base::TimeDelta measured_offset) {
28   DCHECK(!now.is_null());
29   last_update_time_ = now;
30   estimate_us_ = static_cast<double>(measured_offset.InMicroseconds());
31 }
32
33 void ClockDriftSmoother::Update(base::TimeTicks now,
34                                 base::TimeDelta measured_offset) {
35   DCHECK(!now.is_null());
36   if (last_update_time_.is_null()) {
37     Reset(now, measured_offset);
38   } else if (now < last_update_time_) {
39     // |now| is not monotonically non-decreasing.
40     NOTREACHED();
41   } else {
42     const double elapsed_us =
43         static_cast<double>((now - last_update_time_).InMicroseconds());
44     last_update_time_ = now;
45     const double weight =
46         elapsed_us / (elapsed_us + time_constant_.InMicroseconds());
47     estimate_us_ = weight * measured_offset.InMicroseconds() +
48         (1.0 - weight) * estimate_us_;
49   }
50 }
51
52 // static
53 base::TimeDelta ClockDriftSmoother::GetDefaultTimeConstant() {
54   static const int kDefaultTimeConstantInSeconds = 30;
55   return base::TimeDelta::FromSeconds(kDefaultTimeConstantInSeconds);
56 }
57
58 }  // namespace cast
59 }  // namespace media