37 #ifndef RTPTIMEUTILITIES_H
39 #define RTPTIMEUTILITIES_H
41 #include "rtpconfig.h"
43 #ifndef RTP_HAVE_QUERYPERFORMANCECOUNTER
46 #endif // RTP_HAVE_QUERYPERFORMANCECOUNTER
48 #define RTP_NTPTIMEOFFSET 2208988800UL
50 #ifdef RTP_HAVE_VSUINT64SUFFIX
51 #define C1000000 1000000ui64
52 #define CEPOCH 11644473600000000ui64
54 #define C1000000 1000000ULL
55 #define CEPOCH 11644473600000000ULL
56 #endif // RTP_HAVE_VSUINT64SUFFIX
72 uint32_t
GetMSW()
const {
return msw; }
75 uint32_t
GetLSW()
const {
return lsw; }
94 static void Wait(
const RTPTime &delay);
107 RTPTime(int64_t seconds, uint32_t microseconds);
110 int64_t GetSeconds()
const;
113 uint32_t GetMicroSeconds()
const;
123 bool operator<(
const RTPTime &t)
const;
124 bool operator>(
const RTPTime &t)
const;
125 bool operator<=(
const RTPTime &t)
const;
126 bool operator>=(
const RTPTime &t)
const;
128 bool IsZero()
const {
return m_t == 0; }
130 #ifdef RTP_HAVE_QUERYPERFORMANCECOUNTER
131 static inline uint64_t CalculateMicroseconds(uint64_t performancecount,uint64_t performancefrequency);
132 #endif // RTP_HAVE_QUERYPERFORMANCECOUNTER
146 m_t = (double)seconds + 1e-6*(
double)microseconds;
150 int64_t possec = -seconds;
152 m_t = (double)possec + 1e-6*(
double)microseconds;
159 if (ntptime.
GetMSW() < RTP_NTPTIMEOFFSET)
165 uint32_t sec = ntptime.
GetMSW() - RTP_NTPTIMEOFFSET;
167 double x = (double)ntptime.
GetLSW();
168 x /= (65536.0*65536.0);
170 uint32_t microsec = (uint32_t)x;
172 m_t = (double)sec + 1e-6*(
double)microsec;
187 int64_t sec = (int64_t)m_t;
188 microsec = (uint32_t)(1e6*(m_t - (
double)sec) + 0.5);
192 int64_t sec = (int64_t)(-m_t);
193 microsec = (uint32_t)(1e6*((-m_t) - (double)sec) + 0.5);
196 if (microsec >= 1000000)
203 #ifdef RTP_HAVE_QUERYPERFORMANCECOUNTER
205 inline uint64_t RTPTime::CalculateMicroseconds(uint64_t performancecount,uint64_t performancefrequency)
207 uint64_t f = performancefrequency;
208 uint64_t a = performancecount;
212 return b*C1000000+(c*C1000000)/f;
217 static int inited = 0;
218 static uint64_t microseconds, initmicroseconds;
219 static LARGE_INTEGER performancefrequency;
221 uint64_t emulate_microseconds, microdiff;
222 SYSTEMTIME systemtime;
225 LARGE_INTEGER performancecount;
227 QueryPerformanceCounter(&performancecount);
231 QueryPerformanceFrequency(&performancefrequency);
232 GetSystemTime(&systemtime);
233 SystemTimeToFileTime(&systemtime,&filetime);
234 microseconds = ( ((uint64_t)(filetime.dwHighDateTime) << 32) + (uint64_t)(filetime.dwLowDateTime) ) / (uint64_t)10;
235 microseconds-= CEPOCH;
236 initmicroseconds = CalculateMicroseconds(performancecount.QuadPart, performancefrequency.QuadPart);
239 emulate_microseconds = CalculateMicroseconds(performancecount.QuadPart, performancefrequency.QuadPart);
241 microdiff = emulate_microseconds - initmicroseconds;
243 double t = 1e-6*(double)(microseconds + microdiff);
252 uint64_t sec = (uint64_t)delay.m_t;
253 uint32_t microsec = (uint32_t)(1e6*(delay.m_t-(double)sec));
254 DWORD t = ((DWORD)sec)*1000+(((DWORD)microsec)/1000);
260 #ifdef RTP_HAVE_CLOCK_GETTIME
261 inline double RTPTime_timespecToDouble(
struct timespec &ts)
263 return (
double)ts.tv_sec + 1e-9*(double)ts.tv_nsec;
268 static bool s_initialized =
false;
269 static double s_startOffet = 0;
273 s_initialized =
true;
276 struct timespec tpSys, tpMono;
278 clock_gettime(CLOCK_REALTIME, &tpSys);
279 clock_gettime(CLOCK_MONOTONIC, &tpMono);
281 double tSys = RTPTime_timespecToDouble(tpSys);
282 double tMono = RTPTime_timespecToDouble(tpMono);
284 s_startOffet = tSys - tMono;
288 struct timespec tpMono;
289 clock_gettime(CLOCK_MONOTONIC, &tpMono);
291 double tMono0 = RTPTime_timespecToDouble(tpMono);
292 return tMono0 + s_startOffet;
295 #else // gettimeofday fallback
302 return RTPTime((uint64_t)tv.tv_sec,(uint32_t)tv.tv_usec);
304 #endif // RTP_HAVE_CLOCK_GETTIME
311 uint64_t sec = (uint64_t)delay.m_t;
312 uint64_t nanosec = (uint32_t)(1e9*(delay.m_t-(double)sec));
314 struct timespec req,rem;
316 req.tv_sec = (time_t)sec;
317 req.tv_nsec = ((long)nanosec);
318 nanosleep(&req,&rem);
321 #endif // RTP_HAVE_QUERYPERFORMANCECOUNTER
329 inline RTPTime &RTPTime::operator+=(
const RTPTime &t)
337 uint32_t sec = (uint32_t)m_t;
338 uint32_t microsec = (uint32_t)((m_t - (
double)sec)*1e6);
340 uint32_t msw = sec+RTP_NTPTIMEOFFSET;
344 x = microsec/1000000.0;
345 x *= (65536.0*65536.0);
351 inline bool RTPTime::operator<(
const RTPTime &t)
const
356 inline bool RTPTime::operator>(
const RTPTime &t)
const
361 inline bool RTPTime::operator<=(
const RTPTime &t)
const
366 inline bool RTPTime::operator>=(
const RTPTime &t)
const
371 class JRTPLIB_IMPORTEXPORT RTPTimeInitializerObject
374 RTPTimeInitializerObject();
375 void Dummy() { dummy++; }
380 extern RTPTimeInitializerObject timeinit;
385 #endif // RTPTIMEUTILITIES_H
uint32_t GetMicroSeconds() const
Returns the number of microseconds stored in this instance.
Definition: rtptimeutilities.h:181
RTPNTPTime GetNTPTime() const
Returns the NTP time corresponding to the time stored in this instance.
Definition: rtptimeutilities.h:335
This is a simple wrapper for the most significant word (MSW) and least significant word (LSW) of an N...
Definition: rtptimeutilities.h:65
RTPNTPTime(uint32_t m, uint32_t l)
This constructor creates and instance with MSW m and LSW l.
Definition: rtptimeutilities.h:69
double GetDouble() const
Returns the time stored in this instance, expressed in units of seconds.
Definition: rtptimeutilities.h:116
RTPTime(double t)
Creates an RTPTime instance representing t, which is expressed in units of seconds.
Definition: rtptimeutilities.h:137
This class is used to specify wallclock time, delay intervals etc.
Definition: rtptimeutilities.h:84
uint32_t GetLSW() const
Returns the least significant word.
Definition: rtptimeutilities.h:75
uint32_t GetMSW() const
Returns the most significant word.
Definition: rtptimeutilities.h:72
int64_t GetSeconds() const
Returns the number of seconds stored in this instance.
Definition: rtptimeutilities.h:176
static void Wait(const RTPTime &delay)
This function waits the amount of time specified in delay.
Definition: rtptimeutilities.h:306
static RTPTime CurrentTime()
Returns an RTPTime instance representing the current wallclock time.
Definition: rtptimeutilities.h:297