diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-08-14 00:41:08 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-08-14 00:41:21 +0200 |
commit | b8e4c11d93326cd86278d012c28e54dca0a06cef (patch) | |
tree | 96ed0fc1c7d5db348b532dd993710430290585a1 | |
parent | c8571c61ec4c352e7eac7147b7c1644d2406189e (diff) | |
parent | 481a3667495425db9fdffb653292b6460fb68208 (diff) | |
download | ffmpeg-b8e4c11d93326cd86278d012c28e54dca0a06cef.tar.gz |
Merge commit '481a3667495425db9fdffb653292b6460fb68208'
* commit '481a3667495425db9fdffb653292b6460fb68208':
cmdutils: allow matching by metadata in stream specifiers
Conflicts:
Changelog
cmdutils.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | Changelog | 1 | ||||
-rw-r--r-- | doc/ffmpeg.texi | 5 | ||||
-rw-r--r-- | doc/fftools-common-opts.texi | 7 | ||||
-rw-r--r-- | libavformat/utils.c | 23 |
4 files changed, 36 insertions, 0 deletions
@@ -6,6 +6,7 @@ version <next>: - ported lenscorrection filter from frei0r filter - large optimizations in dctdnoiz to make it usable - request icecast metadata by default +- support for using metadata in stream specifiers in fftools version 2.3: diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index f741a053f5..158f4ed6cc 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -821,6 +821,11 @@ To map all the streams except the second audio, use negative mappings ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT @end example +To pick the English audio stream: +@example +avconv -i INPUT -map 0:m:language:eng OUTPUT +@end example + Note that using this option disables the default mappings for this output file. @item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}] diff --git a/doc/fftools-common-opts.texi b/doc/fftools-common-opts.texi index ab627ca4a9..6ee6292c5f 100644 --- a/doc/fftools-common-opts.texi +++ b/doc/fftools-common-opts.texi @@ -46,6 +46,13 @@ in the program with the id @var{program_id}. Otherwise, it matches all streams i program. @item #@var{stream_id} or i:@var{stream_id} Match the stream by stream id (e.g. PID in MPEG-TS container). +@item m:@var{key}[:@var{value}] +Matches streams with the metadata tag @var{key} having the specified value. If +@var{value} is not given, matches streams that contain the given tag with any +value. + +Note that in @command{avconv}, matching by metadata will only work properly for +input files. @end table @section Generic options diff --git a/libavformat/utils.c b/libavformat/utils.c index 13d4c6b1ee..5bb56428f0 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4216,6 +4216,29 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, stream_id = strtol(spec, &endptr, 0); if (!*endptr) return stream_id == st->id; + } else if (*spec == 'm' && *(spec + 1) == ':') { + AVDictionaryEntry *tag; + char *key, *val; + int ret; + + spec += 2; + val = strchr(spec, ':'); + + key = val ? av_strndup(spec, val - spec) : av_strdup(spec); + if (!key) + return AVERROR(ENOMEM); + + tag = av_dict_get(st->metadata, key, NULL, 0); + if (tag) { + if (!val || !strcmp(tag->value, val + 1)) + ret = 1; + else + ret = 0; + } else + ret = 0; + + av_freep(&key); + return ret; } else if (!*spec) /* empty specifier, matches everything */ return 1; |