summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ffmpeg.texi6
-rw-r--r--ffmpeg.c2
-rw-r--r--ffmpeg.h3
-rw-r--r--ffmpeg_opt.c4
4 files changed, 15 insertions, 0 deletions
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) },