Line data Source code
1 : /*
2 : * Copyright (c) 2013 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_SYSTEM_WRAPPERS_INCLUDE_CLOCK_H_
12 : #define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CLOCK_H_
13 :
14 : #include <memory>
15 :
16 : #include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
17 : #include "webrtc/typedefs.h"
18 :
19 : namespace webrtc {
20 :
21 : // January 1970, in NTP seconds.
22 : const uint32_t kNtpJan1970 = 2208988800UL;
23 :
24 : // Magic NTP fractional unit.
25 : const double kMagicNtpFractionalUnit = 4.294967296E+9;
26 :
27 : // A clock interface that allows reading of absolute and relative timestamps.
28 0 : class Clock {
29 : public:
30 0 : virtual ~Clock() {}
31 :
32 : // Return a timestamp in milliseconds relative to some arbitrary source; the
33 : // source is fixed for this clock.
34 : virtual int64_t TimeInMilliseconds() const = 0;
35 :
36 : // Return a timestamp in microseconds relative to some arbitrary source; the
37 : // source is fixed for this clock.
38 : virtual int64_t TimeInMicroseconds() const = 0;
39 :
40 : // Retrieve an NTP absolute timestamp in seconds and fractions of a second.
41 : virtual void CurrentNtp(uint32_t& seconds, uint32_t& fractions) const = 0;
42 :
43 : // Retrieve an NTP absolute timestamp in milliseconds.
44 : virtual int64_t CurrentNtpInMilliseconds() const = 0;
45 :
46 : // Converts an NTP timestamp to a millisecond timestamp.
47 : static int64_t NtpToMs(uint32_t seconds, uint32_t fractions);
48 :
49 : // Returns an instance of the real-time system clock implementation.
50 : static Clock* GetRealTimeClock();
51 : };
52 :
53 : class SimulatedClock : public Clock {
54 : public:
55 : explicit SimulatedClock(int64_t initial_time_us);
56 :
57 : ~SimulatedClock() override;
58 :
59 : // Return a timestamp in milliseconds relative to some arbitrary source; the
60 : // source is fixed for this clock.
61 : int64_t TimeInMilliseconds() const override;
62 :
63 : // Return a timestamp in microseconds relative to some arbitrary source; the
64 : // source is fixed for this clock.
65 : int64_t TimeInMicroseconds() const override;
66 :
67 : // Retrieve an NTP absolute timestamp in milliseconds.
68 : void CurrentNtp(uint32_t& seconds, uint32_t& fractions) const override;
69 :
70 : // Converts an NTP timestamp to a millisecond timestamp.
71 : int64_t CurrentNtpInMilliseconds() const override;
72 :
73 : // Advance the simulated clock with a given number of milliseconds or
74 : // microseconds.
75 : void AdvanceTimeMilliseconds(int64_t milliseconds);
76 : void AdvanceTimeMicroseconds(int64_t microseconds);
77 :
78 : private:
79 : int64_t time_us_;
80 : std::unique_ptr<RWLockWrapper> lock_;
81 : };
82 :
83 : }; // namespace webrtc
84 :
85 : #endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CLOCK_H_
|