1 /*
2 * Copyright 2005 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 */
10
11 #ifndef WEBRTC_BASE_TIMEUTILS_H_
12 #define WEBRTC_BASE_TIMEUTILS_H_
13
14 #include <ctime>
15 #include <time.h>
16
17 #include "webrtc/base/basictypes.h"
18
19 namespace rtc {
20
21 static const int64_t kNumMillisecsPerSec = INT64_C(1000);
22 static const int64_t kNumMicrosecsPerSec = INT64_C(1000000);
23 static const int64_t kNumNanosecsPerSec = INT64_C(1000000000);
24
25 static const int64_t kNumMicrosecsPerMillisec =
26 kNumMicrosecsPerSec / kNumMillisecsPerSec;
27 static const int64_t kNumNanosecsPerMillisec =
28 kNumNanosecsPerSec / kNumMillisecsPerSec;
29 static const int64_t kNumNanosecsPerMicrosec =
30 kNumNanosecsPerSec / kNumMicrosecsPerSec;
31
32 // January 1970, in NTP milliseconds.
33 static const int64_t kJan1970AsNtpMillisecs = INT64_C(2208988800000);
34
35 typedef uint32_t TimeStamp;
36
37 // Returns the current time in milliseconds.
38 uint32_t Time();
39 // Returns the current time in microseconds.
40 uint64_t TimeMicros();
41 // Returns the current time in nanoseconds.
42 uint64_t TimeNanos();
43
44 // Stores current time in *tm and microseconds in *microseconds.
45 void CurrentTmTime(struct tm *tm, int *microseconds);
46
47 // Returns a future timestamp, 'elapsed' milliseconds from now.
48 uint32_t TimeAfter(int32_t elapsed);
49
50 // Comparisons between time values, which can wrap around.
51 bool TimeIsBetween(uint32_t earlier,
52 uint32_t middle,
53 uint32_t later); // Inclusive
54 bool TimeIsLaterOrEqual(uint32_t earlier, uint32_t later); // Inclusive
55 bool TimeIsLater(uint32_t earlier, uint32_t later); // Exclusive
56
57 // Returns the later of two timestamps.
TimeMax(uint32_t ts1,uint32_t ts2)58 inline uint32_t TimeMax(uint32_t ts1, uint32_t ts2) {
59 return TimeIsLaterOrEqual(ts1, ts2) ? ts2 : ts1;
60 }
61
62 // Returns the earlier of two timestamps.
TimeMin(uint32_t ts1,uint32_t ts2)63 inline uint32_t TimeMin(uint32_t ts1, uint32_t ts2) {
64 return TimeIsLaterOrEqual(ts1, ts2) ? ts1 : ts2;
65 }
66
67 // Number of milliseconds that would elapse between 'earlier' and 'later'
68 // timestamps. The value is negative if 'later' occurs before 'earlier'.
69 int32_t TimeDiff(uint32_t later, uint32_t earlier);
70
71 // The number of milliseconds that have elapsed since 'earlier'.
TimeSince(uint32_t earlier)72 inline int32_t TimeSince(uint32_t earlier) {
73 return TimeDiff(Time(), earlier);
74 }
75
76 // The number of milliseconds that will elapse between now and 'later'.
TimeUntil(uint32_t later)77 inline int32_t TimeUntil(uint32_t later) {
78 return TimeDiff(later, Time());
79 }
80
81 // Converts a unix timestamp in nanoseconds to an NTP timestamp in ms.
UnixTimestampNanosecsToNtpMillisecs(int64_t unix_ts_ns)82 inline int64_t UnixTimestampNanosecsToNtpMillisecs(int64_t unix_ts_ns) {
83 return unix_ts_ns / kNumNanosecsPerMillisec + kJan1970AsNtpMillisecs;
84 }
85
86 class TimestampWrapAroundHandler {
87 public:
88 TimestampWrapAroundHandler();
89
90 int64_t Unwrap(uint32_t ts);
91
92 private:
93 uint32_t last_ts_;
94 int64_t num_wrap_;
95 };
96
97 // Convert from std::tm, which is relative to 1900-01-01 00:00 to number of
98 // seconds from 1970-01-01 00:00 ("epoch"). Don't return time_t since that
99 // is still 32 bits on many systems.
100 int64_t TmToSeconds(const std::tm& tm);
101
102 } // namespace rtc
103
104 #endif // WEBRTC_BASE_TIMEUTILS_H_
105