summaryrefslogtreecommitdiff
path: root/libavfilter/af_loudnorm.c
diff options
context:
space:
mode:
authorKyle Swanson <k@ylo.ph>2017-04-05 11:43:12 -0500
committerKyle Swanson <k@ylo.ph>2017-04-05 11:43:12 -0500
commitf3d8e0d369456113d1223cdf77072b52fc79eceb (patch)
tree73ce182a6fb48442312c4f208ac27c657f6f7f03 /libavfilter/af_loudnorm.c
parentd8eb40bd70c9c6326f51ce4afe29c3d4485388b2 (diff)
downloadffmpeg-f3d8e0d369456113d1223cdf77072b52fc79eceb.tar.gz
avfilter/af_loudnorm: do not upsample during second-pass linear normalization
Signed-off-by: Kyle Swanson <k@ylo.ph>
Diffstat (limited to 'libavfilter/af_loudnorm.c')
-rw-r--r--libavfilter/af_loudnorm.c58
1 files changed, 34 insertions, 24 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,