lavf: add V as a video stream specifier which is not an attached picture

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2015-08-31 21:22:46 +02:00
parent 863522431f
commit 26a0cd1b4b
2 changed files with 13 additions and 5 deletions

View File

@ -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 Matches the stream with this index. E.g. @code{-threads:1 4} would set the
thread count for the second stream to 4. thread count for the second stream to 4.
@item @var{stream_type}[:@var{stream_index}] @item @var{stream_type}[:@var{stream_index}]
@var{stream_type} is one of following: 'v' for video, 'a' for audio, 's' for subtitle, @var{stream_type} is one of following: 'v' or 'V' for video, 'a' for audio, 's'
'd' for data, and 't' for attachments. If @var{stream_index} is given, then it matches 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 stream number @var{stream_index} of this type. Otherwise, it matches all
streams of this type. streams of this type.
@item p:@var{program_id}[:@var{stream_index}] @item p:@var{program_id}[:@var{stream_index}]

View File

@ -4312,8 +4312,9 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
if (*spec <= '9' && *spec >= '0') /* opt:index */ if (*spec <= '9' && *spec >= '0') /* opt:index */
return strtol(spec, NULL, 0) == st->index; return strtol(spec, NULL, 0) == st->index;
else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' || else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
*spec == 't') { /* opt:[vasdt] */ *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
enum AVMediaType type; enum AVMediaType type;
int nopic = 0;
switch (*spec++) { switch (*spec++) {
case 'v': type = AVMEDIA_TYPE_VIDEO; break; 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 's': type = AVMEDIA_TYPE_SUBTITLE; break;
case 'd': type = AVMEDIA_TYPE_DATA; break; case 'd': type = AVMEDIA_TYPE_DATA; break;
case 't': type = AVMEDIA_TYPE_ATTACHMENT; break; case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
default: av_assert0(0); default: av_assert0(0);
} }
if (type != st->codec->codec_type) if (type != st->codec->codec_type)
return 0; return 0;
if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
return 0;
if (*spec++ == ':') { /* possibly followed by :index */ if (*spec++ == ':') { /* possibly followed by :index */
int i, index = strtol(spec, NULL, 0); int i, index = strtol(spec, NULL, 0);
for (i = 0; i < s->nb_streams; i++) for (i = 0; i < s->nb_streams; i++)
if (s->streams[i]->codec->codec_type == type && index-- == 0) if (s->streams[i]->codec->codec_type == type &&
return i == st->index; !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
index-- == 0)
return i == st->index;
return 0; return 0;
} }
return 1; return 1;