diff --git a/modules/stream_out/rtsp.c b/modules/stream_out/rtsp.c index 35ee7e7776bcc6679b41565151b2242cd2b16d71..52bc54fc9bad2cc83e78ad187414cf7a223078fb 100644 --- a/modules/stream_out/rtsp.c +++ b/modules/stream_out/rtsp.c @@ -705,7 +705,9 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, tpt = transport_next( tpt ) ) { bool b_multicast = true, b_unsupp = false; + bool b_multicast_port_set = false; unsigned loport = 5004, hiport; /* from RFC3551 */ + unsigned mloport = 5004, mhiport = mloport + 1; /* Check transport protocol. */ /* Currently, we only support RTP/AVP over UDP */ @@ -732,6 +734,10 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, == 2 ) ; else + if( sscanf( opt, "port=%u-%u", &mloport, &mhiport ) + == 2 ) + b_multicast_port_set = true; + else if( strncmp( opt, "mode=", 5 ) == 0 ) { if( strncasecmp( opt + 5, "play", 4 ) @@ -756,7 +762,7 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, * "source" and "append" are invalid (server-only); * "ssrc" also (as clarified per RFC2326bis). * - * For multicast, "port", "layers", "ttl" are set by the + * For multicast, "layers", "ttl" are set by the * stream output configuration. * * For unicast, we want to decide "server_port" values. @@ -780,6 +786,15 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id, net_GetPeerAddress(id->mcast_fd, dst, &dport); + /* Checking for multicast port override */ + if( b_multicast_port_set + && ((unsigned)dport != mloport + || (unsigned)dport + 1 != mhiport)) + { + answer->i_status = 551; + continue; + } + ttl = var_InheritInteger(owner, "ttl"); if (ttl <= 0) /* FIXME: the TTL is left to the OS default, we can