From f3d8e0d369456113d1223cdf77072b52fc79eceb Mon Sep 17 00:00:00 2001 From: Kyle Swanson Date: Wed, 5 Apr 2017 11:43:12 -0500 Subject: [PATCH] avfilter/af_loudnorm: do not upsample during second-pass linear normalization Signed-off-by: Kyle Swanson --- libavfilter/af_loudnorm.c | 58 +++++++++++++++++++++++---------------- libavfilter/version.h | 2 +- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/libavfilter/af_loudnorm.c b/libavfilter/af_loudnorm.c index 9d91c76047..e3e815e272 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, diff --git a/libavfilter/version.h b/libavfilter/version.h index 9a4d1c7fea..6f33acb074 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFILTER_VERSION_MAJOR 6 -#define LIBAVFILTER_VERSION_MINOR 83 +#define LIBAVFILTER_VERSION_MINOR 84 #define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \