avconv: only set the "channels" option when it exists for the specified input format
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 16 Apr 2012 16:51:24 +0000 (12:51 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Tue, 17 Apr 2012 03:44:49 +0000 (23:44 -0400)
This allows the user to specify an input channel layout without avconv aborting because the
"channels" option was not found.

avconv.c

index 347f804..48b4c6b 100644 (file)
--- a/avconv.c
+++ b/avconv.c
@@ -3627,8 +3627,16 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena
         av_dict_set(&format_opts, "sample_rate", buf, 0);
     }
     if (o->nb_audio_channels) {
-        snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
-        av_dict_set(&format_opts, "channels", buf, 0);
+        /* because we set audio_channels based on both the "ac" and
+         * "channel_layout" options, we need to check that the specified
+         * demuxer actually has the "channels" option before setting it */
+        if (file_iformat && file_iformat->priv_class &&
+            av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
+                        AV_OPT_SEARCH_FAKE_OBJ)) {
+            snprintf(buf, sizeof(buf), "%d",
+                     o->audio_channels[o->nb_audio_channels - 1].u.i);
+            av_dict_set(&format_opts, "channels", buf, 0);
+        }
     }
     if (o->nb_frame_rates) {
         av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);