Go to the documentation of this file.
49 #define ABS_UP_THRES 10
50 #define HIST_GRAIN 100
51 #define HIST_SIZE ((ABS_UP_THRES - ABS_THRES) * HIST_GRAIN + 1)
153 #define OFFSET(x) offsetof(EBUR128Context, x)
154 #define A AV_OPT_FLAG_AUDIO_PARAM
155 #define V AV_OPT_FLAG_VIDEO_PARAM
156 #define F AV_OPT_FLAG_FILTERING_PARAM
157 #define X AV_OPT_FLAG_EXPORT
158 #define R AV_OPT_FLAG_READONLY
163 {
"framelog",
"force frame logging level",
OFFSET(loglevel),
AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX,
A|
V|
F, .unit =
"level" },
173 {
"panlaw",
"set a specific pan law for dual-mono files",
OFFSET(pan_law),
AV_OPT_TYPE_DOUBLE, {.dbl = -3.01029995663978}, -10.0, 0.0,
A|
F },
174 {
"target",
"set a specific target level in LUFS (-23 to 0)",
OFFSET(target),
AV_OPT_TYPE_INT, {.i64 = -23}, -23, 0,
V|
F },
185 {
"integrated",
"integrated loudness (LUFS)",
OFFSET(integrated_loudness),
AV_OPT_TYPE_DOUBLE, {.dbl = 0}, -DBL_MAX, DBL_MAX,
A|
F|
X|
R },
217 const int above_opt_max = y > ebur128->
y_opt_max;
218 const int below_opt_min = y < ebur128->
y_opt_min;
219 const int reached = y >= v;
221 const int colorid = 8*below_opt_min+ 4*
line + 2*reached + above_opt_max;
227 v += 2 * ebur128->
meter;
257 for (
i = 0; buf[
i];
i++) {
261 for (char_y = 0; char_y < font_height; char_y++) {
263 if (font[buf[
i] * font_height + char_y] &
mask)
266 memcpy(
p,
"\x00\x00\x00", 3);
279 for (
i = 0;
i <
len;
i++) {
280 memcpy(
p,
"\x00\xff\x00", 3);
295 if (ebur128->
w < 640 || ebur128->
h < 480) {
297 "minimum size is 640x480\n", ebur128->
w, ebur128->
h);
300 outlink->
w = ebur128->
w;
301 outlink->
h = ebur128->
h;
310 ebur128->
text.
y = 40;
311 ebur128->
text.
w = 3 * 8;
343 for (
int y = 0; y < ebur128->
h; y++)
344 memset(outpicref->
data[0] + y * outpicref->
linesize[0], 0, ebur128->
w * 3);
350 x =
PAD + (i < 10 && i > -10) * 8;
354 "%c%d", i < 0 ? '-' : i > 0 ?
'+' :
' ',
FFABS(
i));
363 for (y = 0; y < ebur128->
graph.
h; y++) {
366 for (x = 0; x < ebur128->
graph.
w; x++)
367 memcpy(
p + x*3,
c, 3);
372 #define DRAW_RECT(r) do { \
373 drawline(outpicref, r.x, r.y - 1, r.w, 3); \
374 drawline(outpicref, r.x, r.y + r.h, r.w, 3); \
375 drawline(outpicref, r.x - 1, r.y, r.h, outpicref->linesize[0]); \
376 drawline(outpicref, r.x + r.w, r.y, r.h, outpicref->linesize[0]); \
392 double f0 = 1681.974450955533;
393 double G = 3.999843853973347;
394 double Q = 0.7071752369554196;
396 double K = tan(
M_PI * f0 / (
double)
inlink->sample_rate);
397 double Vh = pow(10.0,
G / 20.0);
398 double Vb = pow(Vh, 0.4996667741545416);
400 double a0 = 1.0 +
K /
Q +
K *
K;
408 f0 = 38.13547087602444;
409 Q = 0.5003270373238773;
415 ebur128->
dsp.
rlb.
a1 = 2.0 * (
K *
K - 1.0) / (1.0 +
K /
Q +
K *
K);
436 #define BACK_MASK (AV_CH_BACK_LEFT |AV_CH_BACK_CENTER |AV_CH_BACK_RIGHT| \
437 AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_BACK_RIGHT| \
438 AV_CH_SIDE_LEFT |AV_CH_SIDE_RIGHT| \
439 AV_CH_SURROUND_DIRECT_LEFT |AV_CH_SURROUND_DIRECT_RIGHT)
448 #define I400_BINS(x) ((x) * 2 / 5)
449 #define I3000_BINS(x) ((x) * 3)
456 size_t i400_count, i3000_count;
468 for (
i = 0;
i < nb_channels;
i++) {
473 }
else if (chl < 64 && (1ULL << chl) &
BACK_MASK) {
480 #if CONFIG_SWRESAMPLE
484 ebur128->swr_buf =
av_malloc_array(nb_channels, 19200 *
sizeof(
double));
488 if (!ebur128->swr_buf || !ebur128->
true_peaks ||
512 #if ARCH_X86 && HAVE_X86ASM
518 #define ENERGY(loudness) (ff_exp10(((loudness) + 0.691) / 10.))
519 #define LOUDNESS(energy) (-0.691 + 10 * log10(energy))
520 #define DBFS(energy) (20 * log10(energy))
553 "True-peak mode requires libswresample to be performed\n");
597 #define HIST_POS(power) (int)(((power) - ABS_THRES) * HIST_GRAIN)
605 double relative_threshold;
616 if (!relative_threshold)
617 relative_threshold = 1e-12;
621 return gate_hist_pos;
625 const double *restrict
samples,
626 double *restrict cache_400,
627 double *restrict cache_3000,
628 double *restrict sum_400,
629 double *restrict sum_3000,
630 const int nb_channels)
635 for (
int ch = 0; ch < nb_channels; ch++) {
637 #define FILTER(DST, SRC, FILT) do { \
638 const double tmp = DST[0] = FILT.b0 * SRC + DST[1]; \
639 DST[1] = FILT.b1 * SRC + DST[2] - FILT.a1 * tmp; \
640 DST[2] = FILT.b2 * SRC - FILT.a2 * tmp; \
644 double *restrict y = &dsp->
y[3 * ch];
645 double *restrict z = &dsp->
z[3 * ch];
653 const double bin = *z * *z;
654 sum_400 [ch] += bin - cache_400[ch];
655 sum_3000[ch] += bin - cache_3000[ch];
656 cache_400[ch] = cache_3000[ch] = bin;
661 const double *
samples,
const int nb_samples)
663 double maxpeak = 0.0;
664 for (
int ch = 0; ch < nb_channels; ch++) {
665 double ch_peak = ch_peaks[ch];
666 for (
int i = 0;
i < nb_samples;
i++) {
670 maxpeak =
FFMAX(maxpeak, ch_peak);
671 ch_peaks[ch] = ch_peak;
685 const double *
samples = (
double *)insamples->
data[0];
688 #
if CONFIG_SWRESAMPLE
690 const double *swr_samples = ebur128->swr_buf;
691 int ret =
swr_convert(ebur128->swr_ctx, (uint8_t**)&ebur128->swr_buf, 19200,
692 (
const uint8_t **)insamples->
data, nb_samples);
702 for (
int ch = 0; ch < nb_channels; ch++) {
718 for (
int idx_insample = ebur128->
idx_insample; idx_insample < nb_samples; idx_insample++) {
733 &ebur128->
i400.
cache[bin_id_400 * nb_channels],
734 &ebur128->
i3000.
cache[bin_id_3000 * nb_channels],
742 double loudness_400, loudness_3000;
743 double power_400 = 1e-12, power_3000 = 1e-12;
751 #define COMPUTE_LOUDNESS(m, time) do { \
752 if (ebur128->i##time.filled) { \
754 for (int ch = 0; ch < nb_channels; ch++) \
755 power_##time += ebur128->ch_weighting[ch] * ebur128->i##time.sum[ch]; \
756 power_##time /= I##time##_BINS(inlink->sample_rate); \
758 loudness_##time = LOUDNESS(power_##time); \
765 #define I_GATE_THRES -10 // initially defined to -8 LU in the first EBU standard
768 double integrated_sum = 0.0;
769 uint64_t nb_integrated = 0;
777 nb_integrated += nb_v;
783 if (nb_channels == 1 && ebur128->
dual_mono) {
790 #define LRA_GATE_THRES -20
791 #define LRA_LOWER_PRC 10
792 #define LRA_HIGHER_PRC 95
797 uint64_t nb_powers = 0;
834 if (nb_channels == 1 && ebur128->
dual_mono) {
835 loudness_400 -= ebur128->
pan_law;
836 loudness_3000 -= ebur128->
pan_law;
839 #define LOG_FMT "TARGET:%d LUFS M:%6.1f S:%6.1f I:%6.1f %s LRA:%6.1f LU"
847 int y_loudness_lu_graph, y_loudness_lu_gauge;
850 gauge_value = loudness_400 - ebur128->
target;
852 gauge_value = loudness_3000 - ebur128->
target;
855 y_loudness_lu_graph =
lu_to_y(ebur128, loudness_3000 - ebur128->
target);
856 y_loudness_lu_gauge =
lu_to_y(ebur128, gauge_value);
866 p = pic->data[0] + ebur128->
graph.
y*pic->linesize[0] + ebur128->
graph.
x*3;
867 for (y = 0; y < ebur128->
graph.
h; y++) {
870 memmove(
p,
p + 3, (ebur128->
graph.
w - 1) * 3);
871 memcpy(
p + (ebur128->
graph.
w - 1) * 3,
c, 3);
872 p += pic->linesize[0];
876 p = pic->data[0] + ebur128->
gauge.
y*pic->linesize[0] + ebur128->
gauge.
x*3;
877 for (y = 0; y < ebur128->
gauge.
h; y++) {
880 for (x = 0; x < ebur128->
gauge.
w; x++)
881 memcpy(
p + x*3,
c, 3);
882 p += pic->linesize[0];
889 ebur128->
target, loudness_400, loudness_3000,
911 #define META_PREFIX "lavfi.r128."
913 #define SET_META(name, var) do { \
914 snprintf(metabuf, sizeof(metabuf), "%.3f", var); \
915 av_dict_set(&insamples->metadata, name, metabuf, 0); \
918 #define SET_META_PEAK(name, ptype) do { \
919 if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
920 double max_peak = 0.0; \
922 for (int ch = 0; ch < nb_channels; ch++) { \
923 snprintf(key, sizeof(key), \
924 META_PREFIX AV_STRINGIFY(name) "_peaks_ch%d", ch); \
925 max_peak = fmax(max_peak, ebur128->name##_peaks[ch]); \
926 SET_META(key, ebur128->name##_peaks[ch]); \
928 snprintf(key, sizeof(key), \
929 META_PREFIX AV_STRINGIFY(name) "_peak"); \
930 SET_META(key, max_peak); \
949 ebur128->
target, loudness_400, loudness_3000,
958 #define PRINT_PEAKS(str, sp, ptype) do { \
959 if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
960 av_log(ctx, ebur128->loglevel, " " str ":"); \
961 for (int ch = 0; ch < nb_channels; ch++) \
962 av_log(ctx, ebur128->loglevel, " %5.1f", DBFS(sp[ch])); \
963 av_log(ctx, ebur128->loglevel, " dBFS"); \
1063 " Integrated loudness:\n"
1065 " Threshold: %5.1f LUFS\n\n"
1066 " Loudness range:\n"
1068 " Threshold: %5.1f LUFS\n"
1069 " LRA low: %5.1f LUFS\n"
1070 " LRA high: %5.1f LUFS",
1075 #define PRINT_PEAK_SUMMARY(str, value, ptype) do { \
1076 if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
1077 av_log(ctx, AV_LOG_INFO, "\n\n " str " peak:\n" \
1078 " Peak: %5.1f dBFS", value); \
1101 #if CONFIG_SWRESAMPLE
1116 .
p.
name =
"ebur128",
1119 .p.priv_class = &ebur128_class,
int av_size_mult(size_t a, size_t b, size_t *r)
Multiply two size_t values checking for overflow.
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
AVPixelFormat
Pixel format.
int dual_mono
whether or not to treat single channel input files as dual-mono
double * ch_weighting
channel weighting mapping
int y_opt_min
the y value (pixel position) for -1 LU
const FFFilter ff_af_ebur128
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
int filled
1 if the cache is completely filled, 0 otherwise
int gauge_type
whether gauge shows momentary or short
int y_opt_max
the y value (pixel position) for 1 LU
#define SET_META_PEAK(name, ptype)
double * cache
window of filtered samples (N ms)
#define PRINT_PEAKS(str, sp, ptype)
static const uint8_t * get_graph_color(const EBUR128Context *ebur128, int v, int y)
#define AV_LOG_QUIET
Print no output.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
static enum AVSampleFormat sample_fmts[]
int do_video
1 if video output enabled, 0 otherwise
int sample_count
sample count used for refresh frequency, reset at refresh
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
enum AVChannel av_channel_layout_channel_from_index(const AVChannelLayout *channel_layout, unsigned int idx)
Get the channel with the given index in a channel layout.
AVFILTER_DEFINE_CLASS(ebur128)
static const AVOption ebur128_options[]
#define AV_LOG_VERBOSE
Detailed information.
static av_cold int init(AVFilterContext *ctx)
const char * name
Filter name.
static int config_audio_output(AVFilterLink *outlink)
double sum_kept_powers
sum of the powers (weighted sums) above absolute threshold
int nb_channels
Number of channels in this layout.
A link between two filters.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Link properties exposed to filter code, but not external callers.
static av_cold void uninit(AVFilterContext *ctx)
const uint8_t * avpriv_vga16_font_get(void)
double pan_law
pan law value used to calculate dual-mono measurements
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
static void drawline(AVFrame *pic, int x, int y, int len, int step)
static struct hist_entry * get_histogram(void)
int scale
display scale type of statistics
int cache_pos
focus on the last added bin in the cache array
#define FILTER_QUERY_FUNC2(func)
int nb_samples
number of samples to consume per single input frame
A filter pad used for either input or output.
int attribute_align_arg swr_convert(struct SwrContext *s, uint8_t *const *out_arg, int out_count, const uint8_t *const *in_arg, int in_count)
Convert audio.
static const uint8_t font_colors[]
int metadata
whether or not to inject loudness results in frames
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
struct rect graph
rectangle for the main graph in the center
static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
av_cold int swr_init(struct SwrContext *s)
Initialize context after user parameters have been set.
static int config_video_output(AVFilterLink *outlink)
double integrated_loudness
integrated loudness in LUFS (I)
static FilterLink * ff_filter_link(AVFilterLink *link)
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
int target
target level in LUFS used to set relative zero LU in visualization
AVRational sample_aspect_ratio
agreed upon sample aspect ratio
av_cold struct SwrContext * swr_alloc(void)
Allocate SwrContext.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static enum AVPixelFormat pix_fmts[]
static AVFormatContext * ctx
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
static void drawtext(AVFrame *pic, int x, int y, int ftid, const uint8_t *color, const char *fmt,...)
The libswresample context.
double loudness
L = -0.691 + 10 * log10(E)
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
Make sure a frame is writable.
double * true_peaks_per_frame
true peaks in a frame per channel
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
double * sample_peaks
sample peaks per channel
#define HIST_GRAIN
defines histogram precision
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Describe the class of an AVClass context structure.
static __device__ float fabs(float a)
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, AVFrame **rframe)
Take samples from the link's FIFO and update the link's stats.
int peak_mode
enabled peak modes
Rational number (pair of numerator and denominator).
@ AV_OPT_TYPE_IMAGE_SIZE
Underlying C type is two consecutive integers.
struct rect gauge
rectangle for the gauge on the right
void ff_ebur128_init_x86(EBUR128DSPContext *dsp, int nb_channels)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
void ff_ebur128_filter_channels_c(const EBUR128DSPContext *dsp, const double *restrict samples, double *restrict cache_400, double *restrict cache_3000, double *restrict sum_400, double *restrict sum_3000, const int nb_channels)
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
unsigned count
how many times the corresponding value occurred
int y_zero_lu
the y value (pixel position) for 0 LU
struct integrator i3000
3s integrator, used for Short term loudness (S), and Loudness Range (LRA)
static int activate(AVFilterContext *ctx)
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int av_opt_set_chlayout(void *obj, const char *name, const AVChannelLayout *channel_layout, int search_flags)
#define i(width, name, range_min, range_max)
#define FF_FILTER_FORWARD_STATUS_ALL(inlink, filter)
Acknowledge the status on an input link and forward it to an output link.
int format
agreed upon media format
const uint8_t * avpriv_cga_font_get(void)
static AVRational av_make_q(int num, int den)
Create an AVRational.
av_cold void swr_free(SwrContext **ss)
Free the given SwrContext and set the pointer to NULL.
AVFilterContext * src
source filter
double true_peak
global true peak
static double a0(void *priv, double x, double y)
double sample_peak
global sample peak
AVFrame * outpicref
output picture reference, updated regularly
FF_FILTER_FORWARD_WANTED(outlink, inlink)
int h
size of the video output
#define AV_LOG_INFO
Standard information.
int sample_rate
samples per second
int nb_samples
number of audio samples (per channel) described by this frame
struct rect text
rectangle for the LU legend on the left
int w
agreed upon image width
int * y_line_ref
y reference values for drawing the LU lines in the graph and the gauge
#define av_malloc_array(a, b)
AVSampleFormat
Audio sample formats.
#define FILTER(DST, SRC, FILT)
double rel_threshold
relative threshold
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
#define ABS_THRES
silence gate: we discard anything below this absolute (LUFS) threshold
double ff_ebur128_find_peak_c(double *restrict ch_peaks, const int nb_channels, const double *samples, const int nb_samples)
const char * name
Pad name.
int nb_kept_powers
number of sum above absolute threshold
double * true_peaks
true peaks per channel
void * av_calloc(size_t nmemb, size_t size)
double loudness_range
loudness range in LU (LRA)
double energy
E = 10^((L + 0.691) / 10)
static const uint8_t graph_colors[]
double * sum
sum of the last N ms filtered samples (cache content)
double lra_high
low and high LRA values
#define FILTER_INPUTS(array)
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
int scale_range
the range of LU values according to the meter
static float power(float r, float g, float b, float max)
#define SET_META(name, var)
@ AV_CHAN_LOW_FREQUENCY_2
int h
agreed upon image height
int meter
select a EBU mode between +9 and +18
@ AV_OPT_TYPE_INT
Underlying C type is int.
void(* filter_channels)(const struct EBUR128DSPContext *dsp, const double *samples, double *cache_400, double *cache_3000, double *sum_400, double *sum_3000, int nb_channels)
AVFrame * insamples
input samples reference, updated regularly
Filter the word “frame” indicates either a video frame or a group of audio samples
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
@ PEAK_MODE_SAMPLES_PEAKS
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
AVFilter p
The public AVFilter.
static const AVFilterPad ebur128_inputs[]
AVChannelLayout ch_layout
channel layout of current buffer (see libavutil/channel_layout.h)
int ff_append_outpad(AVFilterContext *f, AVFilterPad *p)
static void scale(int *out, const int *in, const int w, const int h, const int shift)
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
int nb_channels
number of channels in the input
int idx_insample
current sample position of processed samples in single input frame
struct integrator i400
400ms integrator, used for Momentary loudness (M), and Integrated loudness (I)
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
static int config_audio_input(AVFilterLink *inlink)
struct hist_entry * histogram
histogram of the powers, used to compute LRA and I
#define PRINT_PEAK_SUMMARY(str, value, ptype)
@ AV_SAMPLE_FMT_DBL
double
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable.
static int lu_to_y(const EBUR128Context *ebur128, double v)
int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
int loglevel
log level for frame logging
static int gate_update(struct integrator *integ, double power, double loudness, int gate_thres)
#define COMPUTE_LOUDNESS(m, time)
void ff_filter_set_ready(AVFilterContext *filter, unsigned priority)
Mark a filter ready and schedule it for activation.
double(* find_peak)(double *ch_peaks, int nb_channels, const double *samples, int nb_samples)
A histogram is an array of HIST_SIZE hist_entry storing all the energies recorded (with an accuracy o...