77 lines
2.1 KiB
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
|