blob: 1c321841bdf6a95b25a04ff656f3ec772c236c8a [file] [log] [blame]
danilchapb1ac2032015-11-26 09:01:10 -08001/*
Karl Wiberg79eb1d92017-11-08 12:26:07 +01002 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020010#ifndef SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_
11#define SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_
danilchapb1ac2032015-11-26 09:01:10 -080012
pbosc7c26a02017-01-02 08:42:32 -080013#include <stdint.h>
14
Patrik Höglund3e113432017-12-15 14:40:10 +010015#include "rtc_base/numerics/safe_conversions.h"
16
danilchapb1ac2032015-11-26 09:01:10 -080017namespace webrtc {
18
19class NtpTime {
20 public:
danilchap27260ce2017-02-15 01:18:15 -080021 static constexpr uint64_t kFractionsPerSecond = 0x100000000;
22 NtpTime() : value_(0) {}
23 explicit NtpTime(uint64_t value) : value_(value) {}
danilchapb1ac2032015-11-26 09:01:10 -080024 NtpTime(uint32_t seconds, uint32_t fractions)
danilchap27260ce2017-02-15 01:18:15 -080025 : value_(seconds * kFractionsPerSecond + fractions) {}
danilchapb1ac2032015-11-26 09:01:10 -080026
27 NtpTime(const NtpTime&) = default;
28 NtpTime& operator=(const NtpTime&) = default;
danilchap27260ce2017-02-15 01:18:15 -080029 explicit operator uint64_t() const { return value_; }
danilchapb1ac2032015-11-26 09:01:10 -080030
danilchapb1ac2032015-11-26 09:01:10 -080031 void Set(uint32_t seconds, uint32_t fractions) {
danilchap27260ce2017-02-15 01:18:15 -080032 value_ = seconds * kFractionsPerSecond + fractions;
danilchapb1ac2032015-11-26 09:01:10 -080033 }
danilchap27260ce2017-02-15 01:18:15 -080034 void Reset() { value_ = 0; }
danilchapb1ac2032015-11-26 09:01:10 -080035
danilchap37953762017-02-09 11:15:25 -080036 int64_t ToMs() const {
37 static constexpr double kNtpFracPerMs = 4.294967296E6; // 2^32 / 1000.
danilchap27260ce2017-02-15 01:18:15 -080038 const double frac_ms = static_cast<double>(fractions()) / kNtpFracPerMs;
39 return 1000 * static_cast<int64_t>(seconds()) +
danilchap37953762017-02-09 11:15:25 -080040 static_cast<int64_t>(frac_ms + 0.5);
41 }
danilchap27260ce2017-02-15 01:18:15 -080042 // NTP standard (RFC1305, section 3.1) explicitly state value 0 is invalid.
43 bool Valid() const { return value_ != 0; }
danilchapb1ac2032015-11-26 09:01:10 -080044
Patrik Höglund3e113432017-12-15 14:40:10 +010045 uint32_t seconds() const {
46 return rtc::dchecked_cast<uint32_t>(value_ / kFractionsPerSecond);
47 }
48 uint32_t fractions() const {
49 return rtc::dchecked_cast<uint32_t>(value_ % kFractionsPerSecond);
50 }
danilchapb1ac2032015-11-26 09:01:10 -080051
52 private:
danilchap27260ce2017-02-15 01:18:15 -080053 uint64_t value_;
danilchapb1ac2032015-11-26 09:01:10 -080054};
55
56inline bool operator==(const NtpTime& n1, const NtpTime& n2) {
danilchap27260ce2017-02-15 01:18:15 -080057 return static_cast<uint64_t>(n1) == static_cast<uint64_t>(n2);
danilchapb1ac2032015-11-26 09:01:10 -080058}
59inline bool operator!=(const NtpTime& n1, const NtpTime& n2) {
60 return !(n1 == n2);
61}
62
63} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#endif // SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_