Skip to content

Commit

Permalink
avfilter/vsrc_testsrc: add pal75bars and pal100bars video filter sources
Browse files Browse the repository at this point in the history
Generates color bar test patterns based on EBU PAL recommendations.

Reviewed-by: Paul B Mahol <[email protected]>
Signed-off-by: Tobias Rapp <[email protected]>
  • Loading branch information
t-rapp committed May 18, 2018
1 parent e9dd5b4 commit eb28b5e
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 3 deletions.
1 change: 1 addition & 0 deletions Changelog
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ version <next>:
- amplify filter
- fftdnoiz filter
- aderivative and aintegral audio filters
- pal75bars and pal100bars video filter sources


version 4.0:
Expand Down
10 changes: 9 additions & 1 deletion doc/filters.texi
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions libavfilter/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions libavfilter/allfilters.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion libavfilter/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -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, \
Expand Down
106 changes: 105 additions & 1 deletion libavfilter/vsrc_testsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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 */
Expand Down Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions tests/fate/filter-video.mak
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 10 additions & 0 deletions tests/ref/fate/filter-pal100bars
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions tests/ref/fate/filter-pal75bars
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit eb28b5e

Please sign in to comment.