Generates color bar test patterns based on EBU PAL recommendations. Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Tobias Rapp <t.rapp@noa-archive.com>tags/n4.1
@@ -7,6 +7,7 @@ version <next>: | |||
- amplify filter | |||
- fftdnoiz filter | |||
- aderivative and aintegral audio filters | |||
- pal75bars and pal100bars video filter sources | |||
version 4.0: | |||
@@ -17825,13 +17825,15 @@ ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_c | |||
@anchor{color} | |||
@anchor{haldclutsrc} | |||
@anchor{nullsrc} | |||
@anchor{pal75bars} | |||
@anchor{pal100bars} | |||
@anchor{rgbtestsrc} | |||
@anchor{smptebars} | |||
@anchor{smptehdbars} | |||
@anchor{testsrc} | |||
@anchor{testsrc2} | |||
@anchor{yuvtestsrc} | |||
@section allrgb, allyuv, color, haldclutsrc, nullsrc, rgbtestsrc, smptebars, smptehdbars, testsrc, testsrc2, yuvtestsrc | |||
@section allrgb, allyuv, color, haldclutsrc, nullsrc, pal75bars, pal100bars, rgbtestsrc, smptebars, smptehdbars, testsrc, testsrc2, yuvtestsrc | |||
The @code{allrgb} source returns frames of size 4096x4096 of all rgb colors. | |||
@@ -17846,6 +17848,12 @@ The @code{nullsrc} source returns unprocessed video frames. It is | |||
mainly useful to be employed in analysis / debugging tools, or as the | |||
source for filters which ignore the input data. | |||
The @code{pal75bars} source generates a color bars pattern, based on | |||
EBU PAL recommendations with 75% color levels. | |||
The @code{pal100bars} source generates a color bars pattern, based on | |||
EBU PAL recommendations with 100% color levels. | |||
The @code{rgbtestsrc} source generates an RGB test pattern useful for | |||
detecting RGB vs BGR issues. You should see a red, green and blue | |||
stripe from top to bottom. | |||
@@ -390,6 +390,8 @@ OBJS-$(CONFIG_MANDELBROT_FILTER) += vsrc_mandelbrot.o | |||
OBJS-$(CONFIG_MPTESTSRC_FILTER) += vsrc_mptestsrc.o | |||
OBJS-$(CONFIG_NULLSRC_FILTER) += vsrc_testsrc.o | |||
OBJS-$(CONFIG_OPENCLSRC_FILTER) += vf_program_opencl.o opencl.o | |||
OBJS-$(CONFIG_PAL75BARS_FILTER) += vsrc_testsrc.o | |||
OBJS-$(CONFIG_PAL100BARS_FILTER) += vsrc_testsrc.o | |||
OBJS-$(CONFIG_RGBTESTSRC_FILTER) += vsrc_testsrc.o | |||
OBJS-$(CONFIG_SMPTEBARS_FILTER) += vsrc_testsrc.o | |||
OBJS-$(CONFIG_SMPTEHDBARS_FILTER) += vsrc_testsrc.o | |||
@@ -380,6 +380,8 @@ extern AVFilter ff_vsrc_mandelbrot; | |||
extern AVFilter ff_vsrc_mptestsrc; | |||
extern AVFilter ff_vsrc_nullsrc; | |||
extern AVFilter ff_vsrc_openclsrc; | |||
extern AVFilter ff_vsrc_pal75bars; | |||
extern AVFilter ff_vsrc_pal100bars; | |||
extern AVFilter ff_vsrc_rgbtestsrc; | |||
extern AVFilter ff_vsrc_smptebars; | |||
extern AVFilter ff_vsrc_smptehdbars; | |||
@@ -30,7 +30,7 @@ | |||
#include "libavutil/version.h" | |||
#define LIBAVFILTER_VERSION_MAJOR 7 | |||
#define LIBAVFILTER_VERSION_MINOR 23 | |||
#define LIBAVFILTER_VERSION_MINOR 24 | |||
#define LIBAVFILTER_VERSION_MICRO 100 | |||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | |||
@@ -1252,7 +1252,7 @@ AVFilter ff_vsrc_yuvtestsrc = { | |||
#endif /* CONFIG_YUVTESTSRC_FILTER */ | |||
#if CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER | |||
#if CONFIG_PAL75_FILTER || CONFIG_PAL100_FILTER || CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER | |||
static const uint8_t rainbow[7][4] = { | |||
{ 180, 128, 128, 255 }, /* 75% white */ | |||
@@ -1264,6 +1264,16 @@ static const uint8_t rainbow[7][4] = { | |||
{ 35, 212, 114, 255 }, /* 75% blue */ | |||
}; | |||
static const uint8_t rainbow100[7][4] = { | |||
{ 235, 128, 128, 255 }, /* 100% white */ | |||
{ 210, 16, 146, 255 }, /* 100% yellow */ | |||
{ 170, 166, 16, 255 }, /* 100% cyan */ | |||
{ 145, 54, 34, 255 }, /* 100% green */ | |||
{ 106, 202, 222, 255 }, /* 100% magenta */ | |||
{ 81, 90, 240, 255 }, /* 100% red */ | |||
{ 41, 240, 110, 255 }, /* 100% blue */ | |||
}; | |||
static const uint8_t rainbowhd[7][4] = { | |||
{ 180, 128, 128, 255 }, /* 75% white */ | |||
{ 168, 44, 136, 255 }, /* 75% yellow */ | |||
@@ -1371,6 +1381,100 @@ static const AVFilterPad smptebars_outputs[] = { | |||
{ NULL } | |||
}; | |||
#if CONFIG_PAL75BARS_FILTER | |||
#define pal75bars_options options | |||
AVFILTER_DEFINE_CLASS(pal75bars); | |||
static void pal75bars_fill_picture(AVFilterContext *ctx, AVFrame *picref) | |||
{ | |||
TestSourceContext *test = ctx->priv; | |||
int r_w, i, x = 0; | |||
const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format); | |||
picref->color_range = AVCOL_RANGE_MPEG; | |||
picref->colorspace = AVCOL_SPC_BT470BG; | |||
r_w = FFALIGN((test->w + 7) / 8, 1 << pixdesc->log2_chroma_w); | |||
draw_bar(test, white, x, 0, r_w, test->h, picref); | |||
x += r_w; | |||
for (i = 1; i < 7; i++) { | |||
draw_bar(test, rainbow[i], x, 0, r_w, test->h, picref); | |||
x += r_w; | |||
} | |||
draw_bar(test, black0, x, 0, r_w, test->h, picref); | |||
} | |||
static av_cold int pal75bars_init(AVFilterContext *ctx) | |||
{ | |||
TestSourceContext *test = ctx->priv; | |||
test->fill_picture_fn = pal75bars_fill_picture; | |||
test->draw_once = 1; | |||
return init(ctx); | |||
} | |||
AVFilter ff_vsrc_pal75bars = { | |||
.name = "pal75bars", | |||
.description = NULL_IF_CONFIG_SMALL("Generate PAL 75% color bars."), | |||
.priv_size = sizeof(TestSourceContext), | |||
.priv_class = &pal75bars_class, | |||
.init = pal75bars_init, | |||
.uninit = uninit, | |||
.query_formats = smptebars_query_formats, | |||
.inputs = NULL, | |||
.outputs = smptebars_outputs, | |||
}; | |||
#endif /* CONFIG_PAL75BARS_FILTER */ | |||
#if CONFIG_PAL100BARS_FILTER | |||
#define pal100bars_options options | |||
AVFILTER_DEFINE_CLASS(pal100bars); | |||
static void pal100bars_fill_picture(AVFilterContext *ctx, AVFrame *picref) | |||
{ | |||
TestSourceContext *test = ctx->priv; | |||
int r_w, i, x = 0; | |||
const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format); | |||
picref->color_range = AVCOL_RANGE_MPEG; | |||
picref->colorspace = AVCOL_SPC_BT470BG; | |||
r_w = FFALIGN((test->w + 7) / 8, 1 << pixdesc->log2_chroma_w); | |||
for (i = 0; i < 7; i++) { | |||
draw_bar(test, rainbow100[i], x, 0, r_w, test->h, picref); | |||
x += r_w; | |||
} | |||
draw_bar(test, black0, x, 0, r_w, test->h, picref); | |||
} | |||
static av_cold int pal100bars_init(AVFilterContext *ctx) | |||
{ | |||
TestSourceContext *test = ctx->priv; | |||
test->fill_picture_fn = pal100bars_fill_picture; | |||
test->draw_once = 1; | |||
return init(ctx); | |||
} | |||
AVFilter ff_vsrc_pal100bars = { | |||
.name = "pal100bars", | |||
.description = NULL_IF_CONFIG_SMALL("Generate PAL 100% color bars."), | |||
.priv_size = sizeof(TestSourceContext), | |||
.priv_class = &pal100bars_class, | |||
.init = pal100bars_init, | |||
.uninit = uninit, | |||
.query_formats = smptebars_query_formats, | |||
.inputs = NULL, | |||
.outputs = smptebars_outputs, | |||
}; | |||
#endif /* CONFIG_PAL100BARS_FILTER */ | |||
#if CONFIG_SMPTEBARS_FILTER | |||
#define smptebars_options options | |||
@@ -89,6 +89,12 @@ fate-filter-allrgb: CMD = framecrc -lavfi allrgb=rate=5:duration=1 -pix_fmt rgb2 | |||
FATE_FILTER-$(call ALLYES, LAVFI_INDEV ALLYUV_FILTER) += fate-filter-allyuv | |||
fate-filter-allyuv: CMD = framecrc -lavfi allyuv=rate=5:duration=1 -pix_fmt yuv444p | |||
FATE_FILTER-$(call ALLYES, LAVFI_INDEV PAL75BARS_FILTER) += fate-filter-pal75bars | |||
fate-filter-pal75bars: CMD = framecrc -lavfi pal75bars=rate=5:duration=1 -pix_fmt yuv420p | |||
FATE_FILTER-$(call ALLYES, LAVFI_INDEV PAL100BARS_FILTER) += fate-filter-pal100bars | |||
fate-filter-pal100bars: CMD = framecrc -lavfi pal100bars=rate=5:duration=1 -pix_fmt yuv420p | |||
FATE_FILTER-$(call ALLYES, LAVFI_INDEV RGBTESTSRC_FILTER) += fate-filter-rgbtestsrc | |||
fate-filter-rgbtestsrc: CMD = framecrc -lavfi rgbtestsrc=rate=5:duration=1 -pix_fmt rgb24 | |||
@@ -0,0 +1,10 @@ | |||
#tb 0: 1/5 | |||
#media_type 0: video | |||
#codec_id 0: rawvideo | |||
#dimensions 0: 320x240 | |||
#sar 0: 1/1 | |||
0, 0, 0, 1, 115200, 0x97a31f02 | |||
0, 1, 1, 1, 115200, 0x97a31f02 | |||
0, 2, 2, 1, 115200, 0x97a31f02 | |||
0, 3, 3, 1, 115200, 0x97a31f02 | |||
0, 4, 4, 1, 115200, 0x97a31f02 |
@@ -0,0 +1,10 @@ | |||
#tb 0: 1/5 | |||
#media_type 0: video | |||
#codec_id 0: rawvideo | |||
#dimensions 0: 320x240 | |||
#sar 0: 1/1 | |||
0, 0, 0, 1, 115200, 0xa131179a | |||
0, 1, 1, 1, 115200, 0xa131179a | |||
0, 2, 2, 1, 115200, 0xa131179a | |||
0, 3, 3, 1, 115200, 0xa131179a | |||
0, 4, 4, 1, 115200, 0xa131179a |