Go to the documentation of this file.
   46 #define MAX_CHANNELS 63 
   49 #define PRE_B0  1.53512485958697 
   50 #define PRE_B1 -2.69169618940638 
   51 #define PRE_B2  1.19839281085285 
   52 #define PRE_A1 -1.69065929318241 
   53 #define PRE_A2  0.73248077421585 
   59 #define RLB_A1 -1.99004745483398 
   60 #define RLB_A2  0.99007225036621 
   63 #define ABS_UP_THRES  10            
 
   64 #define HIST_GRAIN   100            
 
   65 #define HIST_SIZE  ((ABS_UP_THRES - ABS_THRES) * HIST_GRAIN + 1)
 
  101 #if CONFIG_SWRESAMPLE 
  132 #define I400_BINS  (48000 * 4 / 10) 
  133 #define I3000_BINS (48000 * 3) 
  168 #define OFFSET(x) offsetof(EBUR128Context, x) 
  169 #define A AV_OPT_FLAG_AUDIO_PARAM 
  170 #define V AV_OPT_FLAG_VIDEO_PARAM 
  171 #define F AV_OPT_FLAG_FILTERING_PARAM 
  176     { 
"framelog", 
"force frame logging level", 
OFFSET(loglevel), 
AV_OPT_TYPE_INT, {.i64 = -1},   INT_MIN, INT_MAX, 
A|
V|
F, 
"level" },
 
  185     { 
"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 },
 
  186     { 
"target", 
"set a specific target level in LUFS (-23 to 0)", 
OFFSET(target), 
AV_OPT_TYPE_INT, {.i64 = -23}, -23, 0, 
V|
F },
 
  223     const int above_opt_max = y > ebur128->
y_opt_max;
 
  224     const int below_opt_min = y < ebur128->
y_opt_min;
 
  225     const int reached = y >= v;
 
  227     const int colorid = 8*below_opt_min+ 4*
line + 2*reached + above_opt_max;
 
  233     v += 2 * ebur128->
meter;                            
 
  263     for (
i = 0; 
buf[
i]; 
i++) {
 
  267         for (char_y = 0; char_y < font_height; char_y++) {
 
  269                 if (font[
buf[
i] * font_height + char_y] & 
mask)
 
  272                     memcpy(p, 
"\x00\x00\x00", 3);
 
  285     for (
i = 0; 
i < 
len; 
i++) {
 
  286         memcpy(p, 
"\x00\xff\x00", 3);
 
  300     if (ebur128->
w < 640 || ebur128->
h < 480) {
 
  302                "minimum size is 640x480\n", ebur128->
w, ebur128->
h);
 
  305     outlink->
w = ebur128->
w;
 
  306     outlink->
h = ebur128->
h;
 
  313     ebur128->
text.
y  = 40;
 
  314     ebur128->
text.
w  = 3 * 8;   
 
  346     memset(outpicref->
data[0], 0, ebur128->
h * outpicref->
linesize[0]);
 
  352         x = 
PAD + (i < 10 && i > -10) * 8;
 
  356                  "%c%d", i < 0 ? '-' : i > 0 ? 
'+' : 
' ', 
FFABS(
i));
 
  365     for (y = 0; y < ebur128->
graph.
h; y++) {
 
  368         for (x = 0; x < ebur128->
graph.
w; x++)
 
  369             memcpy(p + x*3, 
c, 3);
 
  374 #define DRAW_RECT(r) do { \ 
  375     drawline(outpicref, r.x,       r.y - 1,   r.w, 3); \ 
  376     drawline(outpicref, r.x,       r.y + r.h, r.w, 3); \ 
  377     drawline(outpicref, r.x - 1,   r.y,       r.h, outpicref->linesize[0]); \ 
  378     drawline(outpicref, r.x + r.w, r.y,       r.h, outpicref->linesize[0]); \ 
  411 #define BACK_MASK (AV_CH_BACK_LEFT    |AV_CH_BACK_CENTER    |AV_CH_BACK_RIGHT| \ 
  412                    AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_BACK_RIGHT| \ 
  413                    AV_CH_SIDE_LEFT                          |AV_CH_SIDE_RIGHT| \ 
  414                    AV_CH_SURROUND_DIRECT_LEFT               |AV_CH_SURROUND_DIRECT_RIGHT) 
  442 #if CONFIG_SWRESAMPLE 
  450         if (!ebur128->swr_buf || !ebur128->
true_peaks ||
 
  477 #define ENERGY(loudness) (ff_exp10(((loudness) + 0.691) / 10.)) 
  478 #define LOUDNESS(energy) (-0.691 + 10 * log10(energy)) 
  479 #define DBFS(energy) (20 * log10(energy)) 
  511                "True-peak mode requires libswresample to be performed\n");
 
  561 #define HIST_POS(power) (int)(((power) - ABS_THRES) * HIST_GRAIN) 
  569     double relative_threshold;
 
  580     if (!relative_threshold)
 
  581         relative_threshold = 1e-12;
 
  585     return gate_hist_pos;
 
  590     int i, 
ch, idx_insample;
 
  595     const double *
samples = (
double *)insamples->
data[0];
 
  598 #
if CONFIG_SWRESAMPLE
 
  600         const double *swr_samples = ebur128->swr_buf;
 
  607         for (idx_insample = 0; idx_insample < 
ret; idx_insample++) {
 
  618     for (idx_insample = 0; idx_insample < nb_samples; idx_insample++) {
 
  622 #define MOVE_TO_NEXT_CACHED_ENTRY(time) do {                \ 
  623     ebur128->i##time.cache_pos++;                           \ 
  624     if (ebur128->i##time.cache_pos == I##time##_BINS) {     \ 
  625         ebur128->i##time.filled    = 1;                     \ 
  626         ebur128->i##time.cache_pos = 0;                     \ 
  645 #define FILTER(Y, X, name) do {                                                 \ 
  646             double *dst = ebur128->Y + ch*3;                                    \ 
  647             double *src = ebur128->X + ch*3;                                    \ 
  650             dst[0] = src[0]*name##_B0 + src[1]*name##_B1 + src[2]*name##_B2     \ 
  651                                       - dst[1]*name##_A1 - dst[2]*name##_A2;    \ 
  656             ebur128->
x[
ch * 3 + 2] = ebur128->
x[
ch * 3 + 1];
 
  657             ebur128->
x[
ch * 3 + 1] = ebur128->
x[
ch * 3    ];
 
  660             bin = ebur128->
z[
ch * 3] * ebur128->
z[
ch * 3];
 
  676             double loudness_400, loudness_3000;
 
  677             double power_400 = 1e-12, power_3000 = 1e-12;
 
  679             const int64_t 
pts = insamples->
pts +
 
  685 #define COMPUTE_LOUDNESS(m, time) do {                                              \ 
  686     if (ebur128->i##time.filled) {                                                  \ 
  688         for (ch = 0; ch < nb_channels; ch++)                                        \ 
  689             power_##time += ebur128->ch_weighting[ch] * ebur128->i##time.sum[ch];   \ 
  690         power_##time /= I##time##_BINS;                                             \ 
  692     loudness_##time = LOUDNESS(power_##time);                                       \ 
  699 #define I_GATE_THRES -10  // initially defined to -8 LU in the first EBU standard 
  702                 double integrated_sum = 0;
 
  703                 int nb_integrated = 0;
 
  711                     nb_integrated  += nb_v;
 
  724 #define LRA_GATE_THRES -20 
  725 #define LRA_LOWER_PRC   10 
  726 #define LRA_HIGHER_PRC  95 
  769                 loudness_400 -= ebur128->
pan_law;
 
  770                 loudness_3000 -= ebur128->
pan_law;
 
  773 #define LOG_FMT "TARGET:%d LUFS    M:%6.1f S:%6.1f     I:%6.1f %s       LRA:%6.1f LU" 
  780                 int y_loudness_lu_graph, y_loudness_lu_gauge;
 
  783                     gauge_value = loudness_400 - ebur128->
target;
 
  785                     gauge_value = loudness_3000 - ebur128->
target;
 
  788                 y_loudness_lu_graph = 
lu_to_y(ebur128, loudness_3000 - ebur128->
target);
 
  789                 y_loudness_lu_gauge = 
lu_to_y(ebur128, gauge_value);
 
  792                 p = pic->data[0] + ebur128->
graph.
y*pic->linesize[0] + ebur128->
graph.
x*3;
 
  793                 for (y = 0; y < ebur128->
graph.
h; y++) {
 
  796                     memmove(p, p + 3, (ebur128->
graph.
w - 1) * 3);
 
  797                     memcpy(p + (ebur128->
graph.
w - 1) * 3, 
c, 3);
 
  798                     p += pic->linesize[0];
 
  802                 p = pic->data[0] + ebur128->
gauge.
y*pic->linesize[0] + ebur128->
gauge.
x*3;
 
  803                 for (y = 0; y < ebur128->
gauge.
h; y++) {
 
  806                     for (x = 0; x < ebur128->
gauge.
w; x++)
 
  807                         memcpy(p + x*3, 
c, 3);
 
  808                     p += pic->linesize[0];
 
  815                              ebur128->
target, loudness_400, loudness_3000,
 
  833 #define META_PREFIX "lavfi.r128." 
  835 #define SET_META(name, var) do {                                            \ 
  836     snprintf(metabuf, sizeof(metabuf), "%.3f", var);                        \ 
  837     av_dict_set(&insamples->metadata, name, metabuf, 0);                    \ 
  840 #define SET_META_PEAK(name, ptype) do {                                     \ 
  841     if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) {               \ 
  843         for (ch = 0; ch < nb_channels; ch++) {                              \ 
  844             snprintf(key, sizeof(key),                                      \ 
  845                      META_PREFIX AV_STRINGIFY(name) "_peaks_ch%d", ch);     \ 
  846             SET_META(key, ebur128->name##_peaks[ch]);                       \ 
  865                        ebur128->
target, loudness_400, loudness_3000,
 
  874 #define PRINT_PEAKS(str, sp, ptype) do {                            \ 
  875     if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) {       \ 
  876         av_log(ctx, ebur128->loglevel, "  " str ":");               \ 
  877         for (ch = 0; ch < nb_channels; ch++)                        \ 
  878             av_log(ctx, ebur128->loglevel, " %5.1f", DBFS(sp[ch])); \ 
  879         av_log(ctx, ebur128->loglevel, " dBFS");                    \ 
  903     static const int input_srate[] = {48000, -1}; 
 
  911         outlink = 
ctx->outputs[1];
 
  949            "  Integrated loudness:\n" 
  951            "    Threshold: %5.1f LUFS\n\n" 
  954            "    Threshold: %5.1f LUFS\n" 
  955            "    LRA low:   %5.1f LUFS\n" 
  956            "    LRA high:  %5.1f LUFS",
 
  961 #define PRINT_PEAK_SUMMARY(str, sp, ptype) do {                  \ 
  965     if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) {    \ 
  966         for (ch = 0; ch < ebur128->nb_channels; ch++)            \ 
  967             maxpeak = FFMAX(maxpeak, sp[ch]);                    \ 
  968         av_log(ctx, AV_LOG_INFO, "\n\n  " str " peak:\n"         \ 
  969                "    Peak:      %5.1f dBFS",                      \ 
  989     for (
i = 0; 
i < 
ctx->nb_outputs; 
i++)
 
  992 #if CONFIG_SWRESAMPLE 
 1017     .priv_class    = &ebur128_class,
 
  
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
 
A list of supported channel layouts.
 
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
 
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
 
struct AVFilterChannelLayouts * in_channel_layouts
 
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)
 
#define PRINT_PEAKS(str, sp, ptype)
 
static const uint8_t * get_graph_color(const EBUR128Context *ebur128, int v, int y)
 
#define AV_CH_LOW_FREQUENCY_2
 
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
 
static enum AVSampleFormat sample_fmts[]
 
enum MovChannelLayoutTag * layouts
 
int do_video
1 if video output enabled, 0 otherwise
 
AVFilterFormats * in_formats
Lists of formats and channel layouts supported by the input and output filters respectively.
 
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
 
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
 
char * av_asprintf(const char *fmt,...)
 
int count
how many times the corresponding value occurred
 
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
 
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
 
double z[MAX_CHANNELS *3]
3 RLB-filter samples cache for each channel
 
A link between two filters.
 
AVFilterFormats * in_samplerates
Lists of channel layouts and sample rates used for automatic negotiation.
 
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
 
double * cache[MAX_CHANNELS]
window of filtered samples (N ms)
 
static av_cold void uninit(AVFilterContext *ctx)
 
double pan_law
pan law value used to calculate dual-mono measurements
 
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
 
static int query_formats(AVFilterContext *ctx)
 
int cache_pos
focus on the last added bin in the cache array
 
A filter pad used for either input or output.
 
static const uint8_t font_colors[]
 
int metadata
whether or not to inject loudness results in frames
 
@ PEAK_MODE_SAMPLES_PEAKS
 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
 
#define MOVE_TO_NEXT_CACHED_ENTRY(time)
 
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.
 
#define AV_CH_LOW_FREQUENCY
 
static int config_video_output(AVFilterLink *outlink)
 
static const uint16_t mask[17]
 
double integrated_loudness
integrated loudness in LUFS (I)
 
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 const AVFilterPad outputs[]
 
static enum AVPixelFormat pix_fmts[]
 
int attribute_align_arg swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count, const uint8_t *in_arg[SWR_CH_MAX], int in_count)
 
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)
 
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
 
Describe the class of an AVClass context structure.
 
int peak_mode
enabled peak modes
 
Rational number (pair of numerator and denominator).
 
@ AV_OPT_TYPE_IMAGE_SIZE
offset must point to two consecutive integers
 
uint64_t channel_layout
channel layout of current buffer (see libavutil/channel_layout.h)
 
struct rect gauge
rectangle for the gauge on the right
 
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
 
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_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
 
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
 
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
 
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)
 
@ 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 format
agreed upon media format
 
av_cold void swr_free(SwrContext **ss)
Free the given SwrContext and set the pointer to NULL.
 
AVFilterContext * src
source filter
 
AVFrame * outpicref
output picture reference, updated regularly
 
double y[MAX_CHANNELS *3]
3 pre-filter samples cache for each channel
 
int h
size of the video output
 
#define AV_LOG_INFO
Standard information.
 
#define PRINT_PEAK_SUMMARY(str, sp, ptype)
 
int sample_rate
samples per second
 
int nb_samples
number of audio samples (per channel) described by this frame
 
const uint8_t avpriv_vga16_font[4096]
 
#define i(width, name, range_min, range_max)
 
struct rect text
rectangle for the LU legend on the left
 
uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index)
Get the channel with the given index in channel_layout.
 
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.
 
double rel_threshold
relative threshold
 
#define ABS_THRES
silence gate: we discard anything below this absolute (LUFS) threshold
 
const char * name
Pad name.
 
int nb_kept_powers
number of sum above absolute threshold
 
double * true_peaks
true peaks per channel
 
double loudness_range
loudness range in LU (LRA)
 
double energy
E = 10^((L + 0.691) / 10)
 
static const uint8_t graph_colors[]
 
double lra_high
low and high LRA values
 
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
 
#define SET_META(name, var)
 
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
 
int h
agreed upon image height
 
int meter
select a EBU mode between +9 and +18
 
static int ff_insert_outpad(AVFilterContext *f, unsigned index, AVFilterPad *p)
Insert a new output pad for the filter.
 
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.
 
#define FILTER(Y, X, name)
 
char * av_strdup(const char *s)
Duplicate a string.
 
static const AVFilterPad ebur128_inputs[]
 
const uint8_t avpriv_cga_font[2048]
 
int nb_channels
number of channels in the input
 
struct integrator i400
400ms integrator, used for Momentary loudness (M), and Integrated loudness (I)
 
#define flags(name, subs,...)
 
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
 
static int config_audio_input(AVFilterLink *inlink)
 
struct hist_entry * histogram
histogram of the powers, used to compute LRA and I
 
@ AV_SAMPLE_FMT_DBL
double
 
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)
 
double sum[MAX_CHANNELS]
sum of the last N ms filtered samples (cache content)
 
int loglevel
log level for frame logging
 
double x[MAX_CHANNELS *3]
3 input samples cache for each channel
 
static int gate_update(struct integrator *integ, double power, double loudness, int gate_thres)
 
#define COMPUTE_LOUDNESS(m, time)
 
A histogram is an array of HIST_SIZE hist_entry storing all the energies recorded (with an accuracy o...