diff --git a/doc/fftools-common-opts.texi b/doc/fftools-common-opts.texi index 3b8581368d..509c8bca7c 100644 --- a/doc/fftools-common-opts.texi +++ b/doc/fftools-common-opts.texi @@ -36,8 +36,10 @@ Possible forms of stream specifiers are: Matches the stream with this index. E.g. @code{-threads:1 4} would set the thread count for the second stream to 4. @item @var{stream_type}[:@var{stream_index}] -@var{stream_type} is one of following: 'v' for video, 'a' for audio, 's' for subtitle, -'d' for data, and 't' for attachments. If @var{stream_index} is given, then it matches +@var{stream_type} is one of following: 'v' or 'V' for video, 'a' for audio, 's' +for subtitle, 'd' for data, and 't' for attachments. 'v' matches all video +streams, 'V' only matches video streams which are not attached pictures, video +thumbnails or cover arts. If @var{stream_index} is given, then it matches stream number @var{stream_index} of this type. Otherwise, it matches all streams of this type. @item p:@var{program_id}[:@var{stream_index}] diff --git a/libavformat/utils.c b/libavformat/utils.c index 3833b1ffb3..e67147c246 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4312,8 +4312,9 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, if (*spec <= '9' && *spec >= '0') /* opt:index */ return strtol(spec, NULL, 0) == st->index; else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' || - *spec == 't') { /* opt:[vasdt] */ + *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */ enum AVMediaType type; + int nopic = 0; switch (*spec++) { case 'v': type = AVMEDIA_TYPE_VIDEO; break; @@ -4321,15 +4322,20 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, case 's': type = AVMEDIA_TYPE_SUBTITLE; break; case 'd': type = AVMEDIA_TYPE_DATA; break; case 't': type = AVMEDIA_TYPE_ATTACHMENT; break; + case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break; default: av_assert0(0); } if (type != st->codec->codec_type) return 0; + if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) + return 0; if (*spec++ == ':') { /* possibly followed by :index */ int i, index = strtol(spec, NULL, 0); for (i = 0; i < s->nb_streams; i++) - if (s->streams[i]->codec->codec_type == type && index-- == 0) - return i == st->index; + if (s->streams[i]->codec->codec_type == type && + !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) && + index-- == 0) + return i == st->index; return 0; } return 1;