[FFmpeg-devel] [PATCH 01/10] ffmpeg: add -guess_layout_max option.

Nicolas George nicolas.george at normalesup.org
Wed Jan 16 17:50:15 CET 2013


Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
 doc/ffmpeg.texi |    6 ++++++
 ffmpeg.c        |    2 ++
 ffmpeg.h        |    3 +++
 ffmpeg_opt.c    |    4 ++++
 4 files changed, 15 insertions(+)


Changed into a per-stream option (overkill IMHO, but Michael seems to want
it that way).


diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 8a29d5e..8c07b33 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -603,6 +603,12 @@ This is an alias for @code{-filter:a}, see the @ref{filter_option,,-filter optio
 Force audio tag/fourcc. This is an alias for @code{-tag:a}.
 @item -absf @var{bitstream_filter}
 Deprecated, see -bsf
+ at item -guess_layout_max @var{channels} (@emph{input,per-stream})
+If some input channel layout is not known, try to guess only if it
+corresponds to at most the specified number of channels. For example, 2
+tells to @command{ffmpeg} to recognize 1 channel as mono and 2 channels as
+stereo but not 6 channels as 5.1. The default is to always try to guess. Use
+0 to disable all guessing.
 @end table
 
 @section Subtitle options:
diff --git a/ffmpeg.c b/ffmpeg.c
index acaa523..165da9a 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1443,6 +1443,8 @@ int guess_input_channel_layout(InputStream *ist)
     if (!dec->channel_layout) {
         char layout_name[256];
 
+        if (dec->channels > ist->guess_layout_max)
+            return 0;
         dec->channel_layout = av_get_default_channel_layout(dec->channels);
         if (!dec->channel_layout)
             return 0;
diff --git a/ffmpeg.h b/ffmpeg.h
index 1260563..9e2e97b 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -171,6 +171,8 @@ typedef struct OptionsContext {
     int        nb_pass;
     SpecifierOpt *passlogfiles;
     int        nb_passlogfiles;
+    SpecifierOpt *guess_layout_max;
+    int        nb_guess_layout_max;
 } OptionsContext;
 
 typedef struct InputFilter {
@@ -229,6 +231,7 @@ typedef struct InputStream {
     AVDictionary *opts;
     AVRational framerate;               /* framerate forced with -r */
     int top_field_first;
+    int guess_layout_max;
 
     int resample_height;
     int resample_width;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 09f75d3..2d63246 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -616,6 +616,8 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
 
             break;
         case AVMEDIA_TYPE_AUDIO:
+            ist->guess_layout_max = INT_MAX;
+            MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
             guess_input_channel_layout(ist);
 
             ist->resample_sample_fmt     = dec->sample_fmt;
@@ -2581,6 +2583,8 @@ const OptionDef options[] = {
         "set channel layout", "layout" },
     { "af",             OPT_AUDIO | HAS_ARG  | OPT_PERFILE,                        { .func_arg = opt_audio_filters },
         "set audio filters", "filter_graph" },
+    { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT,   { .off = OFFSET(guess_layout_max) },
+      "set the maximum number of channels to try to guess the channel layout" },
 
     /* subtitle options */
     { "sn",     OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(subtitle_disable) },
-- 
1.7.10.4



More information about the ffmpeg-devel mailing list