diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index 5aa45629d4..2c023e12bf 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -611,6 +611,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 +@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 6d53edfa64..329b7e420f 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 1260563cb8..9e2e97be30 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 9a53bd68fd..09bbc9cf27 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) },