FFmpeg
Data Structures | Macros | Enumerations | Functions | Variables
f_ebur128.c File Reference
#include <float.h>
#include <math.h>
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
#include "libavutil/dict.h"
#include "libavutil/ffmath.h"
#include "libavutil/xga_font_data.h"
#include "libavutil/opt.h"
#include "libavutil/timestamp.h"
#include "libswresample/swresample.h"
#include "audio.h"
#include "avfilter.h"
#include "filters.h"
#include "formats.h"
#include "internal.h"
#include "video.h"

Go to the source code of this file.

Data Structures

struct  hist_entry
 A histogram is an array of HIST_SIZE hist_entry storing all the energies recorded (with an accuracy of 1/HIST_GRAIN) of the loudnesses from ABS_THRES (at 0) to ABS_UP_THRES (at HIST_SIZE-1). More...
 
struct  integrator
 
struct  rect
 
struct  EBUR128Context
 

Macros

#define ABS_THRES   -70
 silence gate: we discard anything below this absolute (LUFS) threshold More...
 
#define ABS_UP_THRES   10
 upper loud limit to consider (ABS_THRES being the minimum) More...
 
#define HIST_GRAIN   100
 defines histogram precision More...
 
#define HIST_SIZE   ((ABS_UP_THRES - ABS_THRES) * HIST_GRAIN + 1)
 
#define OFFSET(x)   offsetof(EBUR128Context, x)
 
#define A   AV_OPT_FLAG_AUDIO_PARAM
 
#define V   AV_OPT_FLAG_VIDEO_PARAM
 
#define F   AV_OPT_FLAG_FILTERING_PARAM
 
#define X   AV_OPT_FLAG_EXPORT
 
#define R   AV_OPT_FLAG_READONLY
 
#define FONT8   0
 
#define FONT16   1
 
#define PAD   8
 
#define DRAW_RECT(r)
 
#define BACK_MASK
 
#define I400_BINS(x)   ((x) * 4 / 10)
 
#define I3000_BINS(x)   ((x) * 3)
 
#define ENERGY(loudness)   (ff_exp10(((loudness) + 0.691) / 10.))
 
#define LOUDNESS(energy)   (-0.691 + 10 * log10(energy))
 
#define DBFS(energy)   (20 * log10(energy))
 
#define HIST_POS(power)   (int)(((power) - ABS_THRES) * HIST_GRAIN)
 
#define MOVE_TO_NEXT_CACHED_ENTRY(time)
 
#define FILTER(Y, X, NUM, DEN)
 
#define FIND_PEAK(global, sp, ptype)
 
#define COMPUTE_LOUDNESS(m, time)
 
#define I_GATE_THRES   -10
 
#define LRA_GATE_THRES   -20
 
#define LRA_LOWER_PRC   10
 
#define LRA_HIGHER_PRC   95
 
#define LOG_FMT   "TARGET:%d LUFS M:%6.1f S:%6.1f I:%6.1f %s LRA:%6.1f LU"
 
#define META_PREFIX   "lavfi.r128."
 
#define SET_META(name, var)
 
#define SET_META_PEAK(name, ptype)
 
#define PRINT_PEAKS(str, sp, ptype)
 
#define PRINT_PEAK_SUMMARY(str, value, ptype)
 

Enumerations

enum  { PEAK_MODE_NONE = 0, PEAK_MODE_SAMPLES_PEAKS = 1<<1, PEAK_MODE_TRUE_PEAKS = 1<<2 }
 
enum  { GAUGE_TYPE_MOMENTARY = 0, GAUGE_TYPE_SHORTTERM = 1 }
 
enum  { SCALE_TYPE_ABSOLUTE = 0, SCALE_TYPE_RELATIVE = 1 }
 

Functions

 AVFILTER_DEFINE_CLASS (ebur128)
 
static const uint8_t * get_graph_color (const EBUR128Context *ebur128, int v, int y)
 
static int lu_to_y (const EBUR128Context *ebur128, double v)
 
static void drawtext (AVFrame *pic, int x, int y, int ftid, const uint8_t *color, const char *fmt,...)
 
static void drawline (AVFrame *pic, int x, int y, int len, int step)
 
static int config_video_output (AVFilterLink *outlink)
 
static int config_audio_input (AVFilterLink *inlink)
 
static int config_audio_output (AVFilterLink *outlink)
 
static struct hist_entryget_histogram (void)
 
static av_cold int init (AVFilterContext *ctx)
 
static int gate_update (struct integrator *integ, double power, double loudness, int gate_thres)
 
static int filter_frame (AVFilterLink *inlink, AVFrame *insamples)
 
static int activate (AVFilterContext *ctx)
 
static int query_formats (AVFilterContext *ctx)
 
static av_cold void uninit (AVFilterContext *ctx)
 

Variables

static const AVOption ebur128_options []
 
static const uint8_t graph_colors []
 
static const uint8_t font_colors []
 
static const AVFilterPad ebur128_inputs []
 
const AVFilter ff_af_ebur128
 

Detailed Description

EBU R.128 implementation

See also
http://tech.ebu.ch/loudness
https://www.youtube.com/watch?v=iuEtQqC-Sqo "EBU R128 Introduction - Florian Camerer"
Todo:
implement start/stop/reset through filter command injection

Definition in file f_ebur128.c.

Macro Definition Documentation

◆ ABS_THRES

#define ABS_THRES   -70

silence gate: we discard anything below this absolute (LUFS) threshold

Definition at line 48 of file f_ebur128.c.

◆ ABS_UP_THRES

#define ABS_UP_THRES   10

upper loud limit to consider (ABS_THRES being the minimum)

Definition at line 49 of file f_ebur128.c.

◆ HIST_GRAIN

#define HIST_GRAIN   100

defines histogram precision

Definition at line 50 of file f_ebur128.c.

◆ HIST_SIZE

#define HIST_SIZE   ((ABS_UP_THRES - ABS_THRES) * HIST_GRAIN + 1)

Definition at line 51 of file f_ebur128.c.

◆ OFFSET

#define OFFSET (   x)    offsetof(EBUR128Context, x)

Definition at line 162 of file f_ebur128.c.

◆ A

#define A   AV_OPT_FLAG_AUDIO_PARAM

Definition at line 163 of file f_ebur128.c.

◆ V

#define V   AV_OPT_FLAG_VIDEO_PARAM

Definition at line 164 of file f_ebur128.c.

◆ F

Definition at line 165 of file f_ebur128.c.

◆ X

#define X   AV_OPT_FLAG_EXPORT

Definition at line 166 of file f_ebur128.c.

◆ R

#define R   AV_OPT_FLAG_READONLY

Definition at line 167 of file f_ebur128.c.

◆ FONT8

#define FONT8   0

Definition at line 242 of file f_ebur128.c.

◆ FONT16

#define FONT16   1

Definition at line 243 of file f_ebur128.c.

◆ PAD

#define PAD   8

◆ DRAW_RECT

#define DRAW_RECT (   r)
Value:
do { \
drawline(outpicref, r.x, r.y - 1, r.w, 3); \
drawline(outpicref, r.x, r.y + r.h, r.w, 3); \
drawline(outpicref, r.x - 1, r.y, r.h, outpicref->linesize[0]); \
drawline(outpicref, r.x + r.w, r.y, r.h, outpicref->linesize[0]); \
} while (0)

◆ BACK_MASK

#define BACK_MASK
Value:

◆ I400_BINS

#define I400_BINS (   x)    ((x) * 4 / 10)

◆ I3000_BINS

#define I3000_BINS (   x)    ((x) * 3)

◆ ENERGY

#define ENERGY (   loudness)    (ff_exp10(((loudness) + 0.691) / 10.))

Definition at line 526 of file f_ebur128.c.

◆ LOUDNESS

#define LOUDNESS (   energy)    (-0.691 + 10 * log10(energy))

Definition at line 527 of file f_ebur128.c.

◆ DBFS

#define DBFS (   energy)    (20 * log10(energy))

Definition at line 528 of file f_ebur128.c.

◆ HIST_POS

#define HIST_POS (   power)    (int)(((power) - ABS_THRES) * HIST_GRAIN)

Definition at line 603 of file f_ebur128.c.

◆ MOVE_TO_NEXT_CACHED_ENTRY

#define MOVE_TO_NEXT_CACHED_ENTRY (   time)
Value:
do { \
ebur128->i##time.cache_pos++; \
if (ebur128->i##time.cache_pos == \
ebur128->i##time.cache_size) { \
ebur128->i##time.filled = 1; \
ebur128->i##time.cache_pos = 0; \
} \
} while (0)

◆ FILTER

#define FILTER (   Y,
  X,
  NUM,
  DEN 
)
Value:
do { \
double *dst = ebur128->Y + ch*3; \
double *src = ebur128->X + ch*3; \
dst[2] = dst[1]; \
dst[1] = dst[0]; \
dst[0] = src[0]*NUM[0] + src[1]*NUM[1] + src[2]*NUM[2] \
- dst[1]*DEN[1] - dst[2]*DEN[2]; \
} while (0)

◆ FIND_PEAK

#define FIND_PEAK (   global,
  sp,
  ptype 
)
Value:
do { \
int ch; \
double maxpeak; \
maxpeak = 0.0; \
if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
for (ch = 0; ch < ebur128->nb_channels; ch++) \
maxpeak = FFMAX(maxpeak, sp[ch]); \
global = DBFS(maxpeak); \
} \
} while (0)

◆ COMPUTE_LOUDNESS

#define COMPUTE_LOUDNESS (   m,
  time 
)
Value:
do { \
if (ebur128->i##time.filled) { \
/* weighting sum of the last <time> ms */ \
for (ch = 0; ch < nb_channels; ch++) \
power_##time += ebur128->ch_weighting[ch] * ebur128->i##time.sum[ch]; \
power_##time /= I##time##_BINS(inlink->sample_rate); \
} \
loudness_##time = LOUDNESS(power_##time); \
} while (0)

◆ I_GATE_THRES

#define I_GATE_THRES   -10

◆ LRA_GATE_THRES

#define LRA_GATE_THRES   -20

◆ LRA_LOWER_PRC

#define LRA_LOWER_PRC   10

◆ LRA_HIGHER_PRC

#define LRA_HIGHER_PRC   95

◆ LOG_FMT

#define LOG_FMT   "TARGET:%d LUFS M:%6.1f S:%6.1f I:%6.1f %s LRA:%6.1f LU"

◆ META_PREFIX

#define META_PREFIX   "lavfi.r128."

◆ SET_META

#define SET_META (   name,
  var 
)
Value:
do { \
snprintf(metabuf, sizeof(metabuf), "%.3f", var); \
av_dict_set(&insamples->metadata, name, metabuf, 0); \
} while (0)

◆ SET_META_PEAK

#define SET_META_PEAK (   name,
  ptype 
)
Value:
do { \
if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
double max_peak = 0.0; \
char key[64]; \
for (ch = 0; ch < nb_channels; ch++) { \
snprintf(key, sizeof(key), \
META_PREFIX AV_STRINGIFY(name) "_peaks_ch%d", ch); \
max_peak = fmax(max_peak, ebur128->name##_peaks[ch]); \
SET_META(key, ebur128->name##_peaks[ch]); \
} \
snprintf(key, sizeof(key), \
SET_META(key, max_peak); \
} \
} while (0)

◆ PRINT_PEAKS

#define PRINT_PEAKS (   str,
  sp,
  ptype 
)
Value:
do { \
if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
av_log(ctx, ebur128->loglevel, " " str ":"); \
for (ch = 0; ch < nb_channels; ch++) \
av_log(ctx, ebur128->loglevel, " %5.1f", DBFS(sp[ch])); \
av_log(ctx, ebur128->loglevel, " dBFS"); \
} \
} while (0)

◆ PRINT_PEAK_SUMMARY

#define PRINT_PEAK_SUMMARY (   str,
  value,
  ptype 
)
Value:
do { \
if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
av_log(ctx, AV_LOG_INFO, "\n\n " str " peak:\n" \
" Peak: %5.1f dBFS", value); \
} \
} while (0)

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
PEAK_MODE_NONE 
PEAK_MODE_SAMPLES_PEAKS 
PEAK_MODE_TRUE_PEAKS 

Definition at line 146 of file f_ebur128.c.

◆ anonymous enum

anonymous enum
Enumerator
GAUGE_TYPE_MOMENTARY 
GAUGE_TYPE_SHORTTERM 

Definition at line 152 of file f_ebur128.c.

◆ anonymous enum

anonymous enum
Enumerator
SCALE_TYPE_ABSOLUTE 
SCALE_TYPE_RELATIVE 

Definition at line 157 of file f_ebur128.c.

Function Documentation

◆ AVFILTER_DEFINE_CLASS()

AVFILTER_DEFINE_CLASS ( ebur128  )

◆ get_graph_color()

static const uint8_t* get_graph_color ( const EBUR128Context ebur128,
int  v,
int  y 
)
static

Definition at line 224 of file f_ebur128.c.

Referenced by config_video_output(), and filter_frame().

◆ lu_to_y()

static int lu_to_y ( const EBUR128Context ebur128,
double  v 
)
inlinestatic

Definition at line 234 of file f_ebur128.c.

Referenced by config_video_output(), and filter_frame().

◆ drawtext()

static void drawtext ( AVFrame pic,
int  x,
int  y,
int  ftid,
const uint8_t *  color,
const char *  fmt,
  ... 
)
static

Definition at line 250 of file f_ebur128.c.

Referenced by config_video_output(), and filter_frame().

◆ drawline()

static void drawline ( AVFrame pic,
int  x,
int  y,
int  len,
int  step 
)
static

Definition at line 283 of file f_ebur128.c.

◆ config_video_output()

static int config_video_output ( AVFilterLink outlink)
static

Definition at line 294 of file f_ebur128.c.

Referenced by init().

◆ config_audio_input()

static int config_audio_input ( AVFilterLink inlink)
static

Definition at line 392 of file f_ebur128.c.

◆ config_audio_output()

static int config_audio_output ( AVFilterLink outlink)
static

Definition at line 437 of file f_ebur128.c.

Referenced by init().

◆ get_histogram()

static struct hist_entry* get_histogram ( void  )
static

Definition at line 530 of file f_ebur128.c.

Referenced by init().

◆ init()

static av_cold int init ( AVFilterContext ctx)
static

Definition at line 544 of file f_ebur128.c.

◆ gate_update()

static int gate_update ( struct integrator integ,
double  power,
double  loudness,
int  gate_thres 
)
static

Definition at line 607 of file f_ebur128.c.

Referenced by filter_frame().

◆ filter_frame()

static int filter_frame ( AVFilterLink inlink,
AVFrame insamples 
)
static

Definition at line 630 of file f_ebur128.c.

Referenced by activate().

◆ activate()

static int activate ( AVFilterContext ctx)
static

Definition at line 972 of file f_ebur128.c.

◆ query_formats()

static int query_formats ( AVFilterContext ctx)
static

Definition at line 1009 of file f_ebur128.c.

◆ uninit()

static av_cold void uninit ( AVFilterContext ctx)
static

Definition at line 1050 of file f_ebur128.c.

Variable Documentation

◆ ebur128_options

const AVOption ebur128_options[]
static

Definition at line 168 of file f_ebur128.c.

◆ graph_colors

const uint8_t graph_colors[]
static
Initial value:
= {
0xdd, 0x66, 0x66,
0x66, 0x66, 0xdd,
0x96, 0x33, 0x33,
0x33, 0x33, 0x96,
0xdd, 0x96, 0x96,
0x96, 0x96, 0xdd,
0xdd, 0x33, 0x33,
0x33, 0x33, 0xdd,
0xdd, 0x66, 0x66,
0x66, 0xdd, 0x66,
0x96, 0x33, 0x33,
0x33, 0x96, 0x33,
0xdd, 0x96, 0x96,
0x96, 0xdd, 0x96,
0xdd, 0x33, 0x33,
0x33, 0xdd, 0x33,
}

Definition at line 205 of file f_ebur128.c.

Referenced by get_graph_color().

◆ font_colors

const uint8_t font_colors[]
static
Initial value:
= {
0xdd, 0xdd, 0x00,
0x00, 0x96, 0x96,
}

Definition at line 245 of file f_ebur128.c.

Referenced by config_video_output(), and filter_frame().

◆ ebur128_inputs

const AVFilterPad ebur128_inputs[]
static
Initial value:
= {
{
.name = "default",
.config_props = config_audio_input,
},
}

Definition at line 1115 of file f_ebur128.c.

◆ ff_af_ebur128

const AVFilter ff_af_ebur128
Initial value:
= {
.name = "ebur128",
.description = NULL_IF_CONFIG_SMALL("EBU R128 scanner."),
.priv_size = sizeof(EBUR128Context),
.init = init,
.outputs = NULL,
.priv_class = &ebur128_class,
}

Definition at line 1123 of file f_ebur128.c.

name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
r
const char * r
Definition: vf_curves.c:126
inlink
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
Definition: filter_design.txt:212
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:169
init
static av_cold int init(AVFilterContext *ctx)
Definition: f_ebur128.c:544
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AV_CH_SURROUND_DIRECT_RIGHT
#define AV_CH_SURROUND_DIRECT_RIGHT
Definition: channel_layout.h:187
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: f_ebur128.c:1050
AV_CH_TOP_BACK_CENTER
#define AV_CH_TOP_BACK_CENTER
Definition: channel_layout.h:180
AV_CH_BACK_LEFT
#define AV_CH_BACK_LEFT
Definition: channel_layout.h:168
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: f_ebur128.c:1009
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
ctx
AVFormatContext * ctx
Definition: movenc.c:48
key
const char * key
Definition: hwcontext_opencl.c:174
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:192
NULL
#define NULL
Definition: coverity.c:32
EBUR128Context
Definition: f_ebur128.c:80
AVFILTER_FLAG_DYNAMIC_OUTPUTS
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
Definition: avfilter.h:112
activate
static int activate(AVFilterContext *ctx)
Definition: f_ebur128.c:972
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:106
sp
#define sp
Definition: regdef.h:63
AV_CH_TOP_BACK_RIGHT
#define AV_CH_TOP_BACK_RIGHT
Definition: channel_layout.h:181
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
AV_CH_BACK_CENTER
#define AV_CH_BACK_CENTER
Definition: channel_layout.h:172
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
AV_STRINGIFY
#define AV_STRINGIFY(s)
Definition: macros.h:66
AV_CH_SIDE_RIGHT
#define AV_CH_SIDE_RIGHT
Definition: channel_layout.h:174
fmax
double fmax(double, double)
META_PREFIX
#define META_PREFIX
LOUDNESS
#define LOUDNESS(energy)
Definition: f_ebur128.c:527
DBFS
#define DBFS(energy)
Definition: f_ebur128.c:528
ebur128_inputs
static const AVFilterPad ebur128_inputs[]
Definition: f_ebur128.c:1115
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
config_audio_input
static int config_audio_input(AVFilterLink *inlink)
Definition: f_ebur128.c:392
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_CH_BACK_RIGHT
#define AV_CH_BACK_RIGHT
Definition: channel_layout.h:169