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.
5 #include "media/cast/common/clock_drift_smoother.h"
7 #include "base/logging.h"
12 ClockDriftSmoother::ClockDriftSmoother(base::TimeDelta time_constant
)
13 : time_constant_(time_constant
),
15 DCHECK(time_constant_
> base::TimeDelta());
18 ClockDriftSmoother::~ClockDriftSmoother() {}
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.
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());
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.
42 const double elapsed_us
=
43 static_cast<double>((now
- last_update_time_
).InMicroseconds());
44 last_update_time_
= now
;
46 elapsed_us
/ (elapsed_us
+ time_constant_
.InMicroseconds());
47 estimate_us_
= weight
* measured_offset
.InMicroseconds() +
48 (1.0 - weight
) * estimate_us_
;
53 base::TimeDelta
ClockDriftSmoother::GetDefaultTimeConstant() {
54 static const int kDefaultTimeConstantInSeconds
= 30;
55 return base::TimeDelta::FromSeconds(kDefaultTimeConstantInSeconds
);