---
 Changelog                    |  1 +
 cmdutils.c                   | 23 +++++++++++++++++++++++
 doc/avconv.texi              |  5 +++++
 doc/avtools-common-opts.texi |  7 +++++++
 4 files changed, 36 insertions(+)

diff --git a/Changelog b/Changelog
index edba289..48a4f27 100644
--- a/Changelog
+++ b/Changelog
@@ -29,6 +29,7 @@ version <next>:
 - display matrix export and rotation api
 - drop avserver, it was unmaintained for years and largely broken
 - Icecast protocol
+- support for using metadata in stream specifiers in avtools
 
 
 version 10:
diff --git a/cmdutils.c b/cmdutils.c
index 69a11bd..b208e52 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -1536,6 +1536,29 @@ int check_stream_specifier(AVFormatContext *s, AVStream 
*st, const char *spec)
         spec += 2;
         stream_id = strtol(spec, &endptr, 0);
         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;
 
diff --git a/doc/avconv.texi b/doc/avconv.texi
index 6efec55..1156176 100644
--- a/doc/avconv.texi
+++ b/doc/avconv.texi
@@ -720,6 +720,11 @@ To map all the streams except the second audio, use 
negative mappings
 avconv -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_metadata[:@var{metadata_spec_out}] 
@var{infile}[:@var{metadata_spec_in}] (@emph{output,per-metadata})
diff --git a/doc/avtools-common-opts.texi b/doc/avtools-common-opts.texi
index 3bf321f..8468eca 100644
--- a/doc/avtools-common-opts.texi
+++ b/doc/avtools-common-opts.texi
@@ -44,6 +44,13 @@ If @var{stream_index} is given, then matches stream number 
@var{stream_index} in
 program with id @var{program_id}. Otherwise matches all streams in this 
program.
 @item 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
 
-- 
2.0.0

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to