Streams from the RTSP server that do not match an allowed type will be skipped entirely, which allows video-only or audio-only streaming from servers that provide both. --- libavformat/rtsp.c | 10 +++++++++- libavformat/rtsp.h | 5 +++++ 2 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 5aadc44..94184b0 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -74,6 +74,12 @@ const AVOption ff_rtsp_options[] = { { "udp_multicast", "UDP multicast", 0, AV_OPT_TYPE_CONST, {1 << RTSP_LOWER_TRANSPORT_UDP_MULTICAST}, 0, 0, DEC, "rtsp_transport" }, { "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {(1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" }, RTSP_FLAG_OPTS("rtsp_flags", "RTSP flags"), + + { "allowed_media_types", "Media types to accept from the server", OFFSET(media_type_mask), AV_OPT_TYPE_FLAGS, { (1 << (AVMEDIA_TYPE_DATA+1)) - 1 }, INT_MIN, INT_MAX, DEC, "allowed_media_types" }, \ + { "video", "Video", 0, AV_OPT_TYPE_CONST, {1 << AVMEDIA_TYPE_VIDEO}, 0, 0, DEC, "allowed_media_types" }, \ + { "audio", "Audio", 0, AV_OPT_TYPE_CONST, {1 << AVMEDIA_TYPE_AUDIO}, 0, 0, DEC, "allowed_media_types" }, \ + { "data", "Data", 0, AV_OPT_TYPE_CONST, {1 << AVMEDIA_TYPE_DATA}, 0, 0, DEC, "allowed_media_types" }, + { NULL }, }; @@ -325,6 +331,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, case 'm': /* new stream */ s1->skip_media = 0; + codec_type = AVMEDIA_TYPE_UNKNOWN; get_word(st_type, sizeof(st_type), &p); if (!strcmp(st_type, "audio")) { codec_type = AVMEDIA_TYPE_AUDIO; @@ -332,7 +339,8 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, codec_type = AVMEDIA_TYPE_VIDEO; } else if (!strcmp(st_type, "application")) { codec_type = AVMEDIA_TYPE_DATA; - } else { + } + if (codec_type == AVMEDIA_TYPE_UNKNOWN || !(rt->media_type_mask & (1 << codec_type))) { s1->skip_media = 1; return; } diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h index 7143acb..45b0032 100644 --- a/libavformat/rtsp.h +++ b/libavformat/rtsp.h @@ -354,6 +354,11 @@ typedef struct RTSPState { * Various option flags for the RTSP muxer/demuxer. */ int rtsp_flags; + + /** + * Mask of all requested media types + */ + int media_type_mask; } RTSPState; #define RTSP_FLAG_FILTER_SRC 0x1 /**< Filter incoming UDP packets - -- 1.7.5.4 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel