[FFmpeg-devel] [PATCH v2 1/5] fftools/ffmpeg_demux: honor -ch_layout options for overriding input stream channel layout
Marton Balint
cus at passwd.hu
Sat May 25 19:57:32 EEST 2024
On Sun, 19 May 2024, Marton Balint wrote:
> The code only set the channel layout of the AVFormatContext, so the user could
> not override the channel layout if the demuxer did not have such parameter.
>
> This used to work via the respective AVCodecContext option, but since
> 639c2f00497257cb60ecaeeac1aacfa80df3be06 it no longer gets passed to the
> decoders. It is actually better if we set it manually, instead of using the
> codec option because that way we can also override it on the stream level, so
> it will also work for stream copy or bitstream filtering.
>
> We don't allow changing the number of channels, because that can cause
> unexpected results. We disable layout guessing, if a channel layout is
> specified.
>
> Fixes ticket #11016.
Will apply the series.
Regards,
Marton
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> fftools/ffmpeg_demux.c | 27 ++++++++++++++++++++++++---
> 1 file changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
> index cba63dab5f..1ca8d804ae 100644
> --- a/fftools/ffmpeg_demux.c
> +++ b/fftools/ffmpeg_demux.c
> @@ -1386,9 +1386,30 @@ static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st)
>
> break;
> case AVMEDIA_TYPE_AUDIO: {
> - int guess_layout_max = INT_MAX;
> - MATCH_PER_STREAM_OPT(guess_layout_max, i, guess_layout_max, ic, st);
> - guess_input_channel_layout(ist, par, guess_layout_max);
> + char *ch_layout_str = NULL;
> + MATCH_PER_STREAM_OPT(audio_ch_layouts, str, ch_layout_str, ic, st);
> + if (ch_layout_str) {
> + AVChannelLayout ch_layout;
> + ret = av_channel_layout_from_string(&ch_layout, ch_layout_str);
> + if (ret < 0) {
> + av_log(ist, AV_LOG_ERROR, "Error parsing channel layout %s.\n", ch_layout_str);
> + return ret;
> + }
> + if (par->ch_layout.nb_channels <= 0 || par->ch_layout.nb_channels == ch_layout.nb_channels) {
> + av_channel_layout_uninit(&par->ch_layout);
> + par->ch_layout = ch_layout;
> + } else {
> + av_log(ist, AV_LOG_ERROR,
> + "Specified channel layout '%s' has %d channels, but input has %d channels.\n",
> + ch_layout_str, ch_layout.nb_channels, par->ch_layout.nb_channels);
> + av_channel_layout_uninit(&ch_layout);
> + return AVERROR(EINVAL);
> + }
> + } else {
> + int guess_layout_max = INT_MAX;
> + MATCH_PER_STREAM_OPT(guess_layout_max, i, guess_layout_max, ic, st);
> + guess_input_channel_layout(ist, par, guess_layout_max);
> + }
> break;
> }
> case AVMEDIA_TYPE_DATA:
> --
> 2.35.3
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
More information about the ffmpeg-devel
mailing list