[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