diff mbox

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

Message ID 20170402233220.77422-1-k@ylo.ph
State Accepted
Headers show

Commit Message

Kyle Swanson April 2, 2017, 11:32 p.m. UTC
Signed-off-by: Kyle Swanson <k@ylo.ph>
---
 libavfilter/af_loudnorm.c | 58 +++++++++++++++++++++++++++--------------------
 1 file changed, 34 insertions(+), 24 deletions(-)

Comments

Kyle Swanson April 4, 2017, 12:14 p.m. UTC | #1
Hi,

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

> Signed-off-by: Kyle Swanson <k@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
Kyle Swanson April 5, 2017, 5:04 p.m. UTC | #2
On Tue, Apr 4, 2017 at 7:14 AM, Kyle Swanson <k@ylo.ph> wrote:

> Hi,
>
>
> On Sun, Apr 2, 2017 at 6:32 PM, Kyle Swanson <k@ylo.ph> wrote:
>
>> Signed-off-by: Kyle Swanson <k@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
>

Pushed.
diff mbox

Patch

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,