From 29db7c3af4b90f035c175e94df14bc931cfd13a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 5 Jan 2011 21:23:42 +0000 Subject: [PATCH] rtsp: Parse RTP-Info headers Originally committed as revision 26236 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/rtsp.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 431703e205..a38cc42408 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -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, RTSPState *rt, const char *method) { @@ -728,6 +783,10 @@ void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, p += strspn(p, SPACE_CHARS); if (method && !strcmp(method, "DESCRIBE")) 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); } }