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
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel