stream-deploy/ZLM/3rdpart/media-server/librtsp/source/rtsp-header-rtp-info.c

77 lines
2.1 KiB
C++

// rfc2326 12.33 RTP-Info (p55)
// used to set RTP-specific parameters in the PLAY response
// parameter: url rtp stream url
// parameter: seq digit
// parameter: rtptime digit
// RTP-Info = "RTP-Info" ":" 1#stream-url 1*parameter
// stream-url = "url" "=" url
// parameter = ";" "seq" "=" 1*DIGIT
// | ";" "rtptime" "=" 1*DIGIT
//
// e.g. RTP-Info: url=rtsp://foo.com/bar.avi/streamid=0;seq=45102,url=rtsp://foo.com/bar.avi/streamid=1;seq=30211
#include "rtsp-header-rtp-info.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#if defined(_WIN32) || defined(_WIN64) || defined(OS_WINDOWS)
#define strncasecmp _strnicmp
#endif
#define RTP_INFO_SPECIAL ",;\r\n"
int rtsp_header_rtp_info(const char* field, struct rtsp_header_rtp_info_t* rtpinfo)
{
const char* p1;
const char* p = field;
while(p && *p)
{
p1 = strpbrk(p, RTP_INFO_SPECIAL);
if(0 == strncasecmp("url=", p, 4))
{
size_t n = (size_t)(p1 - p - 4); // ptrdiff_t -> size_t
if(n >= sizeof(rtpinfo->url))
return -1;
memcpy(rtpinfo->url, p+4, n);
rtpinfo->url[n] = '\0';
}
else if(1 == sscanf(p, "seq = %" PRIu64, &rtpinfo->seq))
{
}
else if(1 == sscanf(p, "rtptime = %" PRIu64, &rtpinfo->rtptime))
{
}
else
{
assert(0); // unknown parameter
}
if(NULL == p1 || '\r' == *p1 || '\n' == *p1 || '\0' == *p1 || ',' == *p1)
break;
p = p1 + 1;
}
return 0;
}
#if defined(DEBUG) || defined(_DEBUG)
void rtsp_header_rtp_info_test(void)
{
struct rtsp_header_rtp_info_t rtp;
memset(&rtp, 0, sizeof(rtp));
assert(0 == rtsp_header_rtp_info("url=rtsp://foo.com/bar.avi/streamid=0;seq=45102", &rtp)); // rfc2326 p56
assert(0 == strcmp(rtp.url, "rtsp://foo.com/bar.avi/streamid=0"));
assert(rtp.seq == 45102);
memset(&rtp, 0, sizeof(rtp));
assert(0 == rtsp_header_rtp_info("url=rtsp://foo.com/bar.avi/streamid=0;seq=45102;rtptime=123456789, url=rtsp://foo.com/bar.avi/streamid=1;seq=30211", &rtp));
assert(0 == strcmp(rtp.url, "rtsp://foo.com/bar.avi/streamid=0"));
assert(rtp.seq == 45102 && rtp.rtptime == 123456789);
}
#endif