[FFmpeg-devel] [PATCH] avfilter/af_loudnorm: do not upsample during second-pass linear normalization

Kyle Swanson k at ylo.ph
Tue Apr 4 15:14:58 EEST 2017


Hi,

On Sun, Apr 2, 2017 at 6:32 PM, Kyle Swanson <k at ylo.ph> wrote:

> Signed-off-by: Kyle Swanson <k at ylo.ph>
> ---
>  libavfilter/af_loudnorm.c | 58 +++++++++++++++++++++++++++---
> -----------------
>  1 file changed, 34 insertions(+), 24 deletions(-)
>
> diff --git a/libavfilter/af_loudnorm.c b/libavfilter/af_loudnorm.c
> index 9d91c76..e3e815e 100644
> --- a/libavfilter/af_loudnorm.c
> +++ b/libavfilter/af_loudnorm.c
> @@ -682,6 +682,7 @@ static int request_frame(AVFilterLink *outlink)
>
>  static int query_formats(AVFilterContext *ctx)
>  {
> +    LoudNormContext *s = ctx->priv;
>      AVFilterFormats *formats;
>      AVFilterChannelLayouts *layouts;
>      AVFilterLink *inlink = ctx->inputs[0];
> @@ -707,15 +708,17 @@ static int query_formats(AVFilterContext *ctx)
>      if (ret < 0)
>          return ret;
>
> -    formats = ff_make_format_list(input_srate);
> -    if (!formats)
> -        return AVERROR(ENOMEM);
> -    ret = ff_formats_ref(formats, &inlink->out_samplerates);
> -    if (ret < 0)
> -        return ret;
> -    ret = ff_formats_ref(formats, &outlink->in_samplerates);
> -    if (ret < 0)
> -        return ret;
> +    if (s->frame_type != LINEAR_MODE) {
> +        formats = ff_make_format_list(input_srate);
> +        if (!formats)
> +            return AVERROR(ENOMEM);
> +        ret = ff_formats_ref(formats, &inlink->out_samplerates);
> +        if (ret < 0)
> +            return ret;
> +        ret = ff_formats_ref(formats, &outlink->in_samplerates);
> +        if (ret < 0)
> +            return ret;
> +    }
>
>      return 0;
>  }
> @@ -754,21 +757,6 @@ static int config_input(AVFilterLink *inlink)
>
>      init_gaussian_filter(s);
>
> -    s->frame_type = FIRST_FRAME;
> -
> -    if (s->linear) {
> -        double offset, offset_tp;
> -        offset    = s->target_i - s->measured_i;
> -        offset_tp = s->measured_tp + offset;
> -
> -        if (s->measured_tp != 99 && s->measured_thresh != -70 &&
> s->measured_lra != 0 && s->measured_i != 0) {
> -            if ((offset_tp <= s->target_tp) && (s->measured_lra <=
> s->target_lra)) {
> -                s->frame_type = LINEAR_MODE;
> -                s->offset = offset;
> -            }
> -        }
> -    }
> -
>      if (s->frame_type != LINEAR_MODE) {
>          inlink->min_samples =
>          inlink->max_samples =
> @@ -790,6 +778,27 @@ static int config_input(AVFilterLink *inlink)
>      return 0;
>  }
>
> +static av_cold int init(AVFilterContext *ctx)
> +{
> +    LoudNormContext *s = ctx->priv;
> +    s->frame_type = FIRST_FRAME;
> +
> +    if (s->linear) {
> +        double offset, offset_tp;
> +        offset    = s->target_i - s->measured_i;
> +        offset_tp = s->measured_tp + offset;
> +
> +        if (s->measured_tp != 99 && s->measured_thresh != -70 &&
> s->measured_lra != 0 && s->measured_i != 0) {
> +            if ((offset_tp <= s->target_tp) && (s->measured_lra <=
> s->target_lra)) {
> +                s->frame_type = LINEAR_MODE;
> +                s->offset = offset;
> +            }
> +        }
> +    }
> +
> +    return 0;
> +}
> +
>  static av_cold void uninit(AVFilterContext *ctx)
>  {
>      LoudNormContext *s = ctx->priv;
> @@ -914,6 +923,7 @@ AVFilter ff_af_loudnorm = {
>      .priv_size     = sizeof(LoudNormContext),
>      .priv_class    = &loudnorm_class,
>      .query_formats = query_formats,
> +    .init          = init,
>      .uninit        = uninit,
>      .inputs        = avfilter_af_loudnorm_inputs,
>      .outputs       = avfilter_af_loudnorm_outputs,
> --
> 2.10.1
>
>
If no one has anything for this, I'll push it in the next day or so.

Kyle


More information about the ffmpeg-devel mailing list