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

Kyle Swanson k at ylo.ph
Wed Apr 5 20:04:17 EEST 2017


On Tue, Apr 4, 2017 at 7:14 AM, Kyle Swanson <k at ylo.ph> wrote:

> 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
>

Pushed.


More information about the ffmpeg-devel mailing list