|
|
|
@@ -114,6 +114,8 @@ typedef struct EBUR128Context { |
|
|
|
int meter; ///< select a EBU mode between +9 and +18 |
|
|
|
int scale_range; ///< the range of LU values according to the meter |
|
|
|
int y_zero_lu; ///< the y value (pixel position) for 0 LU |
|
|
|
int y_opt_max; ///< the y value (pixel position) for 1 LU |
|
|
|
int y_opt_min; ///< the y value (pixel position) for -1 LU |
|
|
|
int *y_line_ref; ///< y reference values for drawing the LU lines in the graph and the gauge |
|
|
|
|
|
|
|
/* audio */ |
|
|
|
@@ -188,22 +190,31 @@ static const AVOption ebur128_options[] = { |
|
|
|
AVFILTER_DEFINE_CLASS(ebur128); |
|
|
|
|
|
|
|
static const uint8_t graph_colors[] = { |
|
|
|
0xdd, 0x66, 0x66, // value above 0LU non reached |
|
|
|
0x66, 0x66, 0xdd, // value below 0LU non reached |
|
|
|
0x96, 0x33, 0x33, // value above 0LU reached |
|
|
|
0x33, 0x33, 0x96, // value below 0LU reached |
|
|
|
0xdd, 0x96, 0x96, // value above 0LU line non reached |
|
|
|
0x96, 0x96, 0xdd, // value below 0LU line non reached |
|
|
|
0xdd, 0x33, 0x33, // value above 0LU line reached |
|
|
|
0x33, 0x33, 0xdd, // value below 0LU line reached |
|
|
|
0xdd, 0x66, 0x66, // value above 1LU non reached below -1LU (impossible) |
|
|
|
0x66, 0x66, 0xdd, // value below 1LU non reached below -1LU |
|
|
|
0x96, 0x33, 0x33, // value above 1LU reached below -1LU (impossible) |
|
|
|
0x33, 0x33, 0x96, // value below 1LU reached below -1LU |
|
|
|
0xdd, 0x96, 0x96, // value above 1LU line non reached below -1LU (impossible) |
|
|
|
0x96, 0x96, 0xdd, // value below 1LU line non reached below -1LU |
|
|
|
0xdd, 0x33, 0x33, // value above 1LU line reached below -1LU (impossible) |
|
|
|
0x33, 0x33, 0xdd, // value below 1LU line reached below -1LU |
|
|
|
0xdd, 0x66, 0x66, // value above 1LU non reached above -1LU |
|
|
|
0x66, 0xdd, 0x66, // value below 1LU non reached above -1LU |
|
|
|
0x96, 0x33, 0x33, // value above 1LU reached above -1LU |
|
|
|
0x33, 0x96, 0x33, // value below 1LU reached above -1LU |
|
|
|
0xdd, 0x96, 0x96, // value above 1LU line non reached above -1LU |
|
|
|
0x96, 0xdd, 0x96, // value below 1LU line non reached above -1LU |
|
|
|
0xdd, 0x33, 0x33, // value above 1LU line reached above -1LU |
|
|
|
0x33, 0xdd, 0x33, // value below 1LU line reached above -1LU |
|
|
|
}; |
|
|
|
|
|
|
|
static const uint8_t *get_graph_color(const EBUR128Context *ebur128, int v, int y) |
|
|
|
{ |
|
|
|
const int below0 = y > ebur128->y_zero_lu; |
|
|
|
const int above_opt_max = y > ebur128->y_opt_max; |
|
|
|
const int below_opt_min = y < ebur128->y_opt_min; |
|
|
|
const int reached = y >= v; |
|
|
|
const int line = ebur128->y_line_ref[y] || y == ebur128->y_zero_lu; |
|
|
|
const int colorid = 4*line + 2*reached + below0; |
|
|
|
const int colorid = 8*below_opt_min+ 4*line + 2*reached + above_opt_max; |
|
|
|
return graph_colors + 3*colorid; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -337,6 +348,8 @@ static int config_video_output(AVFilterLink *outlink) |
|
|
|
|
|
|
|
/* draw graph */ |
|
|
|
ebur128->y_zero_lu = lu_to_y(ebur128, 0); |
|
|
|
ebur128->y_opt_max = lu_to_y(ebur128, 1); |
|
|
|
ebur128->y_opt_min = lu_to_y(ebur128, -1); |
|
|
|
p = outpicref->data[0] + ebur128->graph.y * outpicref->linesize[0] |
|
|
|
+ ebur128->graph.x * 3; |
|
|
|
for (y = 0; y < ebur128->graph.h; y++) { |
|
|
|
|