mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 20:01:56 +00:00
66 lines
2 KiB
C++
66 lines
2 KiB
C++
|
/*
|
||
|
* SRT - Secure, Reliable, Transport
|
||
|
* Copyright (c) 2018 Haivision Systems Inc.
|
||
|
*
|
||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*****************************************************************************
|
||
|
written by
|
||
|
Haivision Systems Inc.
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include "win/wintime.h"
|
||
|
#include <sys/timeb.h>
|
||
|
|
||
|
void SRTCompat_timeradd(struct timeval *a, struct timeval *b, struct timeval *result)
|
||
|
{
|
||
|
result->tv_sec = a->tv_sec + b->tv_sec;
|
||
|
result->tv_usec = a->tv_usec + b->tv_usec;
|
||
|
if (result->tv_usec >= 1000000)
|
||
|
{
|
||
|
result->tv_sec++;
|
||
|
result->tv_usec -= 1000000;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int SRTCompat_gettimeofday(struct timeval* tp, struct timezone* tz)
|
||
|
{
|
||
|
static LARGE_INTEGER tickFrequency, epochOffset;
|
||
|
|
||
|
// For our first call, use "ftime()", so that we get a time with a proper epoch.
|
||
|
// For subsequent calls, use "QueryPerformanceCount()", because it's more fine-grain.
|
||
|
static int isFirstCall = 1;
|
||
|
|
||
|
LARGE_INTEGER tickNow;
|
||
|
QueryPerformanceCounter(&tickNow);
|
||
|
|
||
|
if (isFirstCall)
|
||
|
{
|
||
|
struct timeb tb;
|
||
|
ftime(&tb);
|
||
|
tp->tv_sec = (long)tb.time;
|
||
|
tp->tv_usec = 1000*tb.millitm;
|
||
|
|
||
|
// Also get our counter frequency:
|
||
|
QueryPerformanceFrequency(&tickFrequency);
|
||
|
|
||
|
// And compute an offset to add to subsequent counter times, so we get a proper epoch:
|
||
|
epochOffset.QuadPart = tb.time*tickFrequency.QuadPart + (tb.millitm*tickFrequency.QuadPart)/1000 - tickNow.QuadPart;
|
||
|
|
||
|
isFirstCall = 0; // for next time
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Adjust our counter time so that we get a proper epoch:
|
||
|
tickNow.QuadPart += epochOffset.QuadPart;
|
||
|
|
||
|
tp->tv_sec = (long) (tickNow.QuadPart / tickFrequency.QuadPart);
|
||
|
tp->tv_usec = (long) (((tickNow.QuadPart % tickFrequency.QuadPart) * 1000000L) / tickFrequency.QuadPart);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|