FFmpeg
vsrc_testsrc.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2007 Nicolas George <nicolas.george@normalesup.org>
3  * Copyright (c) 2011 Stefano Sabatini
4  * Copyright (c) 2012 Paul B Mahol
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * Misc test sources.
26  *
27  * testsrc is based on the test pattern generator demuxer by Nicolas George:
28  * http://lists.ffmpeg.org/pipermail/ffmpeg-devel/2007-October/037845.html
29  *
30  * rgbtestsrc is ported from MPlayer libmpcodecs/vf_rgbtest.c by
31  * Michael Niedermayer.
32  *
33  * allyuv, smptebars and smptehdbars are by Paul B Mahol.
34  */
35 
36 #include "config_components.h"
37 
38 #include "libavutil/avassert.h"
39 #include "libavutil/common.h"
40 #include "libavutil/ffmath.h"
41 #include "libavutil/mem.h"
42 #include "libavutil/opt.h"
43 #include "libavutil/imgutils.h"
44 #include "libavutil/intreadwrite.h"
46 #include "avfilter.h"
47 #include "drawutils.h"
48 #include "filters.h"
49 #include "filters.h"
50 #include "formats.h"
51 #include "video.h"
52 
53 typedef struct TestSourceContext {
54  const AVClass *class;
55  int w, h;
56  int pw, ph;
57  unsigned int nb_frame;
60  int64_t duration; ///< duration expressed in microseconds
61  AVRational sar; ///< sample aspect ratio
62  int draw_once; ///< draw only the first frame, always put out the same picture
63  int draw_once_reset; ///< draw only the first frame or in case of reset
64  AVFrame *picref; ///< cached reference containing the painted picture
65 
67 
68  /* only used by testsrc */
70 
71  /* only used by testsrc2 */
72  int alpha;
73 
74  /* only used by yuvtest */
75  uint8_t ayuv_map[4];
76 
77  /* only used by colorspectrum */
78  int type;
79 
80  /* only used by color */
83  uint8_t color_rgba[4];
84 
85  /* only used by rgbtest */
86  uint8_t rgba_map[4];
88  int depth;
89 
90  /* only used by haldclut */
91  int level;
92 
93  /* only used by zoneplate */
94  int k0, kx, ky, kt;
95  int kxt, kyt, kxy;
96  int kx2, ky2, kt2;
97  int xo, yo, to, kU, kV;
99  uint8_t *lut;
100  int (*fill_slice_fn)(AVFilterContext *ctx, void *arg, int job, int nb_jobs);
102 
103 #define OFFSET(x) offsetof(TestSourceContext, x)
104 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
105 #define FLAGSR AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
106 
107 #define SIZE_OPTIONS \
108  { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "320x240"}, 0, 0, FLAGS },\
109  { "s", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "320x240"}, 0, 0, FLAGS },\
110 
111 #define COMMON_OPTIONS_NOSIZE \
112  { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },\
113  { "r", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },\
114  { "duration", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },\
115  { "d", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },\
116  { "sar", "set video sample aspect ratio", OFFSET(sar), AV_OPT_TYPE_RATIONAL, {.dbl= 1}, 0, INT_MAX, FLAGS },
117 
118 #define COMMON_OPTIONS SIZE_OPTIONS COMMON_OPTIONS_NOSIZE
119 
120 #define NOSIZE_OPTIONS_OFFSET 2
121 /* Filters using COMMON_OPTIONS_NOSIZE also use the following options
122  * via &options[NOSIZE_OPTIONS_OFFSET]. So don't break it. */
123 static const AVOption options[] = {
125  { NULL }
126 };
127 
129 {
130  TestSourceContext *test = ctx->priv;
131 
132  test->time_base = av_inv_q(test->frame_rate);
133  test->nb_frame = 0;
134  test->pts = 0;
135 
136  av_log(ctx, AV_LOG_VERBOSE, "size:%dx%d rate:%d/%d duration:%f sar:%d/%d\n",
137  test->w, test->h, test->frame_rate.num, test->frame_rate.den,
138  test->duration < 0 ? -1 : (double)test->duration/1000000,
139  test->sar.num, test->sar.den);
140  return 0;
141 }
142 
144 {
145  TestSourceContext *test = ctx->priv;
146 
147  av_frame_free(&test->picref);
148  av_freep(&test->lut);
149 }
150 
151 static int config_props(AVFilterLink *outlink)
152 {
153  TestSourceContext *test = outlink->src->priv;
154  FilterLink *l = ff_filter_link(outlink);
155 
156  outlink->w = test->w;
157  outlink->h = test->h;
158  outlink->sample_aspect_ratio = test->sar;
159  l->frame_rate = test->frame_rate;
160  outlink->time_base = test->time_base;
161 
162  return 0;
163 }
164 
165 static const AVFilterPad outputs[] = {
166  {
167  .name = "default",
168  .type = AVMEDIA_TYPE_VIDEO,
169  .config_props = config_props,
170  },
171 };
172 
174 {
175  AVFilterLink *outlink = ctx->outputs[0];
176  TestSourceContext *test = ctx->priv;
177  AVFrame *frame;
178 
179  if (!ff_outlink_frame_wanted(outlink))
180  return FFERROR_NOT_READY;
181  if (test->duration >= 0 &&
182  av_rescale_q(test->pts, test->time_base, AV_TIME_BASE_Q) >= test->duration) {
183  ff_outlink_set_status(outlink, AVERROR_EOF, test->pts);
184  return 0;
185  }
186 
187  if (test->draw_once) {
188  if (test->draw_once_reset) {
189  av_frame_free(&test->picref);
190  test->draw_once_reset = 0;
191  }
192  if (!test->picref) {
193  test->picref =
194  ff_get_video_buffer(outlink, test->w, test->h);
195  if (!test->picref)
196  return AVERROR(ENOMEM);
197  test->fill_picture_fn(outlink->src, test->picref);
198  }
199  frame = av_frame_clone(test->picref);
200  } else
201  frame = ff_get_video_buffer(outlink, test->w, test->h);
202 
203  if (!frame)
204  return AVERROR(ENOMEM);
205  frame->pts = test->pts;
206  frame->duration = 1;
207  frame->flags |= AV_FRAME_FLAG_KEY;
208  frame->flags &= ~AV_FRAME_FLAG_INTERLACED;
209  frame->pict_type = AV_PICTURE_TYPE_I;
210  frame->sample_aspect_ratio = test->sar;
211  if (!test->draw_once)
212  test->fill_picture_fn(outlink->src, frame);
213 
214  test->pts++;
215  test->nb_frame++;
216 
217  return ff_filter_frame(outlink, frame);
218 }
219 
220 #if CONFIG_COLOR_FILTER
221 
222 static const AVOption color_options[] = {
223  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGSR },
224  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGSR },
226  { NULL }
227 };
228 
230 
231 static void color_fill_picture(AVFilterContext *ctx, AVFrame *picref)
232 {
233  TestSourceContext *test = ctx->priv;
234  ff_fill_rectangle(&test->draw, &test->color,
235  picref->data, picref->linesize,
236  0, 0, test->w, test->h);
237 }
238 
239 static av_cold int color_init(AVFilterContext *ctx)
240 {
241  TestSourceContext *test = ctx->priv;
242  test->fill_picture_fn = color_fill_picture;
243  test->draw_once = 1;
244  return init(ctx);
245 }
246 
247 static int color_query_formats(const AVFilterContext *ctx,
248  AVFilterFormatsConfig **cfg_in,
249  AVFilterFormatsConfig **cfg_out)
250 {
251  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_draw_supported_pixel_formats(0));
252 }
253 
254 static int color_config_props(AVFilterLink *inlink)
255 {
256  AVFilterContext *ctx = inlink->src;
257  TestSourceContext *test = ctx->priv;
258  int ret;
259 
260  ret = ff_draw_init_from_link(&test->draw, inlink, 0);
261  if (ret < 0) {
262  av_log(ctx, AV_LOG_ERROR, "Failed to initialize FFDrawContext\n");
263  return ret;
264  }
265 
266  ff_draw_color(&test->draw, &test->color, test->color_rgba);
267 
268  if (av_image_check_size(test->w, test->h, 0, ctx) < 0)
269  return AVERROR(EINVAL);
270 
271  if ((ret = config_props(inlink)) < 0)
272  return ret;
273 
274  return 0;
275 }
276 
277 static int color_process_command(AVFilterContext *ctx, const char *cmd, const char *args,
278  char *res, int res_len, int flags)
279 {
280  TestSourceContext *test = ctx->priv;
281  int ret;
282 
283  ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
284  if (ret < 0)
285  return ret;
286 
287  ff_draw_color(&test->draw, &test->color, test->color_rgba);
288  test->draw_once_reset = 1;
289  return 0;
290 }
291 
292 static const AVFilterPad color_outputs[] = {
293  {
294  .name = "default",
295  .type = AVMEDIA_TYPE_VIDEO,
296  .config_props = color_config_props,
297  },
298 };
299 
300 const FFFilter ff_vsrc_color = {
301  .p.name = "color",
302  .p.description = NULL_IF_CONFIG_SMALL("Provide an uniformly colored input."),
303  .p.priv_class = &color_class,
304  .priv_size = sizeof(TestSourceContext),
305  .init = color_init,
306  .uninit = uninit,
307  .activate = activate,
308  FILTER_OUTPUTS(color_outputs),
309  FILTER_QUERY_FUNC2(color_query_formats),
310  .process_command = color_process_command,
311 };
312 
313 #endif /* CONFIG_COLOR_FILTER */
314 
315 #if CONFIG_HALDCLUTSRC_FILTER
316 
317 static const AVOption haldclutsrc_options[] = {
318  { "level", "set level", OFFSET(level), AV_OPT_TYPE_INT, {.i64 = 6}, 2, 16, FLAGS },
320  { NULL }
321 };
322 
323 AVFILTER_DEFINE_CLASS(haldclutsrc);
324 
325 static void haldclutsrc_fill_picture(AVFilterContext *ctx, AVFrame *frame)
326 {
327  int i, j, k, x = 0, y = 0, is16bit = 0, step;
328  uint32_t alpha = 0;
329  const TestSourceContext *hc = ctx->priv;
330  int level = hc->level;
331  float scale;
332  const int w = frame->width;
333  const int h = frame->height;
334  uint8_t *data = frame->data[0];
335  const ptrdiff_t linesize = frame->linesize[0];
337  const int depth = desc->comp[0].depth;
338  const int planar = desc->flags & AV_PIX_FMT_FLAG_PLANAR;
339  const int planes = av_pix_fmt_count_planes(frame->format);
340  uint8_t rgba_map[4];
341 
342  av_assert0(w == h && w == level*level*level);
343 
344  ff_fill_rgba_map(rgba_map, frame->format);
345 
346  alpha = (1 << depth) - 1;
347  is16bit = depth > 8;
348 
349  step = av_get_padded_bits_per_pixel(desc) >> (3 + is16bit);
350  scale = ((float)alpha) / (level*level - 1);
351 
352 #define LOAD_CLUT(nbits) do { \
353  uint##nbits##_t *dst = ((uint##nbits##_t *)(data + y*linesize)) + x*step; \
354  dst[rgba_map[0]] = av_clip_uint##nbits(i * scale); \
355  dst[rgba_map[1]] = av_clip_uint##nbits(j * scale); \
356  dst[rgba_map[2]] = av_clip_uint##nbits(k * scale); \
357  if (step == 4) \
358  dst[rgba_map[3]] = alpha; \
359 } while (0)
360 
361 #define LOAD_CLUT_PLANAR(type, nbits) do { \
362  type *dst = ((type *)(frame->data[2] + y*frame->linesize[2])) + x; \
363  dst[0] = av_clip_uintp2(i * scale, nbits); \
364  dst = ((type *)(frame->data[0] + y*frame->linesize[0])) + x; \
365  dst[0] = av_clip_uintp2(j * scale, nbits); \
366  dst = ((type *)(frame->data[1] + y*frame->linesize[1])) + x; \
367  dst[0] = av_clip_uintp2(k * scale, nbits); \
368  if (planes == 4) { \
369  dst = ((type *)(frame->data[3] + y*linesize)) + x; \
370  dst[0] = alpha; \
371  } \
372 } while (0)
373 
374  level *= level;
375  for (k = 0; k < level; k++) {
376  for (j = 0; j < level; j++) {
377  for (i = 0; i < level; i++) {
378  if (!planar) {
379  if (!is16bit)
380  LOAD_CLUT(8);
381  else
382  LOAD_CLUT(16);
383  } else {
384  switch (depth) {
385  case 8: LOAD_CLUT_PLANAR(uint8_t, 8); break;
386  case 9: LOAD_CLUT_PLANAR(uint16_t, 9); break;
387  case 10: LOAD_CLUT_PLANAR(uint16_t,10); break;
388  case 12: LOAD_CLUT_PLANAR(uint16_t,12); break;
389  case 14: LOAD_CLUT_PLANAR(uint16_t,14); break;
390  case 16: LOAD_CLUT_PLANAR(uint16_t,16); break;
391  }
392  }
393  if (++x == w) {
394  x = 0;
395  y++;
396  }
397  }
398  }
399  }
400 }
401 
402 static av_cold int haldclutsrc_init(AVFilterContext *ctx)
403 {
404  TestSourceContext *hc = ctx->priv;
405  hc->fill_picture_fn = haldclutsrc_fill_picture;
406  hc->draw_once = 1;
407  return init(ctx);
408 }
409 
410 static const enum AVPixelFormat haldclutsrc_pix_fmts[] = {
425 };
426 
427 static int haldclutsrc_config_props(AVFilterLink *outlink)
428 {
429  AVFilterContext *ctx = outlink->src;
430  TestSourceContext *hc = ctx->priv;
431 
432  hc->w = hc->h = hc->level * hc->level * hc->level;
433  return config_props(outlink);
434 }
435 
436 static const AVFilterPad haldclutsrc_outputs[] = {
437  {
438  .name = "default",
439  .type = AVMEDIA_TYPE_VIDEO,
440  .config_props = haldclutsrc_config_props,
441  },
442 };
443 
445  .p.name = "haldclutsrc",
446  .p.description = NULL_IF_CONFIG_SMALL("Provide an identity Hald CLUT."),
447  .p.priv_class = &haldclutsrc_class,
448  .priv_size = sizeof(TestSourceContext),
449  .init = haldclutsrc_init,
450  .uninit = uninit,
451  .activate = activate,
452  FILTER_OUTPUTS(haldclutsrc_outputs),
453  FILTER_PIXFMTS_ARRAY(haldclutsrc_pix_fmts),
454 };
455 #endif /* CONFIG_HALDCLUTSRC_FILTER */
456 
457 AVFILTER_DEFINE_CLASS_EXT(nullsrc_yuvtestsrc, "nullsrc/yuvtestsrc", options);
458 
459 #if CONFIG_NULLSRC_FILTER
460 
461 static void nullsrc_fill_picture(AVFilterContext *ctx, AVFrame *picref) { }
462 
463 static av_cold int nullsrc_init(AVFilterContext *ctx)
464 {
465  TestSourceContext *test = ctx->priv;
466 
467  test->fill_picture_fn = nullsrc_fill_picture;
468  return init(ctx);
469 }
470 
471 const FFFilter ff_vsrc_nullsrc = {
472  .p.name = "nullsrc",
473  .p.description= NULL_IF_CONFIG_SMALL("Null video source, return unprocessed video frames."),
474  .p.priv_class= &nullsrc_yuvtestsrc_class,
475  .init = nullsrc_init,
476  .uninit = uninit,
477  .activate = activate,
478  .priv_size = sizeof(TestSourceContext),
480 };
481 
482 #endif /* CONFIG_NULLSRC_FILTER */
483 
484 #if CONFIG_TESTSRC_FILTER
485 
486 static const AVOption testsrc_options[] = {
488  { "decimals", "set number of decimals to show", OFFSET(nb_decimals), AV_OPT_TYPE_INT, {.i64=0}, 0, 17, FLAGS },
489  { "n", "set number of decimals to show", OFFSET(nb_decimals), AV_OPT_TYPE_INT, {.i64=0}, 0, 17, FLAGS },
490  { NULL }
491 };
492 
493 AVFILTER_DEFINE_CLASS(testsrc);
494 
495 /**
496  * Fill a rectangle with value val.
497  *
498  * @param val the RGB value to set
499  * @param dst pointer to the destination buffer to fill
500  * @param dst_linesize linesize of destination
501  * @param segment_width width of the segment
502  * @param x horizontal coordinate where to draw the rectangle in the destination buffer
503  * @param y horizontal coordinate where to draw the rectangle in the destination buffer
504  * @param w width of the rectangle to draw, expressed as a number of segment_width units
505  * @param h height of the rectangle to draw, expressed as a number of segment_width units
506  */
507 static void draw_rectangle(unsigned val, uint8_t *dst, ptrdiff_t dst_linesize, int segment_width,
508  int x, int y, int w, int h)
509 {
510  int i;
511  int step = 3;
512 
513  dst += segment_width * (step * x + y * dst_linesize);
514  w *= segment_width * step;
515  h *= segment_width;
516  for (i = 0; i < h; i++) {
517  memset(dst, val, w);
518  dst += dst_linesize;
519  }
520 }
521 
522 static void draw_digit(int digit, uint8_t *dst, ptrdiff_t dst_linesize,
523  int segment_width)
524 {
525 #define TOP_HBAR 1
526 #define MID_HBAR 2
527 #define BOT_HBAR 4
528 #define LEFT_TOP_VBAR 8
529 #define LEFT_BOT_VBAR 16
530 #define RIGHT_TOP_VBAR 32
531 #define RIGHT_BOT_VBAR 64
532  struct segments {
533  int x, y, w, h;
534  } segments[] = {
535  { 1, 0, 5, 1 }, /* TOP_HBAR */
536  { 1, 6, 5, 1 }, /* MID_HBAR */
537  { 1, 12, 5, 1 }, /* BOT_HBAR */
538  { 0, 1, 1, 5 }, /* LEFT_TOP_VBAR */
539  { 0, 7, 1, 5 }, /* LEFT_BOT_VBAR */
540  { 6, 1, 1, 5 }, /* RIGHT_TOP_VBAR */
541  { 6, 7, 1, 5 } /* RIGHT_BOT_VBAR */
542  };
543  static const unsigned char masks[10] = {
544  /* 0 */ TOP_HBAR |BOT_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR|RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
545  /* 1 */ RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
546  /* 2 */ TOP_HBAR|MID_HBAR|BOT_HBAR|LEFT_BOT_VBAR |RIGHT_TOP_VBAR,
547  /* 3 */ TOP_HBAR|MID_HBAR|BOT_HBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
548  /* 4 */ MID_HBAR |LEFT_TOP_VBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
549  /* 5 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR |RIGHT_BOT_VBAR,
550  /* 6 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR |RIGHT_BOT_VBAR,
551  /* 7 */ TOP_HBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
552  /* 8 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR|RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
553  /* 9 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
554  };
555  unsigned mask = masks[digit];
556  int i;
557 
558  draw_rectangle(0, dst, dst_linesize, segment_width, 0, 0, 8, 13);
559  for (i = 0; i < FF_ARRAY_ELEMS(segments); i++)
560  if (mask & (1<<i))
561  draw_rectangle(255, dst, dst_linesize, segment_width,
562  segments[i].x, segments[i].y, segments[i].w, segments[i].h);
563 }
564 
565 #define GRADIENT_SIZE (6 * 256)
566 
567 static void test_fill_picture(AVFilterContext *ctx, AVFrame *frame)
568 {
569  TestSourceContext *test = ctx->priv;
570  uint8_t *p, *p0;
571  int x, y;
572  int color, color_rest;
573  int icolor;
574  int radius;
575  int quad0, quad;
576  int dquad_x, dquad_y;
577  int grad, dgrad, rgrad, drgrad;
578  int seg_size;
579  int second;
580  int i;
581  uint8_t *data = frame->data[0];
582  int width = frame->width;
583  int height = frame->height;
584 
585  /* draw colored bars and circle */
586  radius = (width + height) / 4;
587  quad0 = width * width / 4 + height * height / 4 - radius * radius;
588  dquad_y = 1 - height;
589  p0 = data;
590  for (y = 0; y < height; y++) {
591  p = p0;
592  color = 0;
593  color_rest = 0;
594  quad = quad0;
595  dquad_x = 1 - width;
596  for (x = 0; x < width; x++) {
597  icolor = color;
598  if (quad < 0)
599  icolor ^= 7;
600  quad += dquad_x;
601  dquad_x += 2;
602  *(p++) = icolor & 1 ? 255 : 0;
603  *(p++) = icolor & 2 ? 255 : 0;
604  *(p++) = icolor & 4 ? 255 : 0;
605  color_rest += 8;
606  if (color_rest >= width) {
607  color_rest -= width;
608  color++;
609  }
610  }
611  quad0 += dquad_y;
612  dquad_y += 2;
613  p0 += frame->linesize[0];
614  }
615 
616  /* draw sliding color line */
617  p0 = p = data + frame->linesize[0] * (height * 3/4);
618  grad = (256 * test->nb_frame * test->time_base.num / test->time_base.den) %
619  GRADIENT_SIZE;
620  rgrad = 0;
621  dgrad = GRADIENT_SIZE / width;
622  drgrad = GRADIENT_SIZE % width;
623  for (x = 0; x < width; x++) {
624  *(p++) =
625  grad < 256 || grad >= 5 * 256 ? 255 :
626  grad >= 2 * 256 && grad < 4 * 256 ? 0 :
627  grad < 2 * 256 ? 2 * 256 - 1 - grad : grad - 4 * 256;
628  *(p++) =
629  grad >= 4 * 256 ? 0 :
630  grad >= 1 * 256 && grad < 3 * 256 ? 255 :
631  grad < 1 * 256 ? grad : 4 * 256 - 1 - grad;
632  *(p++) =
633  grad < 2 * 256 ? 0 :
634  grad >= 3 * 256 && grad < 5 * 256 ? 255 :
635  grad < 3 * 256 ? grad - 2 * 256 : 6 * 256 - 1 - grad;
636  grad += dgrad;
637  rgrad += drgrad;
638  if (rgrad >= GRADIENT_SIZE) {
639  grad++;
640  rgrad -= GRADIENT_SIZE;
641  }
642  if (grad >= GRADIENT_SIZE)
643  grad -= GRADIENT_SIZE;
644  }
645  p = p0;
646  for (y = height / 8; y > 0; y--) {
647  memcpy(p+frame->linesize[0], p, 3 * width);
648  p += frame->linesize[0];
649  }
650 
651  /* draw digits */
652  seg_size = width / 80;
653  if (seg_size >= 1 && height >= 13 * seg_size) {
654  int64_t p10decimals = 1;
655  double time = av_q2d(test->time_base) * test->nb_frame *
656  ff_exp10(test->nb_decimals);
657  if (time >= INT_MAX)
658  return;
659 
660  for (x = 0; x < test->nb_decimals; x++)
661  p10decimals *= 10;
662 
663  second = av_rescale_rnd(test->nb_frame * test->time_base.num, p10decimals, test->time_base.den, AV_ROUND_ZERO);
664  x = width - (width - seg_size * 64) / 2;
665  y = (height - seg_size * 13) / 2;
666  p = data + (x*3 + y * frame->linesize[0]);
667  for (i = 0; i < 8; i++) {
668  p -= 3 * 8 * seg_size;
669  draw_digit(second % 10, p, frame->linesize[0], seg_size);
670  second /= 10;
671  if (second == 0)
672  break;
673  }
674  }
675 }
676 
677 static av_cold int test_init(AVFilterContext *ctx)
678 {
679  TestSourceContext *test = ctx->priv;
680 
681  test->fill_picture_fn = test_fill_picture;
682  return init(ctx);
683 }
684 
685 const FFFilter ff_vsrc_testsrc = {
686  .p.name = "testsrc",
687  .p.description = NULL_IF_CONFIG_SMALL("Generate test pattern."),
688  .p.priv_class = &testsrc_class,
689  .priv_size = sizeof(TestSourceContext),
690  .init = test_init,
691  .uninit = uninit,
692  .activate = activate,
695 };
696 
697 #endif /* CONFIG_TESTSRC_FILTER */
698 
699 av_unused static void set_color(TestSourceContext *s, FFDrawColor *color, uint32_t argb)
700 {
701  uint8_t rgba[4] = { (argb >> 16) & 0xFF,
702  (argb >> 8) & 0xFF,
703  (argb >> 0) & 0xFF,
704  (argb >> 24) & 0xFF, };
705  ff_draw_color(&s->draw, color, rgba);
706 }
707 
708 #if CONFIG_TESTSRC2_FILTER
709 
710 static const AVOption testsrc2_options[] = {
712  { "alpha", "set global alpha (opacity)", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 255}, 0, 255, FLAGS },
713  { NULL }
714 };
715 
716 AVFILTER_DEFINE_CLASS(testsrc2);
717 
718 static uint32_t color_gradient(unsigned index)
719 {
720  unsigned si = index & 0xFF, sd = 0xFF - si;
721  switch (index >> 8) {
722  case 0: return 0xFF0000 + (si << 8);
723  case 1: return 0x00FF00 + (sd << 16);
724  case 2: return 0x00FF00 + (si << 0);
725  case 3: return 0x0000FF + (sd << 8);
726  case 4: return 0x0000FF + (si << 16);
727  case 5: return 0xFF0000 + (sd << 0);
728  default: av_assert0(0); return 0;
729  }
730 }
731 
733  int x0, int y0, const uint8_t *text)
734 {
735  const uint8_t *vga16_font = avpriv_vga16_font_get();
736  int x = x0;
737 
738  for (; *text; text++) {
739  if (*text == '\n') {
740  x = x0;
741  y0 += 16;
742  continue;
743  }
744  ff_blend_mask(&s->draw, color, frame->data, frame->linesize,
745  frame->width, frame->height,
746  &vga16_font[*text * 16], 1, 8, 16, 0, 0, x, y0);
747  x += 8;
748  }
749 }
750 
751 static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
752 {
753  TestSourceContext *s = ctx->priv;
755  unsigned alpha = (uint32_t)s->alpha << 24;
756 
757  /* colored background */
758  {
759  unsigned i, x = 0, x2;
760 
761  x = 0;
762  for (i = 1; i < 7; i++) {
763  x2 = av_rescale(i, s->w, 6);
764  x2 = ff_draw_round_to_sub(&s->draw, 0, 0, x2);
765  set_color(s, &color, ((i & 1) ? 0xFF0000 : 0) |
766  ((i & 2) ? 0x00FF00 : 0) |
767  ((i & 4) ? 0x0000FF : 0) |
768  alpha);
769  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
770  x, 0, x2 - x, frame->height);
771  x = x2;
772  }
773  }
774 
775  /* oblique gradient */
776  /* note: too slow if using blending */
777  if (s->h >= 64) {
778  unsigned x, dx, y0, y, g0, g;
779 
780  dx = ff_draw_round_to_sub(&s->draw, 0, +1, 1);
781  y0 = av_rescale_q(s->pts, s->time_base, av_make_q(2, s->h - 16));
782  g0 = av_rescale_q(s->pts, s->time_base, av_make_q(1, 128));
783  for (x = 0; x < s->w; x += dx) {
784  g = (av_rescale(x, 6 * 256, s->w) + g0) % (6 * 256);
785  set_color(s, &color, color_gradient(g) | alpha);
786  y = y0 + av_rescale(x, s->h / 2, s->w);
787  y %= 2 * (s->h - 16);
788  if (y > s->h - 16)
789  y = 2 * (s->h - 16) - y;
790  y = ff_draw_round_to_sub(&s->draw, 1, 0, y);
791  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
792  x, y, dx, 16);
793  }
794  }
795 
796  /* top right: draw clock hands */
797  if (s->w >= 64 && s->h >= 64) {
798  int l = (FFMIN(s->w, s->h) - 32) >> 1;
799  int steps = FFMAX(4, l >> 5);
800  int xc = (s->w >> 2) + (s->w >> 1);
801  int yc = (s->h >> 2);
802  int cycle = l << 2;
803  int pos, xh, yh;
804  int c, i;
805 
806  for (c = 0; c < 3; c++) {
807  set_color(s, &color, (0xBBBBBB ^ (0xFF << (c << 3))) | alpha);
808  pos = av_rescale_q(s->pts, s->time_base, av_make_q(64 >> (c << 1), cycle)) % cycle;
809  xh = pos < 1 * l ? pos :
810  pos < 2 * l ? l :
811  pos < 3 * l ? 3 * l - pos : 0;
812  yh = pos < 1 * l ? 0 :
813  pos < 2 * l ? pos - l :
814  pos < 3 * l ? l :
815  cycle - pos;
816  xh -= l >> 1;
817  yh -= l >> 1;
818  for (i = 1; i <= steps; i++) {
819  int x = av_rescale(xh, i, steps) + xc;
820  int y = av_rescale(yh, i, steps) + yc;
821  x = ff_draw_round_to_sub(&s->draw, 0, -1, x);
822  y = ff_draw_round_to_sub(&s->draw, 1, -1, y);
823  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
824  x, y, 8, 8);
825  }
826  }
827  }
828 
829  /* bottom left: beating rectangles */
830  if (s->w >= 64 && s->h >= 64) {
831  int l = (FFMIN(s->w, s->h) - 16) >> 2;
832  int cycle = l << 3;
833  int xc = (s->w >> 2);
834  int yc = (s->h >> 2) + (s->h >> 1);
835  int xm1 = ff_draw_round_to_sub(&s->draw, 0, -1, xc - 8);
836  int xm2 = ff_draw_round_to_sub(&s->draw, 0, +1, xc + 8);
837  int ym1 = ff_draw_round_to_sub(&s->draw, 1, -1, yc - 8);
838  int ym2 = ff_draw_round_to_sub(&s->draw, 1, +1, yc + 8);
839  int size, step, x1, x2, y1, y2;
840 
841  size = av_rescale_q(s->pts, s->time_base, av_make_q(4, cycle));
842  step = size / l;
843  size %= l;
844  if (step & 1)
845  size = l - size;
846  step = (step >> 1) & 3;
847  set_color(s, &color, 0xFF808080);
848  x1 = ff_draw_round_to_sub(&s->draw, 0, -1, xc - 4 - size);
849  x2 = ff_draw_round_to_sub(&s->draw, 0, +1, xc + 4 + size);
850  y1 = ff_draw_round_to_sub(&s->draw, 1, -1, yc - 4 - size);
851  y2 = ff_draw_round_to_sub(&s->draw, 1, +1, yc + 4 + size);
852  if (step == 0 || step == 2)
853  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
854  x1, ym1, x2 - x1, ym2 - ym1);
855  if (step == 1 || step == 2)
856  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
857  xm1, y1, xm2 - xm1, y2 - y1);
858  if (step == 3)
859  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
860  x1, y1, x2 - x1, y2 - y1);
861  }
862 
863  /* bottom right: checker with random noise */
864  {
865  unsigned xmin = av_rescale(5, s->w, 8);
866  unsigned xmax = av_rescale(7, s->w, 8);
867  unsigned ymin = av_rescale(5, s->h, 8);
868  unsigned ymax = av_rescale(7, s->h, 8);
869  unsigned x, y, i, r;
870  uint8_t alpha[256];
871 
872  r = s->pts;
873  for (y = ymin; y + 15 < ymax; y += 16) {
874  for (x = xmin; x + 15 < xmax; x += 16) {
875  if ((x ^ y) & 16)
876  continue;
877  for (i = 0; i < 256; i++) {
878  r = r * 1664525 + 1013904223;
879  alpha[i] = r >> 24;
880  }
881  set_color(s, &color, 0xFF00FF80);
882  ff_blend_mask(&s->draw, &color, frame->data, frame->linesize,
883  frame->width, frame->height,
884  alpha, 16, 16, 16, 3, 0, x, y);
885  }
886  }
887  }
888 
889  /* bouncing square */
890  if (s->w >= 16 && s->h >= 16) {
891  unsigned w = s->w - 8;
892  unsigned h = s->h - 8;
893  unsigned x = av_rescale_q(s->pts, s->time_base, av_make_q(233, 55 * w)) % (w << 1);
894  unsigned y = av_rescale_q(s->pts, s->time_base, av_make_q(233, 89 * h)) % (h << 1);
895  if (x > w)
896  x = (w << 1) - x;
897  if (y > h)
898  y = (h << 1) - y;
899  x = ff_draw_round_to_sub(&s->draw, 0, -1, x);
900  y = ff_draw_round_to_sub(&s->draw, 1, -1, y);
901  set_color(s, &color, 0xFF8000FF);
902  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
903  x, y, 8, 8);
904  }
905 
906  /* top right: draw frame time and frame number */
907  {
908  char buf[256];
909  unsigned time;
910 
911  time = av_rescale_q(s->pts, s->time_base, av_make_q(1, 1000)) % 86400000;
912  set_color(s, &color, 0xC0000000);
913  ff_blend_rectangle(&s->draw, &color, frame->data, frame->linesize,
914  frame->width, frame->height,
915  2, 2, 100, 36);
916  set_color(s, &color, 0xFFFF8000);
917  snprintf(buf, sizeof(buf), "%02d:%02d:%02d.%03d\n%12"PRIi64,
918  time / 3600000, (time / 60000) % 60, (time / 1000) % 60,
919  time % 1000, s->pts);
920  draw_text(s, frame, &color, 4, 4, buf);
921  }
922 }
923 static av_cold int test2_init(AVFilterContext *ctx)
924 {
925  TestSourceContext *s = ctx->priv;
926 
927  s->fill_picture_fn = test2_fill_picture;
928  return init(ctx);
929 }
930 
931 static int test2_query_formats(const AVFilterContext *ctx,
932  AVFilterFormatsConfig **cfg_in,
933  AVFilterFormatsConfig **cfg_out)
934 {
935  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_draw_supported_pixel_formats(0));
936 }
937 
938 static int test2_config_props(AVFilterLink *inlink)
939 {
940  AVFilterContext *ctx = inlink->src;
941  TestSourceContext *s = ctx->priv;
942 
943  av_assert0(ff_draw_init_from_link(&s->draw, inlink, 0) >= 0);
944  s->w = ff_draw_round_to_sub(&s->draw, 0, -1, s->w);
945  s->h = ff_draw_round_to_sub(&s->draw, 1, -1, s->h);
946  if (av_image_check_size(s->w, s->h, 0, ctx) < 0)
947  return AVERROR(EINVAL);
948  return config_props(inlink);
949 }
950 
951 static const AVFilterPad avfilter_vsrc_testsrc2_outputs[] = {
952  {
953  .name = "default",
954  .type = AVMEDIA_TYPE_VIDEO,
955  .config_props = test2_config_props,
956  },
957 };
958 
959 const FFFilter ff_vsrc_testsrc2 = {
960  .p.name = "testsrc2",
961  .p.description = NULL_IF_CONFIG_SMALL("Generate another test pattern."),
962  .p.priv_class = &testsrc2_class,
963  .priv_size = sizeof(TestSourceContext),
964  .init = test2_init,
965  .uninit = uninit,
966  .activate = activate,
967  FILTER_OUTPUTS(avfilter_vsrc_testsrc2_outputs),
968  FILTER_QUERY_FUNC2(test2_query_formats),
969 };
970 
971 #endif /* CONFIG_TESTSRC2_FILTER */
972 
973 #if CONFIG_RGBTESTSRC_FILTER
974 
975 static const AVOption rgbtestsrc_options[] = {
977  { "complement", "set complement colors", OFFSET(complement), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
978  { "co", "set complement colors", OFFSET(complement), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
979  { NULL }
980 };
981 
982 AVFILTER_DEFINE_CLASS(rgbtestsrc);
983 
984 #define R 0
985 #define G 1
986 #define B 2
987 #define A 3
988 
989 static void rgbtest_put_pixel(uint8_t *dstp[4], int dst_linesizep[4],
990  int x, int y, unsigned r, unsigned g, unsigned b, unsigned a, enum AVPixelFormat fmt,
991  uint8_t rgba_map[4])
992 {
994  uint8_t *dst = dstp[0];
995  ptrdiff_t dst_linesize = dst_linesizep[0];
996  uint32_t v;
997  uint64_t v16;
998  uint8_t *p;
999  uint16_t *p16;
1000 
1001  switch (fmt) {
1002  case AV_PIX_FMT_BGR444: ((uint16_t*)(dst + y*dst_linesize))[x] = ((r >> 4) << 8) | ((g >> 4) << 4) | (b >> 4); break;
1003  case AV_PIX_FMT_RGB444: ((uint16_t*)(dst + y*dst_linesize))[x] = ((b >> 4) << 8) | ((g >> 4) << 4) | (r >> 4); break;
1004  case AV_PIX_FMT_BGR555: ((uint16_t*)(dst + y*dst_linesize))[x] = ((r>>3)<<10) | ((g>>3)<<5) | (b>>3); break;
1005  case AV_PIX_FMT_RGB555: ((uint16_t*)(dst + y*dst_linesize))[x] = ((b>>3)<<10) | ((g>>3)<<5) | (r>>3); break;
1006  case AV_PIX_FMT_BGR565: ((uint16_t*)(dst + y*dst_linesize))[x] = ((r>>3)<<11) | ((g>>2)<<5) | (b>>3); break;
1007  case AV_PIX_FMT_RGB565: ((uint16_t*)(dst + y*dst_linesize))[x] = ((b>>3)<<11) | ((g>>2)<<5) | (r>>3); break;
1008  case AV_PIX_FMT_RGB24:
1009  case AV_PIX_FMT_BGR24:
1010  v = (r << (rgba_map[R]*8)) + (g << (rgba_map[G]*8)) + (b << (rgba_map[B]*8));
1011  p = dst + 3*x + y*dst_linesize;
1012  AV_WL24(p, v);
1013  break;
1014  case AV_PIX_FMT_RGB48:
1015  case AV_PIX_FMT_BGR48:
1016  v16 = ((uint64_t)r << (rgba_map[R]*16)) + ((uint64_t)g << (rgba_map[G]*16)) + ((uint64_t)b << (rgba_map[B]*16));
1017  p16 = (uint16_t *)(dst + 6*x + y*dst_linesize);
1018  *p16++ = v16 >> 32;
1019  *p16++ = v16 >> 16;
1020  *p16++ = v16;
1021  break;
1022  case AV_PIX_FMT_RGBA64:
1023  case AV_PIX_FMT_BGRA64:
1024  v16 = ((uint64_t)r << (rgba_map[R]*16)) + ((uint64_t)g << (rgba_map[G]*16)) + ((uint64_t)b << (rgba_map[B]*16));
1025  p16 = (uint16_t *)(dst + 8*x + y*dst_linesize);
1026  *p16++ = v16 >> 32;
1027  *p16++ = v16 >> 16;
1028  *p16++ = v16;
1029  *p16++ = a;
1030  break;
1031  case AV_PIX_FMT_RGBA:
1032  case AV_PIX_FMT_BGRA:
1033  case AV_PIX_FMT_ARGB:
1034  case AV_PIX_FMT_ABGR:
1035  v = (r << (rgba_map[R]*8)) + (g << (rgba_map[G]*8)) + (b << (rgba_map[B]*8)) + (a << (rgba_map[A]*8));
1036  p = dst + 4*x + y*dst_linesize;
1037  AV_WL32A(p, v);
1038  break;
1039  case AV_PIX_FMT_X2RGB10LE:
1040  case AV_PIX_FMT_X2BGR10LE:
1041  v = (r << ((desc->comp[0].offset*8) + desc->comp[0].shift)) +
1042  (g << ((desc->comp[1].offset*8) + desc->comp[1].shift)) +
1043  (b << ((desc->comp[2].offset*8) + desc->comp[2].shift)) +
1044  (3U << ((desc->comp[3].offset*8) + desc->comp[3].shift));
1045  p = dst + 4*x + y*dst_linesize;
1046  AV_WL32A(p, v);
1047  break;
1048  case AV_PIX_FMT_GBRAP:
1049  p = dstp[3] + x + y * dst_linesizep[3];
1050  p[0] = a;
1051  // fall-through
1052  case AV_PIX_FMT_GBRP:
1053  p = dstp[0] + x + y * dst_linesize;
1054  p[0] = g;
1055  p = dstp[1] + x + y * dst_linesizep[1];
1056  p[0] = b;
1057  p = dstp[2] + x + y * dst_linesizep[2];
1058  p[0] = r;
1059  break;
1060  case AV_PIX_FMT_GBRAP10:
1061  case AV_PIX_FMT_GBRAP12:
1062  case AV_PIX_FMT_GBRAP14:
1063  case AV_PIX_FMT_GBRAP16:
1064  p16 = (uint16_t *)(dstp[3] + x*2 + y * dst_linesizep[3]);
1065  p16[0] = a;
1066  // fall-through
1067  case AV_PIX_FMT_GBRP9:
1068  case AV_PIX_FMT_GBRP10:
1069  case AV_PIX_FMT_GBRP12:
1070  case AV_PIX_FMT_GBRP14:
1071  case AV_PIX_FMT_GBRP16:
1072  p16 = (uint16_t *)(dstp[0] + x*2 + y * dst_linesizep[0]);
1073  p16[0] = g;
1074  p16 = (uint16_t *)(dstp[1] + x*2 + y * dst_linesizep[1]);
1075  p16[0] = b;
1076  p16 = (uint16_t *)(dstp[2] + x*2 + y * dst_linesizep[2]);
1077  p16[0] = r;
1078  break;
1079  }
1080 }
1081 
1082 static void rgbtest_fill_picture_complement(AVFilterContext *ctx, AVFrame *frame)
1083 {
1084  TestSourceContext *test = ctx->priv;
1085  int x, y, w = frame->width, h = frame->height;
1086 
1087  for (y = 0; y < h; y++) {
1088  for (x = 0; x < w; x++) {
1089  int c = (1 << FFMAX(test->depth, 8))*x/w;
1090  int r = 0, g = 0, b = 0;
1091 
1092  if (6*y < h ) r = c;
1093  else if (6*y < 2*h) g = c, b = c;
1094  else if (6*y < 3*h) g = c;
1095  else if (6*y < 4*h) r = c, b = c;
1096  else if (6*y < 5*h) b = c;
1097  else r = c, g = c;
1098 
1099  rgbtest_put_pixel(frame->data, frame->linesize, x, y, r, g, b, c,
1100  ctx->outputs[0]->format, test->rgba_map);
1101  }
1102  }
1103 }
1104 
1105 static void rgbtest_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1106 {
1107  TestSourceContext *test = ctx->priv;
1108  int x, y, w = frame->width, h = frame->height;
1109 
1110  for (y = 0; y < h; y++) {
1111  for (x = 0; x < w; x++) {
1112  int c = (1 << FFMAX(test->depth, 8))*x/w;
1113  int r = 0, g = 0, b = 0;
1114 
1115  if (3*y < h ) r = c;
1116  else if (3*y < 2*h) g = c;
1117  else b = c;
1118 
1119  rgbtest_put_pixel(frame->data, frame->linesize, x, y, r, g, b, c,
1120  ctx->outputs[0]->format, test->rgba_map);
1121  }
1122  }
1123 }
1124 
1125 static av_cold int rgbtest_init(AVFilterContext *ctx)
1126 {
1127  TestSourceContext *test = ctx->priv;
1128 
1129  test->draw_once = 1;
1130  test->fill_picture_fn = test->complement ? rgbtest_fill_picture_complement : rgbtest_fill_picture;
1131  return init(ctx);
1132 }
1133 
1134 static const enum AVPixelFormat rgbtest_pix_fmts[] = {
1148  };
1149 
1150 static int rgbtest_config_props(AVFilterLink *outlink)
1151 {
1152  TestSourceContext *test = outlink->src->priv;
1154 
1155  test->depth = desc->comp[0].depth;
1156  ff_fill_rgba_map(test->rgba_map, outlink->format);
1157  return config_props(outlink);
1158 }
1159 
1160 static const AVFilterPad avfilter_vsrc_rgbtestsrc_outputs[] = {
1161  {
1162  .name = "default",
1163  .type = AVMEDIA_TYPE_VIDEO,
1164  .config_props = rgbtest_config_props,
1165  },
1166 };
1167 
1168 const FFFilter ff_vsrc_rgbtestsrc = {
1169  .p.name = "rgbtestsrc",
1170  .p.description = NULL_IF_CONFIG_SMALL("Generate RGB test pattern."),
1171  .p.priv_class = &rgbtestsrc_class,
1172  .priv_size = sizeof(TestSourceContext),
1173  .init = rgbtest_init,
1174  .uninit = uninit,
1175  .activate = activate,
1176  FILTER_OUTPUTS(avfilter_vsrc_rgbtestsrc_outputs),
1177  FILTER_PIXFMTS_ARRAY(rgbtest_pix_fmts),
1178 };
1179 
1180 #undef R
1181 #undef G
1182 #undef B
1183 #undef A
1184 
1185 #endif /* CONFIG_RGBTESTSRC_FILTER */
1186 
1187 #if CONFIG_YUVTESTSRC_FILTER
1188 
1189 #define Y 0
1190 #define U 1
1191 #define V 2
1192 #define A 3
1193 
1194 static void yuvtest_put_pixel(uint8_t *dstp[4], int dst_linesizep[4],
1195  int i, int j, unsigned y, unsigned u, unsigned v, unsigned a, enum AVPixelFormat fmt,
1196  uint8_t ayuv_map[4])
1197 {
1199  uint32_t n;
1200 
1201  switch (fmt) {
1202  case AV_PIX_FMT_VYU444:
1203  n = (y << (ayuv_map[Y]*8)) + (u << (ayuv_map[U]*8)) + (v << (ayuv_map[V]*8));
1204  AV_WL24(&dstp[0][i*3 + j*dst_linesizep[0]], n);
1205  break;
1206  case AV_PIX_FMT_V30XLE:
1207  case AV_PIX_FMT_XV30LE:
1208  n = (y << ((desc->comp[0].offset*8) + desc->comp[0].shift)) +
1209  (u << ((desc->comp[1].offset*8) + desc->comp[1].shift)) +
1210  (v << ((desc->comp[2].offset*8) + desc->comp[2].shift)) +
1211  (3U << ((desc->comp[3].offset*8) + desc->comp[3].shift));
1212  AV_WL32A(&dstp[0][i*4 + j*dst_linesizep[0]], n);
1213  break;
1214  case AV_PIX_FMT_XV36:
1215  case AV_PIX_FMT_XV48:
1216  a = UINT16_MAX;
1217  // fall-through
1218  case AV_PIX_FMT_AYUV64:
1219  AV_WN16A(&dstp[0][i*8 + ayuv_map[Y]*2 + j*dst_linesizep[0]], y << desc->comp[0].shift);
1220  AV_WN16A(&dstp[0][i*8 + ayuv_map[U]*2 + j*dst_linesizep[0]], u << desc->comp[1].shift);
1221  AV_WN16A(&dstp[0][i*8 + ayuv_map[V]*2 + j*dst_linesizep[0]], v << desc->comp[2].shift);
1222  AV_WN16A(&dstp[0][i*8 + ayuv_map[A]*2 + j*dst_linesizep[0]], a << desc->comp[3].shift);
1223  break;
1224  case AV_PIX_FMT_VUYX:
1225  a = UINT8_MAX;
1226  // fall-through
1227  case AV_PIX_FMT_UYVA:
1228  case AV_PIX_FMT_VUYA:
1229  case AV_PIX_FMT_AYUV:
1230  n = (y << (ayuv_map[Y]*8)) + (u << (ayuv_map[U]*8)) + (v << (ayuv_map[V]*8)) + (a << (ayuv_map[A]*8));
1231  AV_WL32A(&dstp[0][i*4 + j*dst_linesizep[0]], n);
1232  break;
1233  case AV_PIX_FMT_YUVA444P:
1234  dstp[3][i + j*dst_linesizep[3]] = a;
1235  // fall-through
1236  case AV_PIX_FMT_YUV444P:
1237  case AV_PIX_FMT_YUVJ444P:
1238  dstp[0][i + j*dst_linesizep[0]] = y;
1239  dstp[1][i + j*dst_linesizep[1]] = u;
1240  dstp[2][i + j*dst_linesizep[2]] = v;
1241  break;
1242  case AV_PIX_FMT_YUVA444P9:
1243  case AV_PIX_FMT_YUVA444P10:
1244  case AV_PIX_FMT_YUVA444P12:
1245  case AV_PIX_FMT_YUVA444P16:
1246  AV_WN16A(&dstp[3][i*2 + j*dst_linesizep[3]], a);
1247  // fall-through
1248  case AV_PIX_FMT_YUV444P9:
1249  case AV_PIX_FMT_YUV444P10:
1250  case AV_PIX_FMT_YUV444P12:
1251  case AV_PIX_FMT_YUV444P14:
1252  case AV_PIX_FMT_YUV444P16:
1253  AV_WN16A(&dstp[0][i*2 + j*dst_linesizep[0]], y);
1254  AV_WN16A(&dstp[1][i*2 + j*dst_linesizep[1]], u);
1255  AV_WN16A(&dstp[2][i*2 + j*dst_linesizep[2]], v);
1256  break;
1259  AV_WN16A(&dstp[0][i*2 + j*dst_linesizep[0]], y << desc->comp[0].shift);
1260  AV_WN16A(&dstp[1][i*2 + j*dst_linesizep[1]], u << desc->comp[1].shift);
1261  AV_WN16A(&dstp[2][i*2 + j*dst_linesizep[2]], v << desc->comp[2].shift);
1262  break;
1263  case AV_PIX_FMT_NV24:
1264  dstp[0][i + j*dst_linesizep[0] + 0] = y;
1265  dstp[1][i*2 + j*dst_linesizep[1] + 0] = u;
1266  dstp[1][i*2 + j*dst_linesizep[1] + 1] = v;
1267  break;
1268  case AV_PIX_FMT_NV42:
1269  dstp[0][i + j*dst_linesizep[0] + 0] = y;
1270  dstp[1][i*2 + j*dst_linesizep[1] + 1] = u;
1271  dstp[1][i*2 + j*dst_linesizep[1] + 0] = v;
1272  break;
1273  case AV_PIX_FMT_P410:
1274  case AV_PIX_FMT_P412:
1275  case AV_PIX_FMT_P416:
1276  AV_WN16A(&dstp[0][i*2 + j*dst_linesizep[0] + 0], y << (16 - desc->comp[0].depth));
1277  AV_WN16A(&dstp[1][i*4 + j*dst_linesizep[1] + 0], u << (16 - desc->comp[1].depth));
1278  AV_WN16A(&dstp[1][i*4 + j*dst_linesizep[1] + 2], v << (16 - desc->comp[1].depth));
1279  break;
1280  }
1281 }
1282 
1283 static void yuvtest_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1284 {
1285  TestSourceContext *test = ctx->priv;
1286  int i, j, w = frame->width, h = frame->height;
1287  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(ctx->outputs[0]->format);
1288  const int factor = 1 << desc->comp[0].depth;
1289  const int mid = 1 << (desc->comp[0].depth - 1);
1290 
1291  for (j = 0; j < h; j++) {
1292  for (i = 0; i < w; i++) {
1293  int c = factor * i / w;
1294  int y = mid, u = mid, v = mid;
1295 
1296  if (3*j < h ) y = c;
1297  else if (3*j < 2*h) u = c;
1298  else v = c;
1299 
1300  yuvtest_put_pixel(frame->data, frame->linesize, i, j, y, u, v, c,
1301  ctx->outputs[0]->format, test->ayuv_map);
1302  }
1303  }
1304 }
1305 
1306 static av_cold int yuvtest_init(AVFilterContext *ctx)
1307 {
1308  TestSourceContext *test = ctx->priv;
1309 
1310  test->draw_once = 1;
1311  test->fill_picture_fn = yuvtest_fill_picture;
1312  return init(ctx);
1313 }
1314 
1315 static const enum AVPixelFormat yuvtest_pix_fmts[] = {
1329 };
1330 
1331 static int yuvtest_config_props(AVFilterLink *outlink)
1332 {
1333  TestSourceContext *test = outlink->src->priv;
1334 
1335  ff_fill_ayuv_map(test->ayuv_map, outlink->format);
1336  return config_props(outlink);
1337 }
1338 
1339 static const AVFilterPad avfilter_vsrc_yuvtestsrc_outputs[] = {
1340  {
1341  .name = "default",
1342  .type = AVMEDIA_TYPE_VIDEO,
1343  .config_props = yuvtest_config_props,
1344  },
1345 };
1346 
1347 const FFFilter ff_vsrc_yuvtestsrc = {
1348  .p.name = "yuvtestsrc",
1349  .p.description = NULL_IF_CONFIG_SMALL("Generate YUV test pattern."),
1350  .p.priv_class = &nullsrc_yuvtestsrc_class,
1351  .priv_size = sizeof(TestSourceContext),
1352  .init = yuvtest_init,
1353  .uninit = uninit,
1354  .activate = activate,
1355  FILTER_OUTPUTS(avfilter_vsrc_yuvtestsrc_outputs),
1356  FILTER_PIXFMTS_ARRAY(yuvtest_pix_fmts),
1357 };
1358 
1359 #undef Y
1360 #undef U
1361 #undef V
1362 #undef A
1363 
1364 #endif /* CONFIG_YUVTESTSRC_FILTER */
1365 
1366 #if CONFIG_PAL75BARS_FILTER || CONFIG_PAL100BARS_FILTER || CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER
1367 
1368 static const uint8_t rainbow[7][4] = {
1369  { 180, 128, 128, 255 }, /* 75% white */
1370  { 162, 44, 142, 255 }, /* 75% yellow */
1371  { 131, 156, 44, 255 }, /* 75% cyan */
1372  { 112, 72, 58, 255 }, /* 75% green */
1373  { 84, 184, 198, 255 }, /* 75% magenta */
1374  { 65, 100, 212, 255 }, /* 75% red */
1375  { 35, 212, 114, 255 }, /* 75% blue */
1376 };
1377 
1378 static const uint8_t rainbow100[7][4] = {
1379  { 235, 128, 128, 255 }, /* 100% white */
1380  { 210, 16, 146, 255 }, /* 100% yellow */
1381  { 170, 166, 16, 255 }, /* 100% cyan */
1382  { 145, 54, 34, 255 }, /* 100% green */
1383  { 106, 202, 222, 255 }, /* 100% magenta */
1384  { 81, 90, 240, 255 }, /* 100% red */
1385  { 41, 240, 110, 255 }, /* 100% blue */
1386 };
1387 
1388 static const uint8_t rainbowhd[7][4] = {
1389  { 180, 128, 128, 255 }, /* 75% white */
1390  { 168, 44, 136, 255 }, /* 75% yellow */
1391  { 145, 147, 44, 255 }, /* 75% cyan */
1392  { 133, 63, 52, 255 }, /* 75% green */
1393  { 63, 193, 204, 255 }, /* 75% magenta */
1394  { 51, 109, 212, 255 }, /* 75% red */
1395  { 28, 212, 120, 255 }, /* 75% blue */
1396 };
1397 
1398 static const uint8_t wobnair[7][4] = {
1399  { 35, 212, 114, 255 }, /* 75% blue */
1400  { 19, 128, 128, 255 }, /* 7.5% intensity black */
1401  { 84, 184, 198, 255 }, /* 75% magenta */
1402  { 19, 128, 128, 255 }, /* 7.5% intensity black */
1403  { 131, 156, 44, 255 }, /* 75% cyan */
1404  { 19, 128, 128, 255 }, /* 7.5% intensity black */
1405  { 180, 128, 128, 255 }, /* 75% white */
1406 };
1407 
1408 static const uint8_t white[4] = { 235, 128, 128, 255 };
1409 
1410 /* pluge pulses */
1411 static const uint8_t neg4ire[4] = { 7, 128, 128, 255 };
1412 static const uint8_t pos4ire[4] = { 24, 128, 128, 255 };
1413 
1414 /* fudged Q/-I */
1415 static const uint8_t i_pixel[4] = { 57, 156, 97, 255 };
1416 static const uint8_t q_pixel[4] = { 44, 171, 147, 255 };
1417 
1418 static const uint8_t gray40[4] = { 104, 128, 128, 255 };
1419 static const uint8_t gray15[4] = { 49, 128, 128, 255 };
1420 static const uint8_t cyan[4] = { 188, 154, 16, 255 };
1421 static const uint8_t yellow[4] = { 219, 16, 138, 255 };
1422 static const uint8_t blue[4] = { 32, 240, 118, 255 };
1423 static const uint8_t red[4] = { 63, 102, 240, 255 };
1424 static const uint8_t black0[4] = { 16, 128, 128, 255 };
1425 static const uint8_t black2[4] = { 20, 128, 128, 255 };
1426 static const uint8_t black4[4] = { 25, 128, 128, 255 };
1427 static const uint8_t neg2[4] = { 12, 128, 128, 255 };
1428 
1429 static void draw_bar(TestSourceContext *test, const uint8_t color[4],
1430  int x, int y, int w, int h,
1431  AVFrame *frame)
1432 {
1434  uint8_t *p, *p0;
1435  int plane;
1436 
1437  x = FFMIN(x, test->w - 1);
1438  y = FFMIN(y, test->h - 1);
1439  w = FFMAX(FFMIN(w, test->w - x), 0);
1440  h = FFMAX(FFMIN(h, test->h - y), 0);
1441 
1442  av_assert0(x + w <= test->w);
1443  av_assert0(y + h <= test->h);
1444 
1445  for (plane = 0; frame->data[plane]; plane++) {
1446  const int c = color[plane];
1447  const ptrdiff_t linesize = frame->linesize[plane];
1448  int i, px, py, pw, ph;
1449 
1450  if (plane == 1 || plane == 2) {
1451  px = x >> desc->log2_chroma_w;
1452  pw = AV_CEIL_RSHIFT(w, desc->log2_chroma_w);
1453  py = y >> desc->log2_chroma_h;
1454  ph = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
1455  } else {
1456  px = x;
1457  pw = w;
1458  py = y;
1459  ph = h;
1460  }
1461 
1462  p0 = p = frame->data[plane] + py * linesize + px;
1463  memset(p, c, pw);
1464  p += linesize;
1465  for (i = 1; i < ph; i++, p += linesize)
1466  memcpy(p, p0, pw);
1467  }
1468 }
1469 
1470 static const enum AVPixelFormat smptebars_pix_fmts[] = {
1475 };
1476 
1477 static int smptebars_query_formats(const AVFilterContext *ctx,
1478  AVFilterFormatsConfig **cfg_in,
1479  AVFilterFormatsConfig **cfg_out)
1480 {
1481  enum AVColorSpace csp;
1482  int ret;
1483 
1484  if (!strcmp(ctx->name, "smptehdbars")) {
1485  csp = AVCOL_SPC_BT709;
1486  } else {
1487  csp = AVCOL_SPC_BT470BG;
1488  }
1489 
1490  if ((ret = ff_set_common_color_spaces2(ctx, cfg_in, cfg_out,
1492  return ret;
1493  if ((ret = ff_set_common_color_ranges2(ctx, cfg_in, cfg_out,
1495  return ret;
1496  return ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, smptebars_pix_fmts);
1497 }
1498 
1499 AVFILTER_DEFINE_CLASS_EXT(palbars, "pal(75|100)bars", options);
1500 
1501 #if CONFIG_PAL75BARS_FILTER
1502 
1503 static void pal75bars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1504 {
1505  TestSourceContext *test = ctx->priv;
1506  int r_w, i, x = 0;
1507  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1508 
1509  r_w = FFALIGN((test->w + 7) / 8, 1 << pixdesc->log2_chroma_w);
1510 
1511  draw_bar(test, white, x, 0, r_w, test->h, picref);
1512  x += r_w;
1513  for (i = 1; i < 7; i++) {
1514  draw_bar(test, rainbow[i], x, 0, r_w, test->h, picref);
1515  x += r_w;
1516  }
1517  draw_bar(test, black0, x, 0, r_w, test->h, picref);
1518 }
1519 
1520 static av_cold int pal75bars_init(AVFilterContext *ctx)
1521 {
1522  TestSourceContext *test = ctx->priv;
1523 
1524  test->fill_picture_fn = pal75bars_fill_picture;
1525  test->draw_once = 1;
1526  return init(ctx);
1527 }
1528 
1529 const FFFilter ff_vsrc_pal75bars = {
1530  .p.name = "pal75bars",
1531  .p.description = NULL_IF_CONFIG_SMALL("Generate PAL 75% color bars."),
1532  .p.priv_class = &palbars_class,
1533  .priv_size = sizeof(TestSourceContext),
1534  .init = pal75bars_init,
1535  .uninit = uninit,
1536  .activate = activate,
1538  FILTER_QUERY_FUNC2(smptebars_query_formats),
1539 };
1540 
1541 #endif /* CONFIG_PAL75BARS_FILTER */
1542 
1543 #if CONFIG_PAL100BARS_FILTER
1544 
1545 static void pal100bars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1546 {
1547  TestSourceContext *test = ctx->priv;
1548  int r_w, i, x = 0;
1549  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1550 
1551  r_w = FFALIGN((test->w + 7) / 8, 1 << pixdesc->log2_chroma_w);
1552 
1553  for (i = 0; i < 7; i++) {
1554  draw_bar(test, rainbow100[i], x, 0, r_w, test->h, picref);
1555  x += r_w;
1556  }
1557  draw_bar(test, black0, x, 0, r_w, test->h, picref);
1558 }
1559 
1560 static av_cold int pal100bars_init(AVFilterContext *ctx)
1561 {
1562  TestSourceContext *test = ctx->priv;
1563 
1564  test->fill_picture_fn = pal100bars_fill_picture;
1565  test->draw_once = 1;
1566  return init(ctx);
1567 }
1568 
1569 const FFFilter ff_vsrc_pal100bars = {
1570  .p.name = "pal100bars",
1571  .p.description = NULL_IF_CONFIG_SMALL("Generate PAL 100% color bars."),
1572  .p.priv_class = &palbars_class,
1573  .priv_size = sizeof(TestSourceContext),
1574  .init = pal100bars_init,
1575  .uninit = uninit,
1576  .activate = activate,
1578  FILTER_QUERY_FUNC2(smptebars_query_formats),
1579 };
1580 
1581 #endif /* CONFIG_PAL100BARS_FILTER */
1582 
1583 AVFILTER_DEFINE_CLASS_EXT(smptebars, "smpte(hd)bars", options);
1584 
1585 #if CONFIG_SMPTEBARS_FILTER
1586 
1587 static void smptebars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1588 {
1589  TestSourceContext *test = ctx->priv;
1590  int r_w, r_h, w_h, p_w, p_h, i, tmp, x = 0;
1591  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1592 
1593  r_w = FFALIGN((test->w + 6) / 7, 1 << pixdesc->log2_chroma_w);
1594  r_h = FFALIGN(test->h * 2 / 3, 1 << pixdesc->log2_chroma_h);
1595  w_h = FFALIGN(test->h * 3 / 4 - r_h, 1 << pixdesc->log2_chroma_h);
1596  p_w = FFALIGN(r_w * 5 / 4, 1 << pixdesc->log2_chroma_w);
1597  p_h = test->h - w_h - r_h;
1598 
1599  for (i = 0; i < 7; i++) {
1600  draw_bar(test, rainbow[i], x, 0, r_w, r_h, picref);
1601  draw_bar(test, wobnair[i], x, r_h, r_w, w_h, picref);
1602  x += r_w;
1603  }
1604  x = 0;
1605  draw_bar(test, i_pixel, x, r_h + w_h, p_w, p_h, picref);
1606  x += p_w;
1607  draw_bar(test, white, x, r_h + w_h, p_w, p_h, picref);
1608  x += p_w;
1609  draw_bar(test, q_pixel, x, r_h + w_h, p_w, p_h, picref);
1610  x += p_w;
1611  tmp = FFALIGN(5 * r_w - x, 1 << pixdesc->log2_chroma_w);
1612  draw_bar(test, black0, x, r_h + w_h, tmp, p_h, picref);
1613  x += tmp;
1614  tmp = FFALIGN(r_w / 3, 1 << pixdesc->log2_chroma_w);
1615  draw_bar(test, neg4ire, x, r_h + w_h, tmp, p_h, picref);
1616  x += tmp;
1617  draw_bar(test, black0, x, r_h + w_h, tmp, p_h, picref);
1618  x += tmp;
1619  draw_bar(test, pos4ire, x, r_h + w_h, tmp, p_h, picref);
1620  x += tmp;
1621  draw_bar(test, black0, x, r_h + w_h, test->w - x, p_h, picref);
1622 }
1623 
1624 static av_cold int smptebars_init(AVFilterContext *ctx)
1625 {
1626  TestSourceContext *test = ctx->priv;
1627 
1628  test->fill_picture_fn = smptebars_fill_picture;
1629  test->draw_once = 1;
1630  return init(ctx);
1631 }
1632 
1633 const FFFilter ff_vsrc_smptebars = {
1634  .p.name = "smptebars",
1635  .p.description = NULL_IF_CONFIG_SMALL("Generate SMPTE color bars."),
1636  .p.priv_class = &smptebars_class,
1637  .priv_size = sizeof(TestSourceContext),
1638  .init = smptebars_init,
1639  .uninit = uninit,
1640  .activate = activate,
1642  FILTER_QUERY_FUNC2(smptebars_query_formats),
1643 };
1644 
1645 #endif /* CONFIG_SMPTEBARS_FILTER */
1646 
1647 #if CONFIG_SMPTEHDBARS_FILTER
1648 
1649 static void smptehdbars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1650 {
1651  TestSourceContext *test = ctx->priv;
1652  int d_w, r_w, r_h, l_w, i, tmp, x = 0, y = 0;
1653  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1654 
1655  d_w = FFALIGN(test->w / 8, 1 << pixdesc->log2_chroma_w);
1656  r_h = FFALIGN(test->h * 7 / 12, 1 << pixdesc->log2_chroma_h);
1657  draw_bar(test, gray40, x, 0, d_w, r_h, picref);
1658  x += d_w;
1659 
1660  r_w = FFALIGN((((test->w + 3) / 4) * 3) / 7, 1 << pixdesc->log2_chroma_w);
1661  for (i = 0; i < 7; i++) {
1662  draw_bar(test, rainbowhd[i], x, 0, r_w, r_h, picref);
1663  x += r_w;
1664  }
1665  draw_bar(test, gray40, x, 0, test->w - x, r_h, picref);
1666  y = r_h;
1667  r_h = FFALIGN(test->h / 12, 1 << pixdesc->log2_chroma_h);
1668  draw_bar(test, cyan, 0, y, d_w, r_h, picref);
1669  x = d_w;
1670  draw_bar(test, i_pixel, x, y, r_w, r_h, picref);
1671  x += r_w;
1672  tmp = r_w * 6;
1673  draw_bar(test, rainbowhd[0], x, y, tmp, r_h, picref);
1674  x += tmp;
1675  l_w = x;
1676  draw_bar(test, blue, x, y, test->w - x, r_h, picref);
1677  y += r_h;
1678  draw_bar(test, yellow, 0, y, d_w, r_h, picref);
1679  x = d_w;
1680  draw_bar(test, q_pixel, x, y, r_w, r_h, picref);
1681  x += r_w;
1682 
1683  for (i = 0; i < tmp; i += 1 << pixdesc->log2_chroma_w) {
1684  uint8_t yramp[4] = {0};
1685 
1686  yramp[0] = i * 255 / tmp;
1687  yramp[1] = 128;
1688  yramp[2] = 128;
1689  yramp[3] = 255;
1690 
1691  draw_bar(test, yramp, x, y, 1 << pixdesc->log2_chroma_w, r_h, picref);
1692  x += 1 << pixdesc->log2_chroma_w;
1693  }
1694  draw_bar(test, red, x, y, test->w - x, r_h, picref);
1695  y += r_h;
1696  draw_bar(test, gray15, 0, y, d_w, test->h - y, picref);
1697  x = d_w;
1698  tmp = FFALIGN(r_w * 3 / 2, 1 << pixdesc->log2_chroma_w);
1699  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1700  x += tmp;
1701  tmp = FFALIGN(r_w * 2, 1 << pixdesc->log2_chroma_w);
1702  draw_bar(test, white, x, y, tmp, test->h - y, picref);
1703  x += tmp;
1704  tmp = FFALIGN(r_w * 5 / 6, 1 << pixdesc->log2_chroma_w);
1705  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1706  x += tmp;
1707  tmp = FFALIGN(r_w / 3, 1 << pixdesc->log2_chroma_w);
1708  draw_bar(test, neg2, x, y, tmp, test->h - y, picref);
1709  x += tmp;
1710  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1711  x += tmp;
1712  draw_bar(test, black2, x, y, tmp, test->h - y, picref);
1713  x += tmp;
1714  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1715  x += tmp;
1716  draw_bar(test, black4, x, y, tmp, test->h - y, picref);
1717  x += tmp;
1718  r_w = l_w - x;
1719  draw_bar(test, black0, x, y, r_w, test->h - y, picref);
1720  x += r_w;
1721  draw_bar(test, gray15, x, y, test->w - x, test->h - y, picref);
1722 }
1723 
1724 static av_cold int smptehdbars_init(AVFilterContext *ctx)
1725 {
1726  TestSourceContext *test = ctx->priv;
1727 
1728  test->fill_picture_fn = smptehdbars_fill_picture;
1729  test->draw_once = 1;
1730  return init(ctx);
1731 }
1732 
1733 const FFFilter ff_vsrc_smptehdbars = {
1734  .p.name = "smptehdbars",
1735  .p.description = NULL_IF_CONFIG_SMALL("Generate SMPTE HD color bars."),
1736  .p.priv_class = &smptebars_class,
1737  .priv_size = sizeof(TestSourceContext),
1738  .init = smptehdbars_init,
1739  .uninit = uninit,
1740  .activate = activate,
1742  FILTER_QUERY_FUNC2(smptebars_query_formats),
1743 };
1744 
1745 #endif /* CONFIG_SMPTEHDBARS_FILTER */
1746 #endif /* CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER */
1747 
1748 AVFILTER_DEFINE_CLASS_EXT(allyuv_allrgb, "allyuv/allrgb",
1750 
1751 #if CONFIG_ALLYUV_FILTER
1752 
1753 static void allyuv_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1754 {
1755  const ptrdiff_t ys = frame->linesize[0];
1756  const ptrdiff_t us = frame->linesize[1];
1757  const ptrdiff_t vs = frame->linesize[2];
1758  int x, y, j;
1759 
1760  for (y = 0; y < 4096; y++) {
1761  for (x = 0; x < 2048; x++) {
1762  frame->data[0][y * ys + x] = ((x / 8) % 256);
1763  frame->data[0][y * ys + 4095 - x] = ((x / 8) % 256);
1764  }
1765 
1766  for (x = 0; x < 2048; x+=8) {
1767  for (j = 0; j < 8; j++) {
1768  frame->data[1][vs * y + x + j] = (y%16 + (j % 8) * 16);
1769  frame->data[1][vs * y + 4095 - x - j] = (128 + y%16 + (j % 8) * 16);
1770  }
1771  }
1772 
1773  for (x = 0; x < 4096; x++)
1774  frame->data[2][y * us + x] = 256 * y / 4096;
1775  }
1776 }
1777 
1778 static av_cold int allyuv_init(AVFilterContext *ctx)
1779 {
1780  TestSourceContext *test = ctx->priv;
1781 
1782  test->w = test->h = 4096;
1783  test->draw_once = 1;
1784  test->fill_picture_fn = allyuv_fill_picture;
1785  return init(ctx);
1786 }
1787 
1788 const FFFilter ff_vsrc_allyuv = {
1789  .p.name = "allyuv",
1790  .p.description = NULL_IF_CONFIG_SMALL("Generate all yuv colors."),
1791  .p.priv_class = &allyuv_allrgb_class,
1792  .priv_size = sizeof(TestSourceContext),
1793  .init = allyuv_init,
1794  .uninit = uninit,
1795  .activate = activate,
1798 };
1799 
1800 #endif /* CONFIG_ALLYUV_FILTER */
1801 
1802 #if CONFIG_ALLRGB_FILTER
1803 
1804 static void allrgb_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1805 {
1806  unsigned x, y;
1807  const ptrdiff_t linesize = frame->linesize[0];
1808  uint8_t *line = frame->data[0];
1809 
1810  for (y = 0; y < 4096; y++) {
1811  uint8_t *dst = line;
1812 
1813  for (x = 0; x < 4096; x++) {
1814  *dst++ = x;
1815  *dst++ = y;
1816  *dst++ = (x >> 8) | ((y >> 8) << 4);
1817  }
1818  line += linesize;
1819  }
1820 }
1821 
1822 static av_cold int allrgb_init(AVFilterContext *ctx)
1823 {
1824  TestSourceContext *test = ctx->priv;
1825 
1826  test->w = test->h = 4096;
1827  test->draw_once = 1;
1828  test->fill_picture_fn = allrgb_fill_picture;
1829  return init(ctx);
1830 }
1831 
1832 static int allrgb_config_props(AVFilterLink *outlink)
1833 {
1834  TestSourceContext *test = outlink->src->priv;
1835 
1836  ff_fill_rgba_map(test->rgba_map, outlink->format);
1837  return config_props(outlink);
1838 }
1839 
1840 static const AVFilterPad avfilter_vsrc_allrgb_outputs[] = {
1841  {
1842  .name = "default",
1843  .type = AVMEDIA_TYPE_VIDEO,
1844  .config_props = allrgb_config_props,
1845  },
1846 };
1847 
1848 const FFFilter ff_vsrc_allrgb = {
1849  .p.name = "allrgb",
1850  .p.description = NULL_IF_CONFIG_SMALL("Generate all RGB colors."),
1851  .p.priv_class = &allyuv_allrgb_class,
1852  .priv_size = sizeof(TestSourceContext),
1853  .init = allrgb_init,
1854  .uninit = uninit,
1855  .activate = activate,
1856  FILTER_OUTPUTS(avfilter_vsrc_allrgb_outputs),
1858 };
1859 
1860 #endif /* CONFIG_ALLRGB_FILTER */
1861 
1862 #if CONFIG_COLORSPECTRUM_FILTER
1863 
1864 static const AVOption colorspectrum_options[] = {
1866  { "type", "set the color spectrum type", OFFSET(type), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, .unit = "type" },
1867  { "black","fade to black", 0, AV_OPT_TYPE_CONST,{.i64=0},0, 0, FLAGS, .unit = "type" },
1868  { "white","fade to white", 0, AV_OPT_TYPE_CONST,{.i64=1},0, 0, FLAGS, .unit = "type" },
1869  { "all", "white to black", 0, AV_OPT_TYPE_CONST,{.i64=2},0, 0, FLAGS, .unit = "type" },
1870  { NULL }
1871 };
1872 
1873 AVFILTER_DEFINE_CLASS(colorspectrum);
1874 
1875 static inline float mix(float a, float b, float mix)
1876 {
1877  return a * mix + b * (1.f - mix);
1878 }
1879 
1880 static void hsb2rgb(const float *c, float *rgb)
1881 {
1882  rgb[0] = av_clipf(fabsf(fmodf(c[0] * 6.f + 0.f, 6.f) - 3.f) - 1.f, 0.f, 1.f);
1883  rgb[1] = av_clipf(fabsf(fmodf(c[0] * 6.f + 4.f, 6.f) - 3.f) - 1.f, 0.f, 1.f);
1884  rgb[2] = av_clipf(fabsf(fmodf(c[0] * 6.f + 2.f, 6.f) - 3.f) - 1.f, 0.f, 1.f);
1885  rgb[0] = mix(c[3], (rgb[0] * rgb[0] * (3.f - 2.f * rgb[0])), c[1]) * c[2];
1886  rgb[1] = mix(c[3], (rgb[1] * rgb[1] * (3.f - 2.f * rgb[1])), c[1]) * c[2];
1887  rgb[2] = mix(c[3], (rgb[2] * rgb[2] * (3.f - 2.f * rgb[2])), c[1]) * c[2];
1888 }
1889 
1890 static void colorspectrum_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1891 {
1892  TestSourceContext *test = ctx->priv;
1893  const float w = frame->width - 1.f;
1894  const float h = frame->height - 1.f;
1895  float c[4];
1896 
1897  for (int y = 0; y < frame->height; y++) {
1898  float *r = (float *)(frame->data[2] + y * frame->linesize[2]);
1899  float *g = (float *)(frame->data[0] + y * frame->linesize[0]);
1900  float *b = (float *)(frame->data[1] + y * frame->linesize[1]);
1901  const float yh = y / h;
1902 
1903  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;
1904  c[2] = 1.f;
1905  c[3] = test->type == 1 ? 1.f : test->type == 2 ? (yh > 0.5f ? 0.f : 1.f): 0.f;
1906  for (int x = 0; x < frame->width; x++) {
1907  float rgb[3];
1908 
1909  c[0] = x / w;
1910  hsb2rgb(c, rgb);
1911 
1912  r[x] = rgb[0];
1913  g[x] = rgb[1];
1914  b[x] = rgb[2];
1915  }
1916  }
1917 }
1918 
1919 static av_cold int colorspectrum_init(AVFilterContext *ctx)
1920 {
1921  TestSourceContext *test = ctx->priv;
1922 
1923  test->draw_once = 1;
1924  test->fill_picture_fn = colorspectrum_fill_picture;
1925  return init(ctx);
1926 }
1927 
1929  .p.name = "colorspectrum",
1930  .p.description = NULL_IF_CONFIG_SMALL("Generate colors spectrum."),
1931  .p.priv_class = &colorspectrum_class,
1932  .priv_size = sizeof(TestSourceContext),
1933  .init = colorspectrum_init,
1934  .uninit = uninit,
1935  .activate = activate,
1938 };
1939 
1940 #endif /* CONFIG_COLORSPECTRUM_FILTER */
1941 
1942 #if CONFIG_COLORCHART_FILTER
1943 
1944 static const AVOption colorchart_options[] = {
1946  { "patch_size", "set the single patch size", OFFSET(pw), AV_OPT_TYPE_IMAGE_SIZE, {.str="64x64"}, 0, 0, FLAGS },
1947  { "preset", "set the color checker chart preset", OFFSET(type), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, .unit = "preset" },
1948  { "reference", "reference", 0, AV_OPT_TYPE_CONST,{.i64=0}, 0, 0, FLAGS, .unit = "preset" },
1949  { "skintones", "skintones", 0, AV_OPT_TYPE_CONST,{.i64=1}, 0, 0, FLAGS, .unit = "preset" },
1950  { NULL }
1951 };
1952 
1953 AVFILTER_DEFINE_CLASS(colorchart);
1954 
1955 static const uint8_t reference_colors[][3] = {
1956  { 115, 82, 68 }, // dark skin
1957  { 194, 150, 130 }, // light skin
1958  { 98, 122, 157 }, // blue sky
1959  { 87, 108, 67 }, // foliage
1960  { 133, 128, 177 }, // blue flower
1961  { 103, 189, 170 }, // bluish green
1962 
1963  { 214, 126, 44 }, // orange
1964  { 80, 91, 166 }, // purple red
1965  { 193, 90, 99 }, // moderate red
1966  { 94, 60, 108 }, // purple
1967  { 157, 188, 64 }, // yellow green
1968  { 224, 163, 46 }, // orange yellow
1969 
1970  { 56, 61, 150 }, // blue
1971  { 70, 148, 73 }, // green
1972  { 175, 54, 60 }, // red
1973  { 231, 199, 31 }, // yellow
1974  { 187, 86, 149 }, // magenta
1975  { 8, 133, 161 }, // cyan
1976 
1977  { 243, 243, 242 }, // white
1978  { 200, 200, 200 }, // neutral 8
1979  { 160, 160, 160 }, // neutral 65
1980  { 122, 122, 121 }, // neutral 5
1981  { 85, 85, 85 }, // neutral 35
1982  { 52, 52, 52 }, // black
1983 };
1984 
1985 static const uint8_t skintones_colors[][3] = {
1986  { 54, 38, 43 },
1987  { 105, 43, 42 },
1988  { 147, 43, 43 },
1989  { 77, 41, 42 },
1990  { 134, 43, 41 },
1991  { 201, 134, 118 },
1992 
1993  { 59, 41, 41 },
1994  { 192, 103, 76 },
1995  { 208, 156, 141 },
1996  { 152, 82, 61 },
1997  { 162, 132, 118 },
1998  { 212, 171, 150 },
1999 
2000  { 205, 91, 31 },
2001  { 164, 100, 55 },
2002  { 204, 136, 95 },
2003  { 178, 142, 116 },
2004  { 210, 152, 108 },
2005  { 217, 167, 131 },
2006 
2007  { 206, 166, 126 },
2008  { 208, 163, 97 },
2009  { 245, 180, 0 },
2010  { 212, 184, 125 },
2011  { 179, 165, 150 },
2012  { 196, 184, 105 },
2013 };
2014 
2015 typedef struct ColorChartPreset {
2016  int w, h;
2017  const uint8_t (*colors)[3];
2018 } ColorChartPreset;
2019 
2020 static const ColorChartPreset colorchart_presets[] = {
2021  { 6, 4, reference_colors, },
2022  { 6, 4, skintones_colors, },
2023 };
2024 
2025 static int colorchart_config_props(AVFilterLink *inlink)
2026 {
2027  AVFilterContext *ctx = inlink->src;
2028  TestSourceContext *s = ctx->priv;
2029 
2030  av_assert0(ff_draw_init_from_link(&s->draw, inlink, 0) >= 0);
2031  if (av_image_check_size(s->w, s->h, 0, ctx) < 0)
2032  return AVERROR(EINVAL);
2033  return config_props(inlink);
2034 }
2035 
2036 static void colorchart_fill_picture(AVFilterContext *ctx, AVFrame *frame)
2037 {
2038  TestSourceContext *test = ctx->priv;
2039  const int preset = test->type;
2040  const int w = colorchart_presets[preset].w;
2041  const int h = colorchart_presets[preset].h;
2042  const int pw = test->pw;
2043  const int ph = test->ph;
2044 
2045  for (int y = 0; y < h; y++) {
2046  for (int x = 0; x < w; x++) {
2047  uint32_t pc = AV_RB24(colorchart_presets[preset].colors[y * w + x]);
2049 
2050  set_color(test, &color, pc);
2051  ff_fill_rectangle(&test->draw, &color, frame->data, frame->linesize,
2052  x * pw, y * ph, pw, ph);
2053  }
2054  }
2055 }
2056 
2057 static av_cold int colorchart_init(AVFilterContext *ctx)
2058 {
2059  TestSourceContext *test = ctx->priv;
2060  const int preset = test->type;
2061  const int w = colorchart_presets[preset].w;
2062  const int h = colorchart_presets[preset].h;
2063 
2064  test->w = w * test->pw;
2065  test->h = h * test->ph;
2066  test->draw_once = 1;
2067  test->fill_picture_fn = colorchart_fill_picture;
2068  return init(ctx);
2069 }
2070 
2071 static const AVFilterPad avfilter_vsrc_colorchart_outputs[] = {
2072  {
2073  .name = "default",
2074  .type = AVMEDIA_TYPE_VIDEO,
2075  .config_props = colorchart_config_props,
2076  },
2077 };
2078 
2079 const FFFilter ff_vsrc_colorchart = {
2080  .p.name = "colorchart",
2081  .p.description = NULL_IF_CONFIG_SMALL("Generate color checker chart."),
2082  .p.priv_class = &colorchart_class,
2083  .priv_size = sizeof(TestSourceContext),
2084  .init = colorchart_init,
2085  .uninit = uninit,
2086  .activate = activate,
2087  FILTER_OUTPUTS(avfilter_vsrc_colorchart_outputs),
2089 };
2090 
2091 #endif /* CONFIG_COLORCHART_FILTER */
2092 
2093 #if CONFIG_ZONEPLATE_FILTER
2094 
2095 static const AVOption zoneplate_options[] = {
2097  { "precision", "set LUT precision", OFFSET(lut_precision), AV_OPT_TYPE_INT, {.i64=10}, 4, 16, FLAGS },
2098  { "xo", "set X-axis offset", OFFSET(xo), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2099  { "yo", "set Y-axis offset", OFFSET(yo), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2100  { "to", "set T-axis offset", OFFSET(to), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2101  { "k0", "set 0-order phase", OFFSET(k0), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2102  { "kx", "set 1-order X-axis phase", OFFSET(kx), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2103  { "ky", "set 1-order Y-axis phase", OFFSET(ky), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2104  { "kt", "set 1-order T-axis phase", OFFSET(kt), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2105  { "kxt", "set X-axis*T-axis product phase", OFFSET(kxt), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2106  { "kyt", "set Y-axis*T-axis product phase", OFFSET(kyt), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2107  { "kxy", "set X-axis*Y-axis product phase", OFFSET(kxy), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2108  { "kx2", "set 2-order X-axis phase", OFFSET(kx2), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2109  { "ky2", "set 2-order Y-axis phase", OFFSET(ky2), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2110  { "kt2", "set 2-order T-axis phase", OFFSET(kt2), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2111  { "ku", "set 0-order U-color phase", OFFSET(kU), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2112  { "kv", "set 0-order V-color phase", OFFSET(kV), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2113  { NULL }
2114 };
2115 
2116 AVFILTER_DEFINE_CLASS(zoneplate);
2117 
2118 #define ZONEPLATE_SLICE(name, type) \
2119 static int zoneplate_fill_slice_##name(AVFilterContext *ctx, \
2120  void *arg, int job, \
2121  int nb_jobs) \
2122 { \
2123  TestSourceContext *test = ctx->priv; \
2124  AVFrame *frame = arg; \
2125  const int w = frame->width; \
2126  const int h = frame->height; \
2127  const int kxt = test->kxt, kyt = test->kyt, kx2 = test->kx2; \
2128  const int t = test->pts + test->to, k0 = test->k0; \
2129  const int kt = test->kt, kt2 = test->kt2, ky2 = test->ky2; \
2130  const int ky = test->ky, kx = test->kx, kxy = test->kxy; \
2131  const int lut_mask = (1 << test->lut_precision) - 1; \
2132  const int nkt2t = kt2 * t * t, nktt = kt * t; \
2133  const int start = (h * job ) / nb_jobs; \
2134  const int end = (h * (job+1)) / nb_jobs; \
2135  const ptrdiff_t ylinesize = frame->linesize[0] / sizeof(type); \
2136  const ptrdiff_t ulinesize = frame->linesize[1] / sizeof(type); \
2137  const ptrdiff_t vlinesize = frame->linesize[2] / sizeof(type); \
2138  const int xreset = -(w / 2) - test->xo; \
2139  const int yreset = -(h / 2) - test->yo + start; \
2140  const int kU = test->kU, kV = test->kV; \
2141  const int skxy = 0xffff / (w / 2); \
2142  const int skx2 = 0xffff / w; \
2143  const int dkxt = kxt * t; \
2144  type *ydst = ((type *)frame->data[0]) + start * ylinesize; \
2145  type *udst = ((type *)frame->data[1]) + start * ulinesize; \
2146  type *vdst = ((type *)frame->data[2]) + start * vlinesize; \
2147  const type *lut = (const type *)test->lut; \
2148  int akx, akxt, aky, akyt; \
2149  \
2150  aky = start * ky; \
2151  akyt = start * kyt * t; \
2152  \
2153  for (int j = start, y = yreset; j < end; j++, y++) { \
2154  const int dkxy = kxy * y * skxy; \
2155  const int nky2kt2 = (ky2 * y * y) / h + (nkt2t >> 1); \
2156  int akxy = dkxy * xreset; \
2157  \
2158  akx = 0; \
2159  akxt = 0; \
2160  aky += ky; \
2161  akyt += kyt * t; \
2162  \
2163  for (int i = 0, x = xreset; i < w; i++, x++) { \
2164  int phase = k0, uphase = kU, vphase = kV; \
2165  \
2166  akx += kx; \
2167  phase += akx + aky + nktt; \
2168  \
2169  akxt += dkxt; \
2170  akxy += dkxy; \
2171  phase += akxt + akyt; \
2172  phase += akxy >> 16; \
2173  phase += ((kx2 * x * x * skx2) >> 16) + nky2kt2; \
2174  uphase += phase; \
2175  vphase += phase; \
2176  \
2177  ydst[i] = lut[phase & lut_mask]; \
2178  udst[i] = lut[uphase & lut_mask]; \
2179  vdst[i] = lut[vphase & lut_mask]; \
2180  } \
2181  \
2182  ydst += ylinesize; \
2183  udst += ulinesize; \
2184  vdst += vlinesize; \
2185  } \
2186  \
2187  return 0; \
2188 }
2189 
2190 ZONEPLATE_SLICE( 8, uint8_t)
2191 ZONEPLATE_SLICE( 9, uint16_t)
2192 ZONEPLATE_SLICE(10, uint16_t)
2193 ZONEPLATE_SLICE(12, uint16_t)
2194 ZONEPLATE_SLICE(14, uint16_t)
2195 ZONEPLATE_SLICE(16, uint16_t)
2196 
2197 static void zoneplate_fill_picture(AVFilterContext *ctx, AVFrame *frame)
2198 {
2199  TestSourceContext *test = ctx->priv;
2200  ff_filter_execute(ctx, test->fill_slice_fn, frame, NULL,
2202 }
2203 
2204 static int zoneplate_config_props(AVFilterLink *outlink)
2205 {
2206  AVFilterContext *ctx = outlink->src;
2207  TestSourceContext *test = ctx->priv;
2209  const int lut_size = 1 << test->lut_precision;
2210  const int depth = desc->comp[0].depth;
2211  uint16_t *lut16;
2212  uint8_t *lut8;
2213 
2214  if (av_image_check_size(test->w, test->h, 0, ctx) < 0)
2215  return AVERROR(EINVAL);
2216 
2217  test->lut = av_calloc(lut_size, sizeof(*test->lut) * ((depth + 7) / 8));
2218  if (!test->lut)
2219  return AVERROR(ENOMEM);
2220 
2221  lut8 = test->lut;
2222  lut16 = (uint16_t *)test->lut;
2223  switch (depth) {
2224  case 8:
2225  for (int i = 0; i < lut_size; i++)
2226  lut8[i] = lrintf(255.f * (0.5f + 0.5f * sinf((2.f * M_PI * i) / lut_size)));
2227  break;
2228  default:
2229  for (int i = 0; i < lut_size; i++)
2230  lut16[i] = lrintf(((1 << depth) - 1) * (0.5f + 0.5f * sinf((2.f * M_PI * i) / lut_size)));
2231  break;
2232  }
2233 
2234  test->draw_once = 0;
2235  test->fill_picture_fn = zoneplate_fill_picture;
2236 
2237  switch (depth) {
2238  case 8: test->fill_slice_fn = zoneplate_fill_slice_8; break;
2239  case 9: test->fill_slice_fn = zoneplate_fill_slice_9; break;
2240  case 10: test->fill_slice_fn = zoneplate_fill_slice_10; break;
2241  case 12: test->fill_slice_fn = zoneplate_fill_slice_12; break;
2242  case 14: test->fill_slice_fn = zoneplate_fill_slice_14; break;
2243  case 16: test->fill_slice_fn = zoneplate_fill_slice_16; break;
2244  }
2245  return config_props(outlink);
2246 }
2247 
2248 static const enum AVPixelFormat zoneplate_pix_fmts[] = {
2253 };
2254 
2255 static int zoneplate_query_formats(const AVFilterContext *ctx,
2256  AVFilterFormatsConfig **cfg_in,
2257  AVFilterFormatsConfig **cfg_out)
2258 {
2259  int ret;
2260  if ((ret = ff_set_common_color_ranges2(ctx, cfg_in, cfg_out,
2262  return ret;
2263  return ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, zoneplate_pix_fmts);
2264 }
2265 
2266 static const AVFilterPad avfilter_vsrc_zoneplate_outputs[] = {
2267  {
2268  .name = "default",
2269  .type = AVMEDIA_TYPE_VIDEO,
2270  .config_props = zoneplate_config_props,
2271  },
2272 };
2273 
2274 const FFFilter ff_vsrc_zoneplate = {
2275  .p.name = "zoneplate",
2276  .p.description = NULL_IF_CONFIG_SMALL("Generate zone-plate."),
2277  .p.priv_class = &zoneplate_class,
2278  .p.flags = AVFILTER_FLAG_SLICE_THREADS,
2279  .priv_size = sizeof(TestSourceContext),
2280  .init = init,
2281  .uninit = uninit,
2282  .activate = activate,
2283  FILTER_OUTPUTS(avfilter_vsrc_zoneplate_outputs),
2284  FILTER_QUERY_FUNC2(zoneplate_query_formats),
2285  .process_command = ff_filter_process_command,
2286 };
2287 
2288 #endif /* CONFIG_ZONEPLATE_FILTER */
flags
const SwsFlags flags[]
Definition: swscale.c:61
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:117
A
#define A(x)
Definition: vpx_arith.h:28
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:565
AV_PIX_FMT_XV30LE
@ AV_PIX_FMT_XV30LE
packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), little-endian, variant of Y410 where alpha channe...
Definition: pixfmt.h:415
FFDrawColor
Definition: drawutils.h:52
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
ff_exp10
static av_always_inline double ff_exp10(double x)
Compute 10^x for floating point values.
Definition: ffmath.h:42
level
uint8_t level
Definition: svq3.c:208
mix
static int mix(int c0, int c1)
Definition: 4xm.c:717
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
FILTER_PIXFMTS_ARRAY
#define FILTER_PIXFMTS_ARRAY(array)
Definition: filters.h:243
color
Definition: vf_paletteuse.c:513
TestSourceContext::kV
int kV
Definition: vsrc_testsrc.c:97
ff_set_common_color_ranges2
int ff_set_common_color_ranges2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *color_ranges)
Definition: formats.c:1076
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1067
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
FFERROR_NOT_READY
return FFERROR_NOT_READY
Definition: filter_design.txt:204
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: vsrc_testsrc.c:143
ff_set_common_formats2
int ff_set_common_formats2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *formats)
Definition: formats.c:1124
ff_vsrc_yuvtestsrc
const FFFilter ff_vsrc_yuvtestsrc
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
TestSourceContext::kxt
int kxt
Definition: vsrc_testsrc.c:95
int64_t
long long int64_t
Definition: coverity.c:34
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
AV_PIX_FMT_YUV444P10MSB
#define AV_PIX_FMT_YUV444P10MSB
Definition: pixfmt.h:554
TestSourceContext::k0
int k0
Definition: vsrc_testsrc.c:94
av_unused
#define av_unused
Definition: attributes.h:151
mask
int mask
Definition: mediacodecdec_common.c:154
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3037
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
ff_vsrc_testsrc2
const FFFilter ff_vsrc_testsrc2
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
w
uint8_t w
Definition: llviddspenc.c:38
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:68
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
AVOption
AVOption.
Definition: opt.h:429
b
#define b
Definition: input.c:42
AV_ROUND_ZERO
@ AV_ROUND_ZERO
Round toward zero.
Definition: mathematics.h:131
data
const char data[16]
Definition: mxf.c:149
R
#define R
Definition: huffyuv.h:44
test
Definition: idctdsp.c:35
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:76
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:102
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
init
static av_cold int init(AVFilterContext *ctx)
Definition: vsrc_testsrc.c:128
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:220
video.h
ff_make_formats_list_singleton
AVFilterFormats * ff_make_formats_list_singleton(int fmt)
Equivalent to ff_make_format_list({const int[]}{ fmt, -1 })
Definition: formats.c:593
AV_PIX_FMT_YUV444P12MSB
#define AV_PIX_FMT_YUV444P12MSB
Definition: pixfmt.h:555
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:448
formats.h
avpriv_vga16_font_get
const uint8_t * avpriv_vga16_font_get(void)
Definition: xga_font_data.c:430
px
#define px
Definition: ops_tmpl_float.c:35
ff_vsrc_nullsrc
const FFFilter ff_vsrc_nullsrc
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
AVCOL_SPC_BT470BG
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition: pixfmt.h:706
rgb
Definition: rpzaenc.c:60
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:560
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:212
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:289
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:558
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:597
TestSourceContext::kyt
int kyt
Definition: vsrc_testsrc.c:95
draw_rectangle
static void draw_rectangle(AVFormatContext *s)
Definition: xcbgrab.c:649
ff_vsrc_allrgb
const FFFilter ff_vsrc_allrgb
val
static double val(void *priv, double ch)
Definition: aeval.c:77
AV_PIX_FMT_XV48
#define AV_PIX_FMT_XV48
Definition: pixfmt.h:611
type
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 type
Definition: writing_filters.txt:86
TestSourceContext::kxy
int kxy
Definition: vsrc_testsrc.c:95
TestSourceContext::xo
int xo
Definition: vsrc_testsrc.c:97
ff_blend_mask
void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color, uint8_t *dst[], int dst_linesize[], int dst_w, int dst_h, const uint8_t *mask, int mask_linesize, int mask_w, int mask_h, int l2depth, unsigned endianness, int x0, int y0)
Blend an alpha mask with an uniform color.
Definition: drawutils.c:557
fabsf
static __device__ float fabsf(float a)
Definition: cuda_runtime.h:181
planar
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1<< 16)) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(UINT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out->ch+ch,(const uint8_t **) in->ch+ch, off *(out-> planar
Definition: audioconvert.c:56
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:39
TestSourceContext::rgba_map
uint8_t rgba_map[4]
Definition: vsrc_testsrc.c:86
AV_PIX_FMT_VUYA
@ AV_PIX_FMT_VUYA
packed VUYA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), VUYAVUYA...
Definition: pixfmt.h:401
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:542
preset
preset
Definition: vf_curves.c:47
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
TestSourceContext::duration
int64_t duration
duration expressed in microseconds
Definition: vsrc_testsrc.c:60
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:106
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:642
ff_set_common_color_spaces2
int ff_set_common_color_spaces2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *color_spaces)
Definition: formats.c:1052
FFFilter
Definition: filters.h:266
TestSourceContext::type
int type
Definition: vsrc_testsrc.c:78
AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:562
float
float
Definition: af_crystalizer.c:122
ff_outlink_set_status
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
Definition: filters.h:628
TestSourceContext::kt
int kt
Definition: vsrc_testsrc.c:94
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRAP14
Definition: pixfmt.h:564
AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:563
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:552
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
g
const char * g
Definition: vf_curves.c:128
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
TestSourceContext::ph
int ph
Definition: vsrc_testsrc.c:56
TestSourceContext::time_base
AVRational time_base
Definition: vsrc_testsrc.c:58
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
filters.h
B
#define B
Definition: huffyuv.h:42
ff_vsrc_pal100bars
const FFFilter ff_vsrc_pal100bars
ff_vsrc_zoneplate
const FFFilter ff_vsrc_zoneplate
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:594
ctx
AVFormatContext * ctx
Definition: movenc.c:49
FLAGSR
#define FLAGSR
Definition: vsrc_testsrc.c:105
av_frame_clone
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition: frame.c:483
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AV_WN16A
#define AV_WN16A(p, v)
Definition: intreadwrite.h:530
TestSourceContext::color_rgba
uint8_t color_rgba[4]
Definition: vsrc_testsrc.c:83
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:264
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
AV_PIX_FMT_YUVJ444P
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition: pixfmt.h:87
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
arg
const char * arg
Definition: jacosubdec.c:67
TestSourceContext::kt2
int kt2
Definition: vsrc_testsrc.c:96
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:561
TestSourceContext::sar
AVRational sar
sample aspect ratio
Definition: vsrc_testsrc.c:61
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:529
FLAGS
#define FLAGS
Definition: vsrc_testsrc.c:104
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
AV_PIX_FMT_BGR48
#define AV_PIX_FMT_BGR48
Definition: pixfmt.h:530
NULL
#define NULL
Definition: coverity.c:32
TestSourceContext::lut_precision
int lut_precision
Definition: vsrc_testsrc.c:98
grad
static double grad(int hash, double x, double y, double z)
Definition: perlin.c:42
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
TestSourceContext::color
FFDrawColor color
Definition: vsrc_testsrc.c:82
AV_OPT_TYPE_COLOR
@ AV_OPT_TYPE_COLOR
Underlying C type is uint8_t[4].
Definition: opt.h:323
AV_OPT_TYPE_IMAGE_SIZE
@ AV_OPT_TYPE_IMAGE_SIZE
Underlying C type is two consecutive integers.
Definition: opt.h:303
AV_WL24
#define AV_WL24(p, d)
Definition: intreadwrite.h:460
V
#define V
Definition: avdct.c:32
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
AV_PIX_FMT_P410
#define AV_PIX_FMT_P410
Definition: pixfmt.h:617
NOSIZE_OPTIONS_OFFSET
#define NOSIZE_OPTIONS_OFFSET
Definition: vsrc_testsrc.c:120
options
Definition: swscale.c:43
ff_fill_ayuv_map
int ff_fill_ayuv_map(uint8_t *ayuv_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:88
AV_PIX_FMT_BGR0
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition: pixfmt.h:265
sinf
#define sinf(x)
Definition: libm.h:421
av_clipf
av_clipf
Definition: af_crystalizer.c:122
ff_vsrc_colorspectrum
const FFFilter ff_vsrc_colorspectrum
AV_PIX_FMT_GBRP9
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:557
AVFILTER_DEFINE_CLASS
#define AVFILTER_DEFINE_CLASS(fname)
Definition: filters.h:477
AV_PIX_FMT_ABGR
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:101
index
int index
Definition: gxfenc.c:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:121
TestSourceContext::picref
AVFrame * picref
cached reference containing the painted picture
Definition: vsrc_testsrc.c:64
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:198
AV_PIX_FMT_X2RGB10LE
@ AV_PIX_FMT_X2RGB10LE
packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:384
av_rescale_rnd
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
Definition: mathematics.c:58
f
f
Definition: af_crystalizer.c:122
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
to
const char * to
Definition: webvttdec.c:35
planes
static const struct @542 planes[]
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:94
config_props
static int config_props(AVFilterLink *outlink)
Definition: vsrc_testsrc.c:151
height
#define height
Definition: dsp.h:89
av_get_padded_bits_per_pixel
int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel for the pixel format described by pixdesc, including any padding ...
Definition: pixdesc.c:3421
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
ff_blend_rectangle
void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color, uint8_t *dst[], int dst_linesize[], int dst_w, int dst_h, int x0, int y0, int w, int h)
Blend a rectangle with an uniform color.
Definition: drawutils.c:378
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
TestSourceContext::frame_rate
AVRational frame_rate
Definition: vsrc_testsrc.c:58
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:578
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:525
size
int size
Definition: twinvq_data.h:10344
color
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:97
COMMON_OPTIONS
#define COMMON_OPTIONS
Definition: vsrc_testsrc.c:118
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
AV_WL32A
#define AV_WL32A(p, v)
Definition: intreadwrite.h:571
AV_PIX_FMT_BGR555
#define AV_PIX_FMT_BGR555
Definition: pixfmt.h:532
ff_fill_rectangle
void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color, uint8_t *dst[], int dst_linesize[], int dst_x, int dst_y, int w, int h)
Fill a rectangle with an uniform color.
Definition: drawutils.c:258
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:546
AV_PIX_FMT_AYUV64
#define AV_PIX_FMT_AYUV64
Definition: pixfmt.h:601
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:514
ff_filter_process_command
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
Definition: avfilter.c:905
TestSourceContext::level
int level
Definition: vsrc_testsrc.c:91
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
TestSourceContext::nb_decimals
int nb_decimals
Definition: vsrc_testsrc.c:69
TestSourceContext::lut
uint8_t * lut
Definition: vsrc_testsrc.c:99
draw_bar
static void draw_bar(ShowCWTContext *s, int y, float Y, float U, float V)
Definition: avf_showcwt.c:379
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:592
line
Definition: graph2dot.c:48
AV_PIX_FMT_RGB0
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
Definition: pixfmt.h:263
xga_font_data.h
ff_vsrc_allyuv
const FFFilter ff_vsrc_allyuv
M_PI
#define M_PI
Definition: mathematics.h:67
Y
#define Y
Definition: boxblur.h:37
TestSourceContext
Definition: vsrc_testsrc.c:53
AV_PIX_FMT_AYUV
@ AV_PIX_FMT_AYUV
packed AYUV 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), AYUVAYUV...
Definition: pixfmt.h:442
AV_PIX_FMT_ARGB
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:99
TestSourceContext::nb_frame
unsigned int nb_frame
Definition: vsrc_testsrc.c:57
AV_PIX_FMT_UYVA
@ AV_PIX_FMT_UYVA
packed UYVA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), UYVAUYVA...
Definition: pixfmt.h:444
TestSourceContext::draw_once
int draw_once
draw only the first frame, always put out the same picture
Definition: vsrc_testsrc.c:62
AV_PIX_FMT_BGRA64
#define AV_PIX_FMT_BGRA64
Definition: pixfmt.h:534
TestSourceContext::h
int h
Definition: vsrc_testsrc.c:55
lrintf
#define lrintf(x)
Definition: libm_mips.h:72
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
TestSourceContext::complement
int complement
Definition: vsrc_testsrc.c:87
ff_draw_supported_pixel_formats
AVFilterFormats * ff_draw_supported_pixel_formats(unsigned flags)
Return the list of pixel formats supported by the draw functions.
Definition: drawutils.c:670
ff_vsrc_smptebars
const FFFilter ff_vsrc_smptebars
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:559
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:700
AV_PIX_FMT_NV24
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:371
AV_PIX_FMT_BGR444
#define AV_PIX_FMT_BGR444
Definition: pixfmt.h:533
common.h
ff_filter_get_nb_threads
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition: avfilter.c:845
AV_PIX_FMT_RGB555
#define AV_PIX_FMT_RGB555
Definition: pixfmt.h:527
FILTER_QUERY_FUNC2
#define FILTER_QUERY_FUNC2(func)
Definition: filters.h:240
ff_draw_round_to_sub
int ff_draw_round_to_sub(FFDrawContext *draw, int sub_dir, int round_dir, int value)
Round a dimension according to subsampling.
Definition: drawutils.c:658
TestSourceContext::ky
int ky
Definition: vsrc_testsrc.c:94
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
FFDrawContext
Definition: drawutils.h:36
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
AV_PIX_FMT_BGR565
#define AV_PIX_FMT_BGR565
Definition: pixfmt.h:531
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:45
FILTER_PIXFMTS
#define FILTER_PIXFMTS(...)
Definition: filters.h:249
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
AV_PIX_FMT_NV42
@ AV_PIX_FMT_NV42
as above, but U and V bytes are swapped
Definition: pixfmt.h:372
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:650
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:538
ff_vsrc_haldclutsrc
const FFFilter ff_vsrc_haldclutsrc
OFFSET
#define OFFSET(x)
Definition: vsrc_testsrc.c:103
AV_PIX_FMT_RGB565
#define AV_PIX_FMT_RGB565
Definition: pixfmt.h:526
ff_draw_color
void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4])
Prepare a color.
Definition: drawutils.c:179
ret
ret
Definition: filter_design.txt:187
AV_PIX_FMT_0BGR
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
Definition: pixfmt.h:264
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
TestSourceContext::kU
int kU
Definition: vsrc_testsrc.c:97
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:589
pos
unsigned int pos
Definition: spdifenc.c:414
U
#define U(x)
Definition: vpx_arith.h:37
outputs
static const AVFilterPad outputs[]
Definition: vsrc_testsrc.c:165
draw_text
static void draw_text(FFDrawContext *draw, AVFrame *out, FFDrawColor *color, int x0, int y0, const uint8_t *text)
Definition: src_avsynctest.c:252
steps
static const int16_t steps[16]
Definition: misc4.c:30
TestSourceContext::to
int to
Definition: vsrc_testsrc.c:97
ff_set_common_formats_from_list2
int ff_set_common_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *fmts)
Definition: formats.c:1133
TestSourceContext::alpha
int alpha
Definition: vsrc_testsrc.c:72
ff_vsrc_testsrc
const FFFilter ff_vsrc_testsrc
ff_filter_execute
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition: avfilter.c:1693
activate
static int activate(AVFilterContext *ctx)
Definition: vsrc_testsrc.c:173
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
ff_vsrc_colorchart
const FFFilter ff_vsrc_colorchart
TestSourceContext::yo
int yo
Definition: vsrc_testsrc.c:97
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
avfilter.h
TestSourceContext::ky2
int ky2
Definition: vsrc_testsrc.c:96
AVFILTER_DEFINE_CLASS_EXT
AVFILTER_DEFINE_CLASS_EXT(nullsrc_yuvtestsrc, "nullsrc/yuvtestsrc", options)
AV_PIX_FMT_FLAG_PLANAR
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:132
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
ffmath.h
G
#define G
Definition: huffyuv.h:43
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
set_color
static av_unused void set_color(TestSourceContext *s, FFDrawColor *color, uint32_t argb)
Definition: vsrc_testsrc.c:699
ff_draw_init_from_link
int ff_draw_init_from_link(FFDrawContext *draw, const AVFilterLink *link, unsigned flags)
Init a draw context, taking the format, colorspace and range from the given filter link.
Definition: drawutils.c:168
AVFilterContext
An instance of a filter.
Definition: avfilter.h:274
factor
static const int factor[16]
Definition: vf_pp7.c:80
TestSourceContext::pts
int64_t pts
Definition: vsrc_testsrc.c:59
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
AVFILTER_FLAG_SLICE_THREADS
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition: avfilter.h:167
desc
const char * desc
Definition: libsvtav1.c:78
TestSourceContext::fill_slice_fn
int(* fill_slice_fn)(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
Definition: vsrc_testsrc.c:100
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFFilter::p
AVFilter p
The public AVFilter.
Definition: filters.h:270
us
#define us(width, name, range_min, range_max, subs,...)
Definition: cbs_apv.c:72
AV_PIX_FMT_X2BGR10LE
@ AV_PIX_FMT_X2BGR10LE
packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:386
AV_PIX_FMT_V30XLE
@ AV_PIX_FMT_V30XLE
packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), little-endian
Definition: pixfmt.h:449
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
TestSourceContext::kx
int kx
Definition: vsrc_testsrc.c:94
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:273
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AV_PIX_FMT_P416
#define AV_PIX_FMT_P416
Definition: pixfmt.h:621
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
ff_fill_rgba_map
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:80
TestSourceContext::draw_once_reset
int draw_once_reset
draw only the first frame or in case of reset
Definition: vsrc_testsrc.c:63
TestSourceContext::kx2
int kx2
Definition: vsrc_testsrc.c:96
imgutils.h
AV_PIX_FMT_XV36
#define AV_PIX_FMT_XV36
Definition: pixfmt.h:610
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:472
AV_PIX_FMT_0RGB
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Definition: pixfmt.h:262
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
TestSourceContext::w
int w
Definition: vsrc_testsrc.c:55
AV_PIX_FMT_P412
#define AV_PIX_FMT_P412
Definition: pixfmt.h:619
ff_vsrc_color
const FFFilter ff_vsrc_color
h
h
Definition: vp9dsp_template.c:2070
ff_outlink_frame_wanted
the definition of that something depends on the semantic of the filter The callback must examine the status of the filter s links and proceed accordingly The status of output links is stored in the status_in and status_out fields and tested by the ff_outlink_frame_wanted() function. If this function returns true
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:549
av_image_check_size
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:318
TestSourceContext::draw
FFDrawContext draw
Definition: vsrc_testsrc.c:81
width
#define width
Definition: dsp.h:89
drawutils.h
ff_vsrc_rgbtestsrc
const FFFilter ff_vsrc_rgbtestsrc
AV_PIX_FMT_VUYX
@ AV_PIX_FMT_VUYX
packed VUYX 4:4:4:4, 32bpp, Variant of VUYA where alpha channel is left undefined
Definition: pixfmt.h:406
ff_vsrc_pal75bars
const FFFilter ff_vsrc_pal75bars
TestSourceContext::ayuv_map
uint8_t ayuv_map[4]
Definition: vsrc_testsrc.c:75
AV_RB24
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
Definition: bytestream.h:97
AV_PIX_FMT_VYU444
@ AV_PIX_FMT_VYU444
packed VYU 4:4:4, 24bpp (1 Cr & Cb sample per 1x1 Y), VYUVYU...
Definition: pixfmt.h:446
AVCOL_SPC_BT709
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition: pixfmt.h:702
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
FILTER_SINGLE_PIXFMT
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition: filters.h:253
snprintf
#define snprintf
Definition: snprintf.h:34
TestSourceContext::fill_picture_fn
void(* fill_picture_fn)(AVFilterContext *ctx, AVFrame *frame)
Definition: vsrc_testsrc.c:66
ff_vsrc_smptehdbars
const FFFilter ff_vsrc_smptehdbars
AVPixFmtDescriptor::log2_chroma_h
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:89
line
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Definition: swscale.txt:40
TestSourceContext::pw
int pw
Definition: vsrc_testsrc.c:56
TestSourceContext::depth
int depth
Definition: vsrc_testsrc.c:88
COMMON_OPTIONS_NOSIZE
#define COMMON_OPTIONS_NOSIZE
Definition: vsrc_testsrc.c:111
AV_PIX_FMT_RGB444
#define AV_PIX_FMT_RGB444
Definition: pixfmt.h:528