summaryrefslogtreecommitdiff
path: root/libavformat/rtsp.c
diff options
context:
space:
mode:
authorEd Torbett <ed.torbett@simulation-systems.co.uk>2013-06-27 08:53:00 +0100
committerMartin Storsjö <martin@martin.st>2013-07-19 12:02:13 +0300
commit36fb0d02a1faa11eaee51de01fb4061ad6092af9 (patch)
treee019e42c4700c545d40827a83b88bd21267517cb /libavformat/rtsp.c
parent4d97ca040b40eb4771d1a6cacdb611f61a53afd8 (diff)
rtsp: Support multicast source filters (RFC 4570)
This supports inclusion of one single IP address for now, at the media level. Specifying the filter at the session level (instead of at the media level), multiple source addresses, exclusion, or using FQDNs instead of plain IP addresses is not supported (yet at least). Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 29ef403a27..7217640e24 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -495,6 +495,22 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
p += strspn(p, SPACE_CHARS);
if (av_strstart(p, "inline:", &p))
get_word(rtsp_st->crypto_params, sizeof(rtsp_st->crypto_params), &p);
+ } else if (av_strstart(p, "source-filter:", &p) && s->nb_streams > 0) {
+ get_word(buf1, sizeof(buf1), &p);
+ if (strcmp(buf1, "incl"))
+ return;
+
+ get_word(buf1, sizeof(buf1), &p);
+ if (strcmp(buf1, "IN") != 0)
+ return;
+ get_word(buf1, sizeof(buf1), &p);
+ if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6"))
+ return;
+ // not checking that the destination address actually matches
+ get_word(buf1, sizeof(buf1), &p);
+
+ rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
+ get_word(rtsp_st->source_addr, sizeof(rtsp_st->source_addr), &p);
} else {
if (rt->server_type == RTSP_SERVER_WMS)
ff_wms_parse_sdp_a_line(s, p);
@@ -2085,6 +2101,8 @@ static int sdp_read_header(AVFormatContext *s)
"?localport=%d&ttl=%d&connect=%d", rtsp_st->sdp_port,
rtsp_st->sdp_ttl,
rt->rtsp_flags & RTSP_FLAG_FILTER_SRC ? 1 : 0);
+ if (rtsp_st->source_addr[0])
+ av_strlcatf(url, sizeof(url), "&sources=%s", rtsp_st->source_addr);
if (ffurl_open(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE,
&s->interrupt_callback, NULL) < 0) {
err = AVERROR_INVALIDDATA;