mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
rtsp: Parse RTP-Info headers
Originally committed as revision 26236 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
4cb06874c7
commit
29db7c3af4
@ -684,6 +684,61 @@ static void rtsp_parse_transport(RTSPMessageHeader *reply, const char *p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_rtp_info(RTSPState *rt, const char *url,
|
||||||
|
uint32_t seq, uint32_t rtptime)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if (!rtptime || !url[0])
|
||||||
|
return;
|
||||||
|
if (rt->transport != RTSP_TRANSPORT_RTP)
|
||||||
|
return;
|
||||||
|
for (i = 0; i < rt->nb_rtsp_streams; i++) {
|
||||||
|
RTSPStream *rtsp_st = rt->rtsp_streams[i];
|
||||||
|
RTPDemuxContext *rtpctx = rtsp_st->transport_priv;
|
||||||
|
if (!rtpctx)
|
||||||
|
continue;
|
||||||
|
if (!strcmp(rtsp_st->control_url, url)) {
|
||||||
|
rtpctx->base_timestamp = rtptime;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rtsp_parse_rtp_info(RTSPState *rt, const char *p)
|
||||||
|
{
|
||||||
|
int read = 0;
|
||||||
|
char key[20], value[1024], url[1024] = "";
|
||||||
|
uint32_t seq = 0, rtptime = 0;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
p += strspn(p, SPACE_CHARS);
|
||||||
|
if (!*p)
|
||||||
|
break;
|
||||||
|
get_word_sep(key, sizeof(key), "=", &p);
|
||||||
|
if (*p != '=')
|
||||||
|
break;
|
||||||
|
p++;
|
||||||
|
get_word_sep(value, sizeof(value), ";, ", &p);
|
||||||
|
read++;
|
||||||
|
if (!strcmp(key, "url"))
|
||||||
|
av_strlcpy(url, value, sizeof(url));
|
||||||
|
else if (!strcmp(key, "seq"))
|
||||||
|
seq = strtol(value, NULL, 10);
|
||||||
|
else if (!strcmp(key, "rtptime"))
|
||||||
|
rtptime = strtol(value, NULL, 10);
|
||||||
|
if (*p == ',') {
|
||||||
|
handle_rtp_info(rt, url, seq, rtptime);
|
||||||
|
url[0] = '\0';
|
||||||
|
seq = rtptime = 0;
|
||||||
|
read = 0;
|
||||||
|
}
|
||||||
|
if (*p)
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (read > 0)
|
||||||
|
handle_rtp_info(rt, url, seq, rtptime);
|
||||||
|
}
|
||||||
|
|
||||||
void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
|
void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
|
||||||
RTSPState *rt, const char *method)
|
RTSPState *rt, const char *method)
|
||||||
{
|
{
|
||||||
@ -728,6 +783,10 @@ void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
|
|||||||
p += strspn(p, SPACE_CHARS);
|
p += strspn(p, SPACE_CHARS);
|
||||||
if (method && !strcmp(method, "DESCRIBE"))
|
if (method && !strcmp(method, "DESCRIBE"))
|
||||||
av_strlcpy(rt->control_uri, p , sizeof(rt->control_uri));
|
av_strlcpy(rt->control_uri, p , sizeof(rt->control_uri));
|
||||||
|
} else if (av_stristart(p, "RTP-Info:", &p) && rt) {
|
||||||
|
p += strspn(p, SPACE_CHARS);
|
||||||
|
if (method && !strcmp(method, "PLAY"))
|
||||||
|
rtsp_parse_rtp_info(rt, p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user