Hello the submitted patch addresses the regression discussed in ticket #6706.
<https://trac.ffmpeg.org/ticket/6706> The -channel_layout option is not working when the channel layout is not a default one (ex: for 4 channels, quad is interpreted as 4.0 which is the default layout for 4 channels; or octagonal interpreted as 7.1). This leads to the spurious auto-insertion of an auto-resampler filter remapping the channels even if input and output have identical channel layouts. Thanks for any comments. Regards
From e8216768be2323659081fab7b391fed132d1c2d9 Mon Sep 17 00:00:00 2001 From: pkviet <pkv.str...@gmail.com> Date: Sat, 30 Sep 2017 01:29:48 +0200 Subject: [PATCH] ffmpeg: fix channel_layout bug on non-default layout Fix for ticket 6706. The -channel_layout option was not working when the channel layout was not a default one (ex: for 4 channels, quad was interpreted as 4.0 which is the default layout for 4 channels; or octagonal interpreted as 7.1). This led to the spurious auto-insertion of an auto-resampler filter remapping the channels even if input and output had identical channel layouts. The fix operates by directly calling the channel layout if defined in options. If the layout is undefined, the default layout is selected as before the fix. --- ffmpeg_opt.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 100fa76..c8dcf4d 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -1800,11 +1800,16 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st); if (!ost->stream_copy) { - char *sample_fmt = NULL; + + char *sample_fmt = NULL; MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st); - MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st); + AVDictionaryEntry *output_layout = av_dict_get(o->g->codec_opts, "channel_layout",NULL, AV_DICT_MATCH_CASE); + if (output_layout) + ost->enc_ctx->channel_layout = _strtoui64(output_layout->value, NULL, 10); + + MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st); if (sample_fmt && (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) { av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt); @@ -2524,7 +2529,10 @@ loop_end: (count + 1) * sizeof(*f->sample_rates)); } if (ost->enc_ctx->channels) { - f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels); + if (ost->enc_ctx->channel_layout) + f->channel_layout = ost->enc_ctx->channel_layout; + else + f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels); } else if (ost->enc->channel_layouts) { count = 0; while (ost->enc->channel_layouts[count]) -- 2.10.1.windows.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel