avfilter/af_loudnorm: do not upsample during second-pass linear normalization

Signed-off-by: Kyle Swanson <k@ylo.ph>
This commit is contained in:
Kyle Swanson 2017-04-05 11:43:12 -05:00
parent d8eb40bd70
commit f3d8e0d369
2 changed files with 35 additions and 25 deletions

View File

@ -682,6 +682,7 @@ static int request_frame(AVFilterLink *outlink)
static int query_formats(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx)
{ {
LoudNormContext *s = ctx->priv;
AVFilterFormats *formats; AVFilterFormats *formats;
AVFilterChannelLayouts *layouts; AVFilterChannelLayouts *layouts;
AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *inlink = ctx->inputs[0];
@ -707,6 +708,7 @@ static int query_formats(AVFilterContext *ctx)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (s->frame_type != LINEAR_MODE) {
formats = ff_make_format_list(input_srate); formats = ff_make_format_list(input_srate);
if (!formats) if (!formats)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
@ -716,6 +718,7 @@ static int query_formats(AVFilterContext *ctx)
ret = ff_formats_ref(formats, &outlink->in_samplerates); ret = ff_formats_ref(formats, &outlink->in_samplerates);
if (ret < 0) if (ret < 0)
return ret; return ret;
}
return 0; return 0;
} }
@ -754,21 +757,6 @@ static int config_input(AVFilterLink *inlink)
init_gaussian_filter(s); 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) { if (s->frame_type != LINEAR_MODE) {
inlink->min_samples = inlink->min_samples =
inlink->max_samples = inlink->max_samples =
@ -790,6 +778,27 @@ static int config_input(AVFilterLink *inlink)
return 0; 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) static av_cold void uninit(AVFilterContext *ctx)
{ {
LoudNormContext *s = ctx->priv; LoudNormContext *s = ctx->priv;
@ -914,6 +923,7 @@ AVFilter ff_af_loudnorm = {
.priv_size = sizeof(LoudNormContext), .priv_size = sizeof(LoudNormContext),
.priv_class = &loudnorm_class, .priv_class = &loudnorm_class,
.query_formats = query_formats, .query_formats = query_formats,
.init = init,
.uninit = uninit, .uninit = uninit,
.inputs = avfilter_af_loudnorm_inputs, .inputs = avfilter_af_loudnorm_inputs,
.outputs = avfilter_af_loudnorm_outputs, .outputs = avfilter_af_loudnorm_outputs,

View File

@ -30,7 +30,7 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 6 #define LIBAVFILTER_VERSION_MAJOR 6
#define LIBAVFILTER_VERSION_MINOR 83 #define LIBAVFILTER_VERSION_MINOR 84
#define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \