36 #include "config_components.h"
102 #define OFFSET(x) offsetof(TestSourceContext, x)
103 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
104 #define FLAGSR AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
106 #define SIZE_OPTIONS \
107 { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "320x240"}, 0, 0, FLAGS },\
108 { "s", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "320x240"}, 0, 0, FLAGS },\
110 #define COMMON_OPTIONS_NOSIZE \
111 { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },\
112 { "r", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },\
113 { "duration", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },\
114 { "d", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },\
115 { "sar", "set video sample aspect ratio", OFFSET(sar), AV_OPT_TYPE_RATIONAL, {.dbl= 1}, 0, INT_MAX, FLAGS },
117 #define COMMON_OPTIONS SIZE_OPTIONS COMMON_OPTIONS_NOSIZE
119 #define NOSIZE_OPTIONS_OFFSET 2
137 test->duration < 0 ? -1 : (
double)
test->duration/1000000,
154 outlink->
w =
test->w;
155 outlink->
h =
test->h;
171 if (
test->duration >= 0 &&
177 if (
test->draw_once) {
178 if (
test->draw_once_reset) {
180 test->draw_once_reset = 0;
197 #if FF_API_PKT_DURATION
203 #if FF_API_INTERLACED_FRAME
211 if (!
test->draw_once)
220 #if CONFIG_COLOR_FILTER
222 static const AVOption color_options[] = {
242 test->fill_picture_fn = color_fill_picture;
272 static int color_process_command(
AVFilterContext *
ctx,
const char *cmd,
const char *args,
273 char *res,
int res_len,
int flags)
283 test->draw_once_reset = 1;
291 .config_props = color_config_props,
298 .priv_class = &color_class,
306 .process_command = color_process_command,
311 #if CONFIG_HALDCLUTSRC_FILTER
313 static const AVOption haldclutsrc_options[] = {
323 int i, j, k, x = 0, y = 0, is16bit = 0,
step;
333 const int depth =
desc->comp[0].depth;
342 alpha = (1 << depth) - 1;
348 #define LOAD_CLUT(nbits) do { \
349 uint##nbits##_t *dst = ((uint##nbits##_t *)(data + y*linesize)) + x*step; \
350 dst[rgba_map[0]] = av_clip_uint##nbits(i * scale); \
351 dst[rgba_map[1]] = av_clip_uint##nbits(j * scale); \
352 dst[rgba_map[2]] = av_clip_uint##nbits(k * scale); \
354 dst[rgba_map[3]] = alpha; \
357 #define LOAD_CLUT_PLANAR(type, nbits) do { \
358 type *dst = ((type *)(frame->data[2] + y*frame->linesize[2])) + x; \
359 dst[0] = av_clip_uintp2(i * scale, nbits); \
360 dst = ((type *)(frame->data[0] + y*frame->linesize[0])) + x; \
361 dst[0] = av_clip_uintp2(j * scale, nbits); \
362 dst = ((type *)(frame->data[1] + y*frame->linesize[1])) + x; \
363 dst[0] = av_clip_uintp2(k * scale, nbits); \
365 dst = ((type *)(frame->data[3] + y*linesize)) + x; \
371 for (k = 0; k <
level; k++) {
372 for (j = 0; j <
level; j++) {
381 case 8: LOAD_CLUT_PLANAR(uint8_t, 8);
break;
382 case 9: LOAD_CLUT_PLANAR(uint16_t, 9);
break;
383 case 10: LOAD_CLUT_PLANAR(uint16_t,10);
break;
384 case 12: LOAD_CLUT_PLANAR(uint16_t,12);
break;
385 case 14: LOAD_CLUT_PLANAR(uint16_t,14);
break;
386 case 16: LOAD_CLUT_PLANAR(uint16_t,16);
break;
423 static int haldclutsrc_config_props(
AVFilterLink *outlink)
436 .config_props = haldclutsrc_config_props,
441 .
name =
"haldclutsrc",
443 .priv_class = &haldclutsrc_class,
445 .
init = haldclutsrc_init,
456 #if CONFIG_NULLSRC_FILTER
464 test->fill_picture_fn = nullsrc_fill_picture;
479 .priv_class = &nullsrc_yuvtestsrc_class,
480 .init = nullsrc_init,
490 #if CONFIG_TESTSRC_FILTER
492 static const AVOption testsrc_options[] = {
513 static void draw_rectangle(
unsigned val, uint8_t *dst, ptrdiff_t dst_linesize,
int segment_width,
514 int x,
int y,
int w,
int h)
519 dst += segment_width * (
step * x + y * dst_linesize);
520 w *= segment_width *
step;
522 for (
i = 0;
i <
h;
i++) {
528 static void draw_digit(
int digit, uint8_t *dst, ptrdiff_t dst_linesize,
534 #define LEFT_TOP_VBAR 8
535 #define LEFT_BOT_VBAR 16
536 #define RIGHT_TOP_VBAR 32
537 #define RIGHT_BOT_VBAR 64
549 static const unsigned char masks[10] = {
550 TOP_HBAR |BOT_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR|RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
551 RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
552 TOP_HBAR|MID_HBAR|BOT_HBAR|LEFT_BOT_VBAR |RIGHT_TOP_VBAR,
553 TOP_HBAR|MID_HBAR|BOT_HBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
554 MID_HBAR |LEFT_TOP_VBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
555 TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR |RIGHT_BOT_VBAR,
556 TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR |RIGHT_BOT_VBAR,
557 TOP_HBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
558 TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR|RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
559 TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
561 unsigned mask = masks[digit];
568 segments[
i].x, segments[
i].y, segments[
i].
w, segments[
i].
h);
571 #define GRADIENT_SIZE (6 * 256)
578 int color, color_rest;
582 int dquad_x, dquad_y;
583 int grad, dgrad, rgrad, drgrad;
596 for (y = 0; y <
height; y++) {
602 for (x = 0; x <
width; x++) {
608 *(p++) = icolor & 1 ? 255 : 0;
609 *(p++) = icolor & 2 ? 255 : 0;
610 *(p++) = icolor & 4 ? 255 : 0;
612 if (color_rest >=
width) {
624 grad = (256 *
test->nb_frame *
test->time_base.num /
test->time_base.den) %
627 dgrad = GRADIENT_SIZE /
width;
628 drgrad = GRADIENT_SIZE %
width;
629 for (x = 0; x <
width; x++) {
631 grad < 256 || grad >= 5 * 256 ? 255 :
632 grad >= 2 * 256 && grad < 4 * 256 ? 0 :
633 grad < 2 * 256 ? 2 * 256 - 1 - grad : grad - 4 * 256;
635 grad >= 4 * 256 ? 0 :
636 grad >= 1 * 256 && grad < 3 * 256 ? 255 :
637 grad < 1 * 256 ? grad : 4 * 256 - 1 - grad;
640 grad >= 3 * 256 && grad < 5 * 256 ? 255 :
641 grad < 3 * 256 ? grad - 2 * 256 : 6 * 256 - 1 - grad;
644 if (rgrad >= GRADIENT_SIZE) {
646 rgrad -= GRADIENT_SIZE;
648 if (grad >= GRADIENT_SIZE)
649 grad -= GRADIENT_SIZE;
652 for (y =
height / 8; y > 0; y--) {
658 seg_size =
width / 80;
659 if (seg_size >= 1 &&
height >= 13 * seg_size) {
660 int64_t p10decimals = 1;
666 for (x = 0; x <
test->nb_decimals; x++)
671 y = (
height - seg_size * 13) / 2;
673 for (
i = 0;
i < 8;
i++) {
674 p -= 3 * 8 * seg_size;
687 test->fill_picture_fn = test_fill_picture;
691 static const AVFilterPad avfilter_vsrc_testsrc_outputs[] = {
703 .priv_class = &testsrc_class,
714 #if CONFIG_TESTSRC2_FILTER
716 static const AVOption testsrc2_options[] = {
726 uint8_t rgba[4] = { (argb >> 16) & 0xFF,
729 (argb >> 24) & 0xFF, };
733 static uint32_t color_gradient(
unsigned index)
735 unsigned si =
index & 0xFF, sd = 0xFF - si;
736 switch (
index >> 8) {
737 case 0:
return 0xFF0000 + (si << 8);
738 case 1:
return 0x00FF00 + (sd << 16);
739 case 2:
return 0x00FF00 + (si << 0);
740 case 3:
return 0x0000FF + (sd << 8);
741 case 4:
return 0x0000FF + (si << 16);
742 case 5:
return 0xFF0000 + (sd << 0);
748 int x0,
int y0,
const uint8_t *text)
752 for (; *text; text++) {
769 unsigned alpha = (uint32_t)
s->alpha << 24;
773 unsigned i, x = 0, x2;
779 set_color(
s, &
color, ((
i & 1) ? 0xFF0000 : 0) |
780 ((
i & 2) ? 0x00FF00 : 0) |
781 ((
i & 4) ? 0x0000FF : 0) |
792 unsigned x, dx, y0, y, g0,
g;
797 for (x = 0; x <
s->w; x += dx) {
801 y %= 2 * (
s->h - 16);
803 y = 2 * (
s->h - 16) - y;
811 if (
s->w >= 64 &&
s->h >= 64) {
812 int l = (
FFMIN(
s->w,
s->h) - 32) >> 1;
814 int xc = (
s->w >> 2) + (
s->w >> 1);
815 int yc = (
s->h >> 2);
820 for (
c = 0;
c < 3;
c++) {
821 set_color(
s, &
color, (0xBBBBBB ^ (0xFF << (
c << 3))) |
alpha);
825 pos < 3 * l ? 3 * l -
pos : 0;
826 yh =
pos < 1 * l ? 0 :
844 if (
s->w >= 64 &&
s->h >= 64) {
845 int l = (
FFMIN(
s->w,
s->h) - 16) >> 2;
847 int xc = (
s->w >> 2);
848 int yc = (
s->h >> 2) + (
s->h >> 1);
861 set_color(
s, &
color, 0xFF808080);
868 x1, ym1, x2 - x1, ym2 - ym1);
871 xm1, y1, xm2 - xm1, y2 - y1);
874 x1, y1, x2 - x1, y2 - y1);
887 for (y = ymin; y + 15 < ymax; y += 16) {
888 for (x = xmin; x + 15 < xmax; x += 16) {
891 for (
i = 0;
i < 256;
i++) {
892 r =
r * 1664525 + 1013904223;
895 set_color(
s, &
color, 0xFF00FF80);
898 alpha, 16, 16, 16, 3, 0, x, y);
904 if (
s->w >= 16 &&
s->h >= 16) {
905 unsigned w =
s->w - 8;
906 unsigned h =
s->h - 8;
915 set_color(
s, &
color, 0xFF8000FF);
926 set_color(
s, &
color, 0xC0000000);
930 set_color(
s, &
color, 0xFFFF8000);
931 snprintf(buf,
sizeof(buf),
"%02d:%02d:%02d.%03d\n%12"PRIi64,
932 time / 3600000, (time / 60000) % 60, (time / 1000) % 60,
933 time % 1000,
s->pts);
941 s->fill_picture_fn = test2_fill_picture;
963 static const AVFilterPad avfilter_vsrc_testsrc2_outputs[] = {
967 .config_props = test2_config_props,
975 .priv_class = &testsrc2_class,
986 #if CONFIG_RGBTESTSRC_FILTER
988 static const AVOption rgbtestsrc_options[] = {
1002 static void rgbtest_put_pixel(uint8_t *dstp[4],
int dst_linesizep[4],
1004 uint8_t rgba_map[4])
1006 uint8_t *dst = dstp[0];
1007 ptrdiff_t dst_linesize = dst_linesizep[0];
1013 case AV_PIX_FMT_BGR444: ((uint16_t*)(dst + y*dst_linesize))[x] = ((
r >> 4) << 8) | ((
g >> 4) << 4) | (
b >> 4);
break;
1014 case AV_PIX_FMT_RGB444: ((uint16_t*)(dst + y*dst_linesize))[x] = ((
b >> 4) << 8) | ((
g >> 4) << 4) | (
r >> 4);
break;
1015 case AV_PIX_FMT_BGR555: ((uint16_t*)(dst + y*dst_linesize))[x] = ((
r>>3)<<10) | ((
g>>3)<<5) | (
b>>3);
break;
1016 case AV_PIX_FMT_RGB555: ((uint16_t*)(dst + y*dst_linesize))[x] = ((
b>>3)<<10) | ((
g>>3)<<5) | (
r>>3);
break;
1017 case AV_PIX_FMT_BGR565: ((uint16_t*)(dst + y*dst_linesize))[x] = ((
r>>3)<<11) | ((
g>>2)<<5) | (
b>>3);
break;
1018 case AV_PIX_FMT_RGB565: ((uint16_t*)(dst + y*dst_linesize))[x] = ((
b>>3)<<11) | ((
g>>2)<<5) | (
r>>3);
break;
1021 v = (
r << (rgba_map[
R]*8)) + (
g << (rgba_map[
G]*8)) + (
b << (rgba_map[
B]*8));
1022 p = dst + 3*x + y*dst_linesize;
1029 v = (
r << (rgba_map[
R]*8)) + (
g << (rgba_map[
G]*8)) + (
b << (rgba_map[
B]*8)) + (255
U << (rgba_map[
A]*8));
1030 p = dst + 4*x + y*dst_linesize;
1034 p = dstp[0] + x + y * dst_linesize;
1036 p = dstp[1] + x + y * dst_linesizep[1];
1038 p = dstp[2] + x + y * dst_linesizep[2];
1046 p16 = (uint16_t *)(dstp[0] + x*2 + y * dst_linesizep[0]);
1048 p16 = (uint16_t *)(dstp[1] + x*2 + y * dst_linesizep[1]);
1050 p16 = (uint16_t *)(dstp[2] + x*2 + y * dst_linesizep[2]);
1061 for (y = 0; y <
h; y++) {
1062 for (x = 0; x <
w; x++) {
1064 int r = 0,
g = 0,
b = 0;
1066 if (6*y <
h )
r =
c;
1067 else if (6*y < 2*
h)
g =
c,
b =
c;
1068 else if (6*y < 3*
h)
g =
c;
1069 else if (6*y < 4*
h)
r =
c,
b =
c;
1070 else if (6*y < 5*
h)
b =
c;
1074 ctx->outputs[0]->format,
test->rgba_map);
1084 for (y = 0; y <
h; y++) {
1085 for (x = 0; x <
w; x++) {
1087 int r = 0,
g = 0,
b = 0;
1089 if (3*y <
h )
r =
c;
1090 else if (3*y < 2*
h)
g =
c;
1094 ctx->outputs[0]->format,
test->rgba_map);
1103 test->draw_once = 1;
1104 test->fill_picture_fn =
test->complement ? rgbtest_fill_picture_complement : rgbtest_fill_picture;
1129 static const AVFilterPad avfilter_vsrc_rgbtestsrc_outputs[] = {
1133 .config_props = rgbtest_config_props,
1138 .
name =
"rgbtestsrc",
1141 .priv_class = &rgbtestsrc_class,
1142 .
init = rgbtest_init,
1152 #if CONFIG_YUVTESTSRC_FILTER
1159 const int mid = 1 << (
desc->comp[0].depth - 1);
1167 for (y = 0; y <
h; y++) {
1168 for (x = 0; x <
w; x++) {
1182 for (; y <
h; y++) {
1183 for (x = 0; x <
w; x++) {
1197 for (x = 0; x <
w; x++) {
1216 const int mid = 1 << (
desc->comp[0].depth - 1);
1217 uint16_t *ydst = (uint16_t *)
frame->
data[0];
1218 uint16_t *udst = (uint16_t *)
frame->
data[1];
1219 uint16_t *vdst = (uint16_t *)
frame->
data[2];
1224 for (y = 0; y <
h; y++) {
1225 for (x = 0; x <
w; x++) {
1239 for (; y <
h; y++) {
1240 for (x = 0; x <
w; x++) {
1254 for (x = 0; x <
w; x++) {
1272 test->draw_once = 1;
1289 test->fill_picture_fn =
desc->comp[0].depth > 8 ? yuvtest_fill_picture16 : yuvtest_fill_picture8;
1293 static const AVFilterPad avfilter_vsrc_yuvtestsrc_outputs[] = {
1297 .config_props = yuvtest_config_props,
1302 .
name =
"yuvtestsrc",
1305 .priv_class = &nullsrc_yuvtestsrc_class,
1306 .
init = yuvtest_init,
1316 #if CONFIG_PAL75BARS_FILTER || CONFIG_PAL100BARS_FILTER || CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER
1318 static const uint8_t rainbow[7][4] = {
1319 { 180, 128, 128, 255 },
1320 { 162, 44, 142, 255 },
1321 { 131, 156, 44, 255 },
1322 { 112, 72, 58, 255 },
1323 { 84, 184, 198, 255 },
1324 { 65, 100, 212, 255 },
1325 { 35, 212, 114, 255 },
1328 static const uint8_t rainbow100[7][4] = {
1329 { 235, 128, 128, 255 },
1330 { 210, 16, 146, 255 },
1331 { 170, 166, 16, 255 },
1332 { 145, 54, 34, 255 },
1333 { 106, 202, 222, 255 },
1334 { 81, 90, 240, 255 },
1335 { 41, 240, 110, 255 },
1338 static const uint8_t rainbowhd[7][4] = {
1339 { 180, 128, 128, 255 },
1340 { 168, 44, 136, 255 },
1341 { 145, 147, 44, 255 },
1342 { 133, 63, 52, 255 },
1343 { 63, 193, 204, 255 },
1344 { 51, 109, 212, 255 },
1345 { 28, 212, 120, 255 },
1348 static const uint8_t wobnair[7][4] = {
1349 { 35, 212, 114, 255 },
1350 { 19, 128, 128, 255 },
1351 { 84, 184, 198, 255 },
1352 { 19, 128, 128, 255 },
1353 { 131, 156, 44, 255 },
1354 { 19, 128, 128, 255 },
1355 { 180, 128, 128, 255 },
1358 static const uint8_t white[4] = { 235, 128, 128, 255 };
1361 static const uint8_t neg4ire[4] = { 7, 128, 128, 255 };
1362 static const uint8_t pos4ire[4] = { 24, 128, 128, 255 };
1365 static const uint8_t i_pixel[4] = { 57, 156, 97, 255 };
1366 static const uint8_t q_pixel[4] = { 44, 171, 147, 255 };
1368 static const uint8_t gray40[4] = { 104, 128, 128, 255 };
1369 static const uint8_t gray15[4] = { 49, 128, 128, 255 };
1370 static const uint8_t cyan[4] = { 188, 154, 16, 255 };
1371 static const uint8_t yellow[4] = { 219, 16, 138, 255 };
1372 static const uint8_t blue[4] = { 32, 240, 118, 255 };
1373 static const uint8_t red[4] = { 63, 102, 240, 255 };
1374 static const uint8_t black0[4] = { 16, 128, 128, 255 };
1375 static const uint8_t black2[4] = { 20, 128, 128, 255 };
1376 static const uint8_t black4[4] = { 25, 128, 128, 255 };
1377 static const uint8_t neg2[4] = { 12, 128, 128, 255 };
1380 int x,
int y,
int w,
int h,
1395 for (plane = 0;
frame->
data[plane]; plane++) {
1396 const int c =
color[plane];
1398 int i, px, py, pw,
ph;
1400 if (plane == 1 || plane == 2) {
1401 px = x >>
desc->log2_chroma_w;
1403 py = y >>
desc->log2_chroma_h;
1412 p0 = p =
frame->
data[plane] + py * linesize + px;
1415 for (
i = 1;
i <
ph;
i++, p += linesize)
1437 #if CONFIG_PAL75BARS_FILTER
1452 for (
i = 1;
i < 7;
i++) {
1463 test->fill_picture_fn = pal75bars_fill_picture;
1464 test->draw_once = 1;
1469 .
name =
"pal75bars",
1471 .priv_class = &palbars_class,
1473 .
init = pal75bars_init,
1483 #if CONFIG_PAL100BARS_FILTER
1496 for (
i = 0;
i < 7;
i++) {
1507 test->fill_picture_fn = pal100bars_fill_picture;
1508 test->draw_once = 1;
1513 .
name =
"pal100bars",
1515 .priv_class = &palbars_class,
1517 .
init = pal100bars_init,
1529 #if CONFIG_SMPTEBARS_FILTER
1534 int r_w, r_h, w_h, p_w, p_h,
i,
tmp, x = 0;
1543 p_h =
test->h - w_h - r_h;
1545 for (
i = 0;
i < 7;
i++) {
1551 draw_bar(
test, i_pixel, x, r_h + w_h, p_w, p_h, picref);
1555 draw_bar(
test, q_pixel, x, r_h + w_h, p_w, p_h, picref);
1574 test->fill_picture_fn = smptebars_fill_picture;
1575 test->draw_once = 1;
1580 .
name =
"smptebars",
1583 .priv_class = &smptebars_class,
1584 .
init = smptebars_init,
1594 #if CONFIG_SMPTEHDBARS_FILTER
1599 int d_w, r_w, r_h, l_w,
i,
tmp, x = 0, y = 0;
1610 for (
i = 0;
i < 7;
i++) {
1633 uint8_t yramp[4] = {0};
1635 yramp[0] =
i * 255 /
tmp;
1677 test->fill_picture_fn = smptehdbars_fill_picture;
1678 test->draw_once = 1;
1683 .
name =
"smptehdbars",
1685 .priv_class = &smptebars_class,
1687 .
init = smptehdbars_init,
1701 #if CONFIG_ALLYUV_FILTER
1710 for (y = 0; y < 4096; y++) {
1711 for (x = 0; x < 2048; x++) {
1712 frame->
data[0][y * ys + x] = ((x / 8) % 256);
1713 frame->
data[0][y * ys + 4095 - x] = ((x / 8) % 256);
1716 for (x = 0; x < 2048; x+=8) {
1717 for (j = 0; j < 8; j++) {
1718 frame->
data[1][vs * y + x + j] = (y%16 + (j % 8) * 16);
1719 frame->
data[1][vs * y + 4095 - x - j] = (128 + y%16 + (j % 8) * 16);
1723 for (x = 0; x < 4096; x++)
1733 test->draw_once = 1;
1734 test->fill_picture_fn = allyuv_fill_picture;
1738 static const AVFilterPad avfilter_vsrc_allyuv_outputs[] = {
1750 .priv_class = &allyuv_allrgb_class,
1751 .
init = allyuv_init,
1761 #if CONFIG_ALLRGB_FILTER
1769 for (y = 0; y < 4096; y++) {
1770 uint8_t *dst =
line;
1772 for (x = 0; x < 4096; x++) {
1775 *dst++ = (x >> 8) | ((y >> 8) << 4);
1786 test->draw_once = 1;
1787 test->fill_picture_fn = allrgb_fill_picture;
1799 static const AVFilterPad avfilter_vsrc_allrgb_outputs[] = {
1803 .config_props = allrgb_config_props,
1811 .priv_class = &allyuv_allrgb_class,
1812 .
init = allrgb_init,
1822 #if CONFIG_COLORSPECTRUM_FILTER
1824 static const AVOption colorspectrum_options[] = {
1835 static inline float mix(
float a,
float b,
float mix)
1840 static void hsb2rgb(
const float *
c,
float *
rgb)
1861 const float yh = y /
h;
1863 c[1] =
test->type == 2 ? yh > 0.5f ? 2.f * (yh - 0.5f) : 1.
f - 2.
f * yh :
test->type == 1 ? 1.f - yh : yh;
1865 c[3] =
test->type == 1 ? 1.f :
test->type == 2 ? (yh > 0.5f ? 0.f : 1.f): 0.f;
1883 test->draw_once = 1;
1884 test->fill_picture_fn = colorspectrum_fill_picture;
1888 static const AVFilterPad avfilter_vsrc_colorspectrum_outputs[] = {
1897 .
name =
"colorspectrum",
1900 .priv_class = &colorspectrum_class,
1901 .
init = colorspectrum_init,
1911 #if CONFIG_COLORCHART_FILTER
1913 static const AVOption colorchart_options[] = {
1924 static const uint8_t reference_colors[][3] = {
1954 static const uint8_t skintones_colors[][3] = {
1984 typedef struct ColorChartPreset {
1986 const uint8_t (*colors)[3];
1989 static const ColorChartPreset colorchart_presets[] = {
1990 { 6, 4, reference_colors, },
1991 { 6, 4, skintones_colors, },
2009 const int w = colorchart_presets[
preset].w;
2010 const int h = colorchart_presets[
preset].h;
2011 const int pw =
test->pw;
2014 for (
int y = 0; y <
h; y++) {
2015 for (
int x = 0; x <
w; x++) {
2016 uint32_t pc =
AV_RB24(colorchart_presets[
preset].colors[y *
w + x]);
2021 x * pw, y *
ph, pw,
ph);
2030 const int w = colorchart_presets[
preset].w;
2031 const int h = colorchart_presets[
preset].h;
2035 test->draw_once = 1;
2036 test->fill_picture_fn = colorchart_fill_picture;
2040 static const AVFilterPad avfilter_vsrc_colorchart_outputs[] = {
2044 .config_props = colorchart_config_props,
2049 .
name =
"colorchart",
2052 .priv_class = &colorchart_class,
2053 .
init = colorchart_init,
2063 #if CONFIG_ZONEPLATE_FILTER
2065 static const AVOption zoneplate_options[] = {
2088 #define ZONEPLATE_SLICE(name, type) \
2089 static int zoneplate_fill_slice_##name(AVFilterContext *ctx, \
2090 void *arg, int job, \
2093 TestSourceContext *test = ctx->priv; \
2094 AVFrame *frame = arg; \
2095 const int w = frame->width; \
2096 const int h = frame->height; \
2097 const int kxt = test->kxt, kyt = test->kyt, kx2 = test->kx2; \
2098 const int t = test->pts + test->to, k0 = test->k0; \
2099 const int kt = test->kt, kt2 = test->kt2, ky2 = test->ky2; \
2100 const int ky = test->ky, kx = test->kx, kxy = test->kxy; \
2101 const int lut_mask = (1 << test->lut_precision) - 1; \
2102 const int nkt2t = kt2 * t * t, nktt = kt * t; \
2103 const int start = (h * job ) / nb_jobs; \
2104 const int end = (h * (job+1)) / nb_jobs; \
2105 const ptrdiff_t ylinesize = frame->linesize[0] / sizeof(type); \
2106 const ptrdiff_t ulinesize = frame->linesize[1] / sizeof(type); \
2107 const ptrdiff_t vlinesize = frame->linesize[2] / sizeof(type); \
2108 const int xreset = -(w / 2) - test->xo; \
2109 const int yreset = -(h / 2) - test->yo + start; \
2110 const int kU = test->kU, kV = test->kV; \
2111 const int skxy = 0xffff / (w / 2); \
2112 const int skx2 = 0xffff / w; \
2113 const int dkxt = kxt * t; \
2114 type *ydst = ((type *)frame->data[0]) + start * ylinesize; \
2115 type *udst = ((type *)frame->data[1]) + start * ulinesize; \
2116 type *vdst = ((type *)frame->data[2]) + start * vlinesize; \
2117 const type *lut = (const type *)test->lut; \
2118 int akx, akxt, aky, akyt; \
2121 akyt = start * kyt * t; \
2123 for (int j = start, y = yreset; j < end; j++, y++) { \
2124 const int dkxy = kxy * y * skxy; \
2125 const int nky2kt2 = (ky2 * y * y) / h + (nkt2t >> 1); \
2126 int akxy = dkxy * xreset; \
2133 for (int i = 0, x = xreset; i < w; i++, x++) { \
2134 int phase = k0, uphase = kU, vphase = kV; \
2137 phase += akx + aky + nktt; \
2141 phase += akxt + akyt; \
2142 phase += akxy >> 16; \
2143 phase += ((kx2 * x * x * skx2) >> 16) + nky2kt2; \
2147 ydst[i] = lut[phase & lut_mask]; \
2148 udst[i] = lut[uphase & lut_mask]; \
2149 vdst[i] = lut[vphase & lut_mask]; \
2152 ydst += ylinesize; \
2153 udst += ulinesize; \
2154 vdst += vlinesize; \
2160 ZONEPLATE_SLICE( 8, uint8_t)
2161 ZONEPLATE_SLICE( 9, uint16_t)
2162 ZONEPLATE_SLICE(10, uint16_t)
2163 ZONEPLATE_SLICE(12, uint16_t)
2164 ZONEPLATE_SLICE(14, uint16_t)
2165 ZONEPLATE_SLICE(16, uint16_t)
2175 static int zoneplate_config_props(
AVFilterLink *outlink)
2180 const int lut_size = 1 <<
test->lut_precision;
2181 const int depth =
desc->comp[0].depth;
2193 lut16 = (uint16_t *)
test->lut;
2196 for (
int i = 0;
i < lut_size;
i++)
2200 for (
int i = 0;
i < lut_size;
i++)
2201 lut16[
i] =
lrintf(((1 << depth) - 1) * (0.5f + 0.5f *
sinf((2.
f *
M_PI *
i) / lut_size)));
2205 test->draw_once = 0;
2206 test->fill_picture_fn = zoneplate_fill_picture;
2209 case 8:
test->fill_slice_fn = zoneplate_fill_slice_8;
break;
2210 case 9:
test->fill_slice_fn = zoneplate_fill_slice_9;
break;
2211 case 10:
test->fill_slice_fn = zoneplate_fill_slice_10;
break;
2212 case 12:
test->fill_slice_fn = zoneplate_fill_slice_12;
break;
2213 case 14:
test->fill_slice_fn = zoneplate_fill_slice_14;
break;
2214 case 16:
test->fill_slice_fn = zoneplate_fill_slice_16;
break;
2226 static const AVFilterPad avfilter_vsrc_zoneplate_outputs[] = {
2230 .config_props = zoneplate_config_props,
2235 .
name =
"zoneplate",
2238 .priv_class = &zoneplate_class,