[MPlayer-dev-eng] [PATCH] Fix af_lavcresample to use the new ch_layout scheme.

Alexander Strasser eclipse7 at gmx.net
Sun Apr 7 18:09:08 EEST 2024


LGTM

Should go in right after my patch set IMHO


  Alexander

On 2024-04-07 15:14 +0300, Ivan Kalvachev wrote:
> Just like the rest of FFmpeg 7.x swresample library doesn't accept
> "number of channels" as separate parameter anymore and requires it to
> be part of channel layout structure that also describes the audio
> speakers layout.
>
> While Alexander Strasser's (beastd) patch series mostly fix this kind
> of change in other parts of the code, here it remained unnoticed
> because it doesn't cause compilation failure.
>
> The existing af_lavcresample code uses av_opt_set*() and because of
> that the errors are returned at runtime.
>
> Since lavresample is automatically inserted to change the sample rate
> (e.g. 44100->48000) it caused some videos to lose sound entirely.
>
> To fix it, I'm just getting the default channel layout for the given
> number of channels. It's the simplest code that makes it work.
>
> This together with the change of ad_ffmpeg.c patch let's me play
> everything so far.
>
> Best Regards
>     Ivan Kalvachev

> Index: af_lavcresample.c
> ===================================================================
> --- af_lavcresample.c	(revision 38449)
> +++ af_lavcresample.c	(working copy)
> @@ -57,6 +57,7 @@
>  // Initialization and runtime control
>  static int control(struct af_instance_s* af, int cmd, void* arg)
>  {
> +  AVChannelLayout ch_layout;
>    af_resample_t* s   = (af_resample_t*)af->setup;
>    af_data_t *data= (af_data_t*)arg;
>    int out_rate, test_output_res; // helpers for checking input format
> @@ -73,6 +74,8 @@
>      af->mul = (double)af->data->rate / data->rate;
>      af->delay = af->data->nch * s->filter_length / FFMIN(af->mul, 1); // *bps*.5
>
> +    av_channel_layout_default(&ch_layout, af->data->nch);
> +
>      if (s->ctx_out_rate != af->data->rate || s->ctx_in_rate != data->rate || s->ctx_filter_size != s->filter_length ||
>          s->ctx_phase_shift != s->phase_shift || s->ctx_linear != s->linear || s->ctx_cutoff != s->cutoff) {
>          swr_free(&s->swrctx);
> @@ -85,8 +88,9 @@
>          av_opt_set_double(s->swrctx, "cutoff", s->cutoff, 0);
>          av_opt_set_sample_fmt(s->swrctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
>          av_opt_set_sample_fmt(s->swrctx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
> -        av_opt_set_int(s->swrctx, "in_channel_count", af->data->nch, 0);
> -        av_opt_set_int(s->swrctx, "out_channel_count", af->data->nch, 0);
> +        if(av_opt_set_chlayout(s->swrctx, "in_chlayout",  &ch_layout, 0) < 0) return AF_ERROR;
> +        if(av_opt_set_chlayout(s->swrctx, "out_chlayout", &ch_layout, 0) < 0) return AF_ERROR;
> +
>          if(swr_init(s->swrctx) < 0) return AF_ERROR;
>          s->ctx_out_rate    = af->data->rate;
>          s->ctx_in_rate     = data->rate;


More information about the MPlayer-dev-eng mailing list