summaryrefslogtreecommitdiffstats
path: root/libavfilter/af_loudnorm.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2016-10-15 19:21:22 +0200
committerMarton Balint <cus@passwd.hu>2016-11-11 19:37:54 +0100
commit005d058f4230f3207ebcf1131df7426d4f57392f (patch)
treea65646eab5ac5a0df5dd51da3354018bf23bbc88 /libavfilter/af_loudnorm.c
parent7b8445f03d10faf7ed232e6201bf04ba73d980d7 (diff)
downloadffmpeg-streaming-005d058f4230f3207ebcf1131df7426d4f57392f.zip
ffmpeg-streaming-005d058f4230f3207ebcf1131df7426d4f57392f.tar.gz
lavfi/loudnorm: add an internal libebur128 library
Also contains the following changes to the library: - add ff_ prefix to functions - remove cplusplus defines. - add FF_ prefix to contants and some structs - remove true peak calculation feature, since it uses its own resampler, and af_loudnorm does not need it. - remove version info and some fprintf(stderr) functions - convert to use av_malloc - always use histogram mode for LRA calculation, otherwise LRA data is slowly consuming memory making af_loudnorm unfit for 24/7 operation. It also uses a BSD style linked list implementation which is probably not available on all platforms. So let's just remove the classic mode which not uses histogram. - add ff_thread_once for calculating static histogram tables - convert some functions to void which cannot fail - remove intrinsics and some unused headers - add support for planar audio - remove channel / sample rate changer function, in ffmpeg usually we simply alloc a new context - convert some static variables to defines - declare static histogram variables as aligned - convert some initalizations to mallocz - add window size parameter to init function and remove window size setter function - convert return codes to AVERROR - fix indentation Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavfilter/af_loudnorm.c')
-rw-r--r--libavfilter/af_loudnorm.c60
1 files changed, 30 insertions, 30 deletions
diff --git a/libavfilter/af_loudnorm.c b/libavfilter/af_loudnorm.c
index 604697e..9d91c76 100644
--- a/libavfilter/af_loudnorm.c
+++ b/libavfilter/af_loudnorm.c
@@ -24,7 +24,7 @@
#include "avfilter.h"
#include "internal.h"
#include "audio.h"
-#include <ebur128.h>
+#include "ebur128.h"
enum FrameType {
FIRST_FRAME,
@@ -91,8 +91,8 @@ typedef struct LoudNormContext {
int prev_nb_samples;
int channels;
- ebur128_state *r128_in;
- ebur128_state *r128_out;
+ FFEBUR128State *r128_in;
+ FFEBUR128State *r128_out;
} LoudNormContext;
#define OFFSET(x) offsetof(LoudNormContext, x)
@@ -437,15 +437,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
buf = s->buf;
limiter_buf = s->limiter_buf;
- ebur128_add_frames_double(s->r128_in, src, in->nb_samples);
+ ff_ebur128_add_frames_double(s->r128_in, src, in->nb_samples);
if (s->frame_type == FIRST_FRAME && in->nb_samples < frame_size(inlink->sample_rate, 3000)) {
double offset, offset_tp, true_peak;
- ebur128_loudness_global(s->r128_in, &global);
+ ff_ebur128_loudness_global(s->r128_in, &global);
for (c = 0; c < inlink->channels; c++) {
double tmp;
- ebur128_sample_peak(s->r128_in, c, &tmp);
+ ff_ebur128_sample_peak(s->r128_in, c, &tmp);
if (c == 0 || tmp > true_peak)
true_peak = tmp;
}
@@ -467,7 +467,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
s->buf_index += inlink->channels;
}
- ebur128_loudness_shortterm(s->r128_in, &shortterm);
+ ff_ebur128_loudness_shortterm(s->r128_in, &shortterm);
if (shortterm < s->measured_thresh) {
s->above_threshold = 0;
@@ -497,7 +497,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
subframe_length = frame_size(inlink->sample_rate, 100);
true_peak_limiter(s, dst, subframe_length, inlink->channels);
- ebur128_add_frames_double(s->r128_out, dst, subframe_length);
+ ff_ebur128_add_frames_double(s->r128_out, dst, subframe_length);
s->pts +=
out->nb_samples =
@@ -536,12 +536,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
s->limiter_buf_index = s->limiter_buf_index + subframe_length < s->limiter_buf_size ? s->limiter_buf_index + subframe_length : s->limiter_buf_index + subframe_length - s->limiter_buf_size;
true_peak_limiter(s, dst, in->nb_samples, inlink->channels);
- ebur128_add_frames_double(s->r128_out, dst, in->nb_samples);
+ ff_ebur128_add_frames_double(s->r128_out, dst, in->nb_samples);
- ebur128_loudness_range(s->r128_in, &lra);
- ebur128_loudness_global(s->r128_in, &global);
- ebur128_loudness_shortterm(s->r128_in, &shortterm);
- ebur128_relative_threshold(s->r128_in, &relative_threshold);
+ ff_ebur128_loudness_range(s->r128_in, &lra);
+ ff_ebur128_loudness_global(s->r128_in, &global);
+ ff_ebur128_loudness_shortterm(s->r128_in, &shortterm);
+ ff_ebur128_relative_threshold(s->r128_in, &relative_threshold);
if (s->above_threshold == 0) {
double shortterm_out;
@@ -549,7 +549,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
if (shortterm > s->measured_thresh)
s->prev_delta *= 1.0058;
- ebur128_loudness_shortterm(s->r128_out, &shortterm_out);
+ ff_ebur128_loudness_shortterm(s->r128_out, &shortterm_out);
if (shortterm_out >= s->target_i)
s->above_threshold = 1;
}
@@ -611,7 +611,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
}
dst = (double *)out->data[0];
- ebur128_add_frames_double(s->r128_out, dst, in->nb_samples);
+ ff_ebur128_add_frames_double(s->r128_out, dst, in->nb_samples);
break;
case LINEAR_MODE:
@@ -624,7 +624,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
}
dst = (double *)out->data[0];
- ebur128_add_frames_double(s->r128_out, dst, in->nb_samples);
+ ff_ebur128_add_frames_double(s->r128_out, dst, in->nb_samples);
s->pts += in->nb_samples;
break;
}
@@ -725,17 +725,17 @@ static int config_input(AVFilterLink *inlink)
AVFilterContext *ctx = inlink->dst;
LoudNormContext *s = ctx->priv;
- s->r128_in = ebur128_init(inlink->channels, inlink->sample_rate, EBUR128_MODE_I | EBUR128_MODE_S | EBUR128_MODE_LRA | EBUR128_MODE_SAMPLE_PEAK);
+ s->r128_in = ff_ebur128_init(inlink->channels, inlink->sample_rate, 0, FF_EBUR128_MODE_I | FF_EBUR128_MODE_S | FF_EBUR128_MODE_LRA | FF_EBUR128_MODE_SAMPLE_PEAK);
if (!s->r128_in)
return AVERROR(ENOMEM);
- s->r128_out = ebur128_init(inlink->channels, inlink->sample_rate, EBUR128_MODE_I | EBUR128_MODE_S | EBUR128_MODE_LRA | EBUR128_MODE_SAMPLE_PEAK);
+ s->r128_out = ff_ebur128_init(inlink->channels, inlink->sample_rate, 0, FF_EBUR128_MODE_I | FF_EBUR128_MODE_S | FF_EBUR128_MODE_LRA | FF_EBUR128_MODE_SAMPLE_PEAK);
if (!s->r128_out)
return AVERROR(ENOMEM);
if (inlink->channels == 1 && s->dual_mono) {
- ebur128_set_channel(s->r128_in, 0, EBUR128_DUAL_MONO);
- ebur128_set_channel(s->r128_out, 0, EBUR128_DUAL_MONO);
+ ff_ebur128_set_channel(s->r128_in, 0, FF_EBUR128_DUAL_MONO);
+ ff_ebur128_set_channel(s->r128_out, 0, FF_EBUR128_DUAL_MONO);
}
s->buf_size = frame_size(inlink->sample_rate, 3000) * inlink->channels;
@@ -799,22 +799,22 @@ static av_cold void uninit(AVFilterContext *ctx)
if (!s->r128_in || !s->r128_out)
goto end;
- ebur128_loudness_range(s->r128_in, &lra_in);
- ebur128_loudness_global(s->r128_in, &i_in);
- ebur128_relative_threshold(s->r128_in, &thresh_in);
+ ff_ebur128_loudness_range(s->r128_in, &lra_in);
+ ff_ebur128_loudness_global(s->r128_in, &i_in);
+ ff_ebur128_relative_threshold(s->r128_in, &thresh_in);
for (c = 0; c < s->channels; c++) {
double tmp;
- ebur128_sample_peak(s->r128_in, c, &tmp);
+ ff_ebur128_sample_peak(s->r128_in, c, &tmp);
if ((c == 0) || (tmp > tp_in))
tp_in = tmp;
}
- ebur128_loudness_range(s->r128_out, &lra_out);
- ebur128_loudness_global(s->r128_out, &i_out);
- ebur128_relative_threshold(s->r128_out, &thresh_out);
+ ff_ebur128_loudness_range(s->r128_out, &lra_out);
+ ff_ebur128_loudness_global(s->r128_out, &i_out);
+ ff_ebur128_relative_threshold(s->r128_out, &thresh_out);
for (c = 0; c < s->channels; c++) {
double tmp;
- ebur128_sample_peak(s->r128_out, c, &tmp);
+ ff_ebur128_sample_peak(s->r128_out, c, &tmp);
if ((c == 0) || (tmp > tp_out))
tp_out = tmp;
}
@@ -881,9 +881,9 @@ static av_cold void uninit(AVFilterContext *ctx)
end:
if (s->r128_in)
- ebur128_destroy(&s->r128_in);
+ ff_ebur128_destroy(&s->r128_in);
if (s->r128_out)
- ebur128_destroy(&s->r128_out);
+ ff_ebur128_destroy(&s->r128_out);
av_freep(&s->limiter_buf);
av_freep(&s->prev_smp);
av_freep(&s->buf);
OpenPOWER on IntegriCloud