Initial setup for CLion
This commit is contained in:
258
MediaClient/rtsp/rtsp_util.cpp
Normal file
258
MediaClient/rtsp/rtsp_util.cpp
Normal file
@@ -0,0 +1,258 @@
|
||||
/***************************************************************************************
|
||||
*
|
||||
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
*
|
||||
* By downloading, copying, installing or using the software you agree to this license.
|
||||
* If you do not agree to this license, do not download, install,
|
||||
* copy or use the software.
|
||||
*
|
||||
* Copyright (C) 2014-2024, Happytimesoft Corporation, all rights reserved.
|
||||
*
|
||||
* Redistribution and use in binary forms, with or without modification, are permitted.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed
|
||||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing permissions and limitations under the License.
|
||||
*
|
||||
****************************************************************************************/
|
||||
|
||||
#include "sys_inc.h"
|
||||
#include "rtsp_util.h"
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
#define UDP_BASE_PORT 40000
|
||||
|
||||
static uint16 g_udp_bport = UDP_BASE_PORT;
|
||||
static void * g_udp_port_mutex = sys_os_create_mutex();
|
||||
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
uint16 rtsp_get_udp_port()
|
||||
{
|
||||
uint16 port;
|
||||
|
||||
sys_os_mutex_enter(g_udp_port_mutex);
|
||||
|
||||
port = g_udp_bport;
|
||||
g_udp_bport += 2;
|
||||
if (g_udp_bport > 65534)
|
||||
{
|
||||
g_udp_bport = UDP_BASE_PORT;
|
||||
}
|
||||
|
||||
sys_os_mutex_leave(g_udp_port_mutex);
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
uint32 rtsp_get_timestamp(int frequency)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday(&tv, 0);
|
||||
|
||||
// Begin by converting from "struct timeval" units to RTP timestamp units:
|
||||
uint32 increment = (frequency*tv.tv_sec);
|
||||
increment += (uint32)(frequency*(tv.tv_usec/1000000.0) + 0.5); // note: rounding
|
||||
|
||||
return increment;
|
||||
}
|
||||
|
||||
char * rtsp_get_utc_time()
|
||||
{
|
||||
static char buff[100];
|
||||
|
||||
time_t t = time(NULL);
|
||||
struct tm *ptr = gmtime(&t);
|
||||
|
||||
strftime(buff, sizeof(buff)-1, "%a, %b %d %Y %H:%M:%S GMT", ptr);
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
||||
int rtsp_pkt_find_end(char * p_buf)
|
||||
{
|
||||
int end_off = 0;
|
||||
int rtsp_pkt_finish = 0;
|
||||
|
||||
while (p_buf[end_off] != '\0')
|
||||
{
|
||||
if ((p_buf[end_off+0] == '\r' && p_buf[end_off+1] == '\n') &&
|
||||
(p_buf[end_off+2] == '\r' && p_buf[end_off+3] == '\n'))
|
||||
{
|
||||
rtsp_pkt_finish = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
end_off++;
|
||||
}
|
||||
|
||||
if (rtsp_pkt_finish)
|
||||
{
|
||||
return(end_off + 4);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
time_t rtsp_timegm(struct tm *T)
|
||||
{
|
||||
time_t t, g, z;
|
||||
struct tm tm;
|
||||
|
||||
t = mktime(T);
|
||||
if (t == (time_t)-1)
|
||||
{
|
||||
return (time_t)-1;
|
||||
}
|
||||
|
||||
tm = *gmtime(&t);
|
||||
|
||||
tm.tm_isdst = 0;
|
||||
g = mktime(&tm);
|
||||
if (g == (time_t)-1)
|
||||
{
|
||||
return (time_t)-1;
|
||||
}
|
||||
|
||||
z = g - t;
|
||||
return t - z;
|
||||
}
|
||||
|
||||
BOOL rtsp_parse_xsd_datetime(const char * s, time_t * p)
|
||||
{
|
||||
if (s)
|
||||
{
|
||||
char zone[32];
|
||||
struct tm T;
|
||||
const char *t;
|
||||
|
||||
*zone = '\0';
|
||||
memset(&T, 0, sizeof(T));
|
||||
|
||||
if (strchr(s, '-'))
|
||||
{
|
||||
t = "%d-%d-%dT%d:%d:%d%31s";
|
||||
}
|
||||
else if (strchr(s, ':'))
|
||||
{
|
||||
t = "%4d%2d%2dT%d:%d:%d%31s";
|
||||
}
|
||||
else /* parse non-XSD-standard alternative ISO 8601 format */
|
||||
{
|
||||
t = "%4d%2d%2dT%2d%2d%2d%31s";
|
||||
}
|
||||
|
||||
if (sscanf(s, t, &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone) < 6)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (T.tm_year == 1)
|
||||
{
|
||||
T.tm_year = 70;
|
||||
}
|
||||
else
|
||||
{
|
||||
T.tm_year -= 1900;
|
||||
}
|
||||
|
||||
T.tm_mon--;
|
||||
|
||||
if (*zone == '.')
|
||||
{
|
||||
for (s = zone + 1; *s; s++)
|
||||
{
|
||||
if (*s < '0' || *s > '9')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
s = zone;
|
||||
}
|
||||
|
||||
if (*s)
|
||||
{
|
||||
if (*s == '+' || *s == '-')
|
||||
{
|
||||
int h = 0, m = 0;
|
||||
if (s[3] == ':')
|
||||
{
|
||||
/* +hh:mm */
|
||||
sscanf(s, "%d:%d", &h, &m);
|
||||
if (h < 0)
|
||||
m = -m;
|
||||
}
|
||||
else /* +hhmm */
|
||||
{
|
||||
m = (int)strtol(s, NULL, 10);
|
||||
h = m / 100;
|
||||
m = m % 100;
|
||||
}
|
||||
|
||||
T.tm_min -= m;
|
||||
T.tm_hour -= h;
|
||||
/* put hour and min in range */
|
||||
T.tm_hour += T.tm_min / 60;
|
||||
T.tm_min %= 60;
|
||||
|
||||
if (T.tm_min < 0)
|
||||
{
|
||||
T.tm_min += 60;
|
||||
T.tm_hour--;
|
||||
}
|
||||
|
||||
T.tm_mday += T.tm_hour / 24;
|
||||
T.tm_hour %= 24;
|
||||
|
||||
if (T.tm_hour < 0)
|
||||
{
|
||||
T.tm_hour += 24;
|
||||
T.tm_mday--;
|
||||
}
|
||||
/* note: day of the month may be out of range, timegm() handles it */
|
||||
}
|
||||
|
||||
*p = rtsp_timegm(&T);
|
||||
}
|
||||
else /* no UTC or timezone, so assume we got a localtime */
|
||||
{
|
||||
T.tm_isdst = -1;
|
||||
*p = mktime(&T);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int64 rtsp_gettime()
|
||||
{
|
||||
#if __LINUX_OS__
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
return (int64)tv.tv_sec * 1000000 + tv.tv_usec;
|
||||
#elif __WINDOWS_OS__
|
||||
FILETIME ft;
|
||||
int64 t;
|
||||
GetSystemTimeAsFileTime(&ft);
|
||||
t = (int64)ft.dwHighDateTime << 32 | ft.dwLowDateTime;
|
||||
return t / 10 - 11644473600000000; /* Jan 1, 1601 */
|
||||
#endif
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint64 rtsp_ntp_time()
|
||||
{
|
||||
return (rtsp_gettime() / 1000) * 1000 + NTP_OFFSET_US;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user