Commit 36fb0d02 authored by Ed Torbett's avatar Ed Torbett Committed by Martin Storsjö

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: 's avatarMartin Storsjö <martin@martin.st>
parent 4d97ca04
...@@ -495,6 +495,22 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, ...@@ -495,6 +495,22 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
p += strspn(p, SPACE_CHARS); p += strspn(p, SPACE_CHARS);
if (av_strstart(p, "inline:", &p)) if (av_strstart(p, "inline:", &p))
get_word(rtsp_st->crypto_params, sizeof(rtsp_st->crypto_params), &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 { } else {
if (rt->server_type == RTSP_SERVER_WMS) if (rt->server_type == RTSP_SERVER_WMS)
ff_wms_parse_sdp_a_line(s, p); ff_wms_parse_sdp_a_line(s, p);
...@@ -2085,6 +2101,8 @@ static int sdp_read_header(AVFormatContext *s) ...@@ -2085,6 +2101,8 @@ static int sdp_read_header(AVFormatContext *s)
"?localport=%d&ttl=%d&connect=%d", rtsp_st->sdp_port, "?localport=%d&ttl=%d&connect=%d", rtsp_st->sdp_port,
rtsp_st->sdp_ttl, rtsp_st->sdp_ttl,
rt->rtsp_flags & RTSP_FLAG_FILTER_SRC ? 1 : 0); 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, if (ffurl_open(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE,
&s->interrupt_callback, NULL) < 0) { &s->interrupt_callback, NULL) < 0) {
err = AVERROR_INVALIDDATA; err = AVERROR_INVALIDDATA;
......
...@@ -425,6 +425,7 @@ typedef struct RTSPStream { ...@@ -425,6 +425,7 @@ typedef struct RTSPStream {
//@{ //@{
int sdp_port; /**< port (from SDP content) */ int sdp_port; /**< port (from SDP content) */
struct sockaddr_storage sdp_ip; /**< IP address (from SDP content) */ struct sockaddr_storage sdp_ip; /**< IP address (from SDP content) */
char source_addr[100]; /**< Source-specific multicast source IP address (from SDP content) */
int sdp_ttl; /**< IP Time-To-Live (from SDP content) */ int sdp_ttl; /**< IP Time-To-Live (from SDP content) */
int sdp_payload_type; /**< payload type */ int sdp_payload_type; /**< payload type */
//@} //@}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment