FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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 #if FF_API_INTERLACED_FRAME
210  frame->interlaced_frame = 0;
212 #endif
213  frame->flags &= ~AV_FRAME_FLAG_INTERLACED;
214  frame->pict_type = AV_PICTURE_TYPE_I;
215  frame->sample_aspect_ratio = test->sar;
216  if (!test->draw_once)
217  test->fill_picture_fn(outlink->src, frame);
218 
219  test->pts++;
220  test->nb_frame++;
221 
222  return ff_filter_frame(outlink, frame);
223 }
224 
225 #if CONFIG_COLOR_FILTER
226 
227 static const AVOption color_options[] = {
228  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGSR },
229  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGSR },
231  { NULL }
232 };
233 
235 
236 static void color_fill_picture(AVFilterContext *ctx, AVFrame *picref)
237 {
238  TestSourceContext *test = ctx->priv;
239  ff_fill_rectangle(&test->draw, &test->color,
240  picref->data, picref->linesize,
241  0, 0, test->w, test->h);
242 }
243 
244 static av_cold int color_init(AVFilterContext *ctx)
245 {
246  TestSourceContext *test = ctx->priv;
247  test->fill_picture_fn = color_fill_picture;
248  test->draw_once = 1;
249  return init(ctx);
250 }
251 
252 static int color_query_formats(const AVFilterContext *ctx,
253  AVFilterFormatsConfig **cfg_in,
254  AVFilterFormatsConfig **cfg_out)
255 {
256  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_draw_supported_pixel_formats(0));
257 }
258 
259 static int color_config_props(AVFilterLink *inlink)
260 {
261  AVFilterContext *ctx = inlink->src;
262  TestSourceContext *test = ctx->priv;
263  int ret;
264 
265  ret = ff_draw_init2(&test->draw, inlink->format, inlink->colorspace,
266  inlink->color_range, 0);
267  if (ret < 0) {
268  av_log(ctx, AV_LOG_ERROR, "Failed to initialize FFDrawContext\n");
269  return ret;
270  }
271 
272  ff_draw_color(&test->draw, &test->color, test->color_rgba);
273 
274  if (av_image_check_size(test->w, test->h, 0, ctx) < 0)
275  return AVERROR(EINVAL);
276 
277  if ((ret = config_props(inlink)) < 0)
278  return ret;
279 
280  return 0;
281 }
282 
283 static int color_process_command(AVFilterContext *ctx, const char *cmd, const char *args,
284  char *res, int res_len, int flags)
285 {
286  TestSourceContext *test = ctx->priv;
287  int ret;
288 
289  ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
290  if (ret < 0)
291  return ret;
292 
293  ff_draw_color(&test->draw, &test->color, test->color_rgba);
294  test->draw_once_reset = 1;
295  return 0;
296 }
297 
298 static const AVFilterPad color_outputs[] = {
299  {
300  .name = "default",
301  .type = AVMEDIA_TYPE_VIDEO,
302  .config_props = color_config_props,
303  },
304 };
305 
306 const FFFilter ff_vsrc_color = {
307  .p.name = "color",
308  .p.description = NULL_IF_CONFIG_SMALL("Provide an uniformly colored input."),
309  .p.priv_class = &color_class,
310  .priv_size = sizeof(TestSourceContext),
311  .init = color_init,
312  .uninit = uninit,
313  .activate = activate,
314  FILTER_OUTPUTS(color_outputs),
315  FILTER_QUERY_FUNC2(color_query_formats),
316  .process_command = color_process_command,
317 };
318 
319 #endif /* CONFIG_COLOR_FILTER */
320 
321 #if CONFIG_HALDCLUTSRC_FILTER
322 
323 static const AVOption haldclutsrc_options[] = {
324  { "level", "set level", OFFSET(level), AV_OPT_TYPE_INT, {.i64 = 6}, 2, 16, FLAGS },
326  { NULL }
327 };
328 
329 AVFILTER_DEFINE_CLASS(haldclutsrc);
330 
331 static void haldclutsrc_fill_picture(AVFilterContext *ctx, AVFrame *frame)
332 {
333  int i, j, k, x = 0, y = 0, is16bit = 0, step;
334  uint32_t alpha = 0;
335  const TestSourceContext *hc = ctx->priv;
336  int level = hc->level;
337  float scale;
338  const int w = frame->width;
339  const int h = frame->height;
340  uint8_t *data = frame->data[0];
341  const ptrdiff_t linesize = frame->linesize[0];
343  const int depth = desc->comp[0].depth;
344  const int planar = desc->flags & AV_PIX_FMT_FLAG_PLANAR;
345  const int planes = av_pix_fmt_count_planes(frame->format);
346  uint8_t rgba_map[4];
347 
348  av_assert0(w == h && w == level*level*level);
349 
350  ff_fill_rgba_map(rgba_map, frame->format);
351 
352  alpha = (1 << depth) - 1;
353  is16bit = depth > 8;
354 
355  step = av_get_padded_bits_per_pixel(desc) >> (3 + is16bit);
356  scale = ((float)alpha) / (level*level - 1);
357 
358 #define LOAD_CLUT(nbits) do { \
359  uint##nbits##_t *dst = ((uint##nbits##_t *)(data + y*linesize)) + x*step; \
360  dst[rgba_map[0]] = av_clip_uint##nbits(i * scale); \
361  dst[rgba_map[1]] = av_clip_uint##nbits(j * scale); \
362  dst[rgba_map[2]] = av_clip_uint##nbits(k * scale); \
363  if (step == 4) \
364  dst[rgba_map[3]] = alpha; \
365 } while (0)
366 
367 #define LOAD_CLUT_PLANAR(type, nbits) do { \
368  type *dst = ((type *)(frame->data[2] + y*frame->linesize[2])) + x; \
369  dst[0] = av_clip_uintp2(i * scale, nbits); \
370  dst = ((type *)(frame->data[0] + y*frame->linesize[0])) + x; \
371  dst[0] = av_clip_uintp2(j * scale, nbits); \
372  dst = ((type *)(frame->data[1] + y*frame->linesize[1])) + x; \
373  dst[0] = av_clip_uintp2(k * scale, nbits); \
374  if (planes == 4) { \
375  dst = ((type *)(frame->data[3] + y*linesize)) + x; \
376  dst[0] = alpha; \
377  } \
378 } while (0)
379 
380  level *= level;
381  for (k = 0; k < level; k++) {
382  for (j = 0; j < level; j++) {
383  for (i = 0; i < level; i++) {
384  if (!planar) {
385  if (!is16bit)
386  LOAD_CLUT(8);
387  else
388  LOAD_CLUT(16);
389  } else {
390  switch (depth) {
391  case 8: LOAD_CLUT_PLANAR(uint8_t, 8); break;
392  case 9: LOAD_CLUT_PLANAR(uint16_t, 9); break;
393  case 10: LOAD_CLUT_PLANAR(uint16_t,10); break;
394  case 12: LOAD_CLUT_PLANAR(uint16_t,12); break;
395  case 14: LOAD_CLUT_PLANAR(uint16_t,14); break;
396  case 16: LOAD_CLUT_PLANAR(uint16_t,16); break;
397  }
398  }
399  if (++x == w) {
400  x = 0;
401  y++;
402  }
403  }
404  }
405  }
406 }
407 
408 static av_cold int haldclutsrc_init(AVFilterContext *ctx)
409 {
410  TestSourceContext *hc = ctx->priv;
411  hc->fill_picture_fn = haldclutsrc_fill_picture;
412  hc->draw_once = 1;
413  return init(ctx);
414 }
415 
416 static const enum AVPixelFormat haldclutsrc_pix_fmts[] = {
431 };
432 
433 static int haldclutsrc_config_props(AVFilterLink *outlink)
434 {
435  AVFilterContext *ctx = outlink->src;
436  TestSourceContext *hc = ctx->priv;
437 
438  hc->w = hc->h = hc->level * hc->level * hc->level;
439  return config_props(outlink);
440 }
441 
442 static const AVFilterPad haldclutsrc_outputs[] = {
443  {
444  .name = "default",
445  .type = AVMEDIA_TYPE_VIDEO,
446  .config_props = haldclutsrc_config_props,
447  },
448 };
449 
451  .p.name = "haldclutsrc",
452  .p.description = NULL_IF_CONFIG_SMALL("Provide an identity Hald CLUT."),
453  .p.priv_class = &haldclutsrc_class,
454  .priv_size = sizeof(TestSourceContext),
455  .init = haldclutsrc_init,
456  .uninit = uninit,
457  .activate = activate,
458  FILTER_OUTPUTS(haldclutsrc_outputs),
459  FILTER_PIXFMTS_ARRAY(haldclutsrc_pix_fmts),
460 };
461 #endif /* CONFIG_HALDCLUTSRC_FILTER */
462 
463 AVFILTER_DEFINE_CLASS_EXT(nullsrc_yuvtestsrc, "nullsrc/yuvtestsrc", options);
464 
465 #if CONFIG_NULLSRC_FILTER
466 
467 static void nullsrc_fill_picture(AVFilterContext *ctx, AVFrame *picref) { }
468 
469 static av_cold int nullsrc_init(AVFilterContext *ctx)
470 {
471  TestSourceContext *test = ctx->priv;
472 
473  test->fill_picture_fn = nullsrc_fill_picture;
474  return init(ctx);
475 }
476 
477 const FFFilter ff_vsrc_nullsrc = {
478  .p.name = "nullsrc",
479  .p.description= NULL_IF_CONFIG_SMALL("Null video source, return unprocessed video frames."),
480  .p.priv_class= &nullsrc_yuvtestsrc_class,
481  .init = nullsrc_init,
482  .uninit = uninit,
483  .activate = activate,
484  .priv_size = sizeof(TestSourceContext),
486 };
487 
488 #endif /* CONFIG_NULLSRC_FILTER */
489 
490 #if CONFIG_TESTSRC_FILTER
491 
492 static const AVOption testsrc_options[] = {
494  { "decimals", "set number of decimals to show", OFFSET(nb_decimals), AV_OPT_TYPE_INT, {.i64=0}, 0, 17, FLAGS },
495  { "n", "set number of decimals to show", OFFSET(nb_decimals), AV_OPT_TYPE_INT, {.i64=0}, 0, 17, FLAGS },
496  { NULL }
497 };
498 
499 AVFILTER_DEFINE_CLASS(testsrc);
500 
501 /**
502  * Fill a rectangle with value val.
503  *
504  * @param val the RGB value to set
505  * @param dst pointer to the destination buffer to fill
506  * @param dst_linesize linesize of destination
507  * @param segment_width width of the segment
508  * @param x horizontal coordinate where to draw the rectangle in the destination buffer
509  * @param y horizontal coordinate where to draw the rectangle in the destination buffer
510  * @param w width of the rectangle to draw, expressed as a number of segment_width units
511  * @param h height of the rectangle to draw, expressed as a number of segment_width units
512  */
513 static void draw_rectangle(unsigned val, uint8_t *dst, ptrdiff_t dst_linesize, int segment_width,
514  int x, int y, int w, int h)
515 {
516  int i;
517  int step = 3;
518 
519  dst += segment_width * (step * x + y * dst_linesize);
520  w *= segment_width * step;
521  h *= segment_width;
522  for (i = 0; i < h; i++) {
523  memset(dst, val, w);
524  dst += dst_linesize;
525  }
526 }
527 
528 static void draw_digit(int digit, uint8_t *dst, ptrdiff_t dst_linesize,
529  int segment_width)
530 {
531 #define TOP_HBAR 1
532 #define MID_HBAR 2
533 #define BOT_HBAR 4
534 #define LEFT_TOP_VBAR 8
535 #define LEFT_BOT_VBAR 16
536 #define RIGHT_TOP_VBAR 32
537 #define RIGHT_BOT_VBAR 64
538  struct segments {
539  int x, y, w, h;
540  } segments[] = {
541  { 1, 0, 5, 1 }, /* TOP_HBAR */
542  { 1, 6, 5, 1 }, /* MID_HBAR */
543  { 1, 12, 5, 1 }, /* BOT_HBAR */
544  { 0, 1, 1, 5 }, /* LEFT_TOP_VBAR */
545  { 0, 7, 1, 5 }, /* LEFT_BOT_VBAR */
546  { 6, 1, 1, 5 }, /* RIGHT_TOP_VBAR */
547  { 6, 7, 1, 5 } /* RIGHT_BOT_VBAR */
548  };
549  static const unsigned char masks[10] = {
550  /* 0 */ TOP_HBAR |BOT_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR|RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
551  /* 1 */ RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
552  /* 2 */ TOP_HBAR|MID_HBAR|BOT_HBAR|LEFT_BOT_VBAR |RIGHT_TOP_VBAR,
553  /* 3 */ TOP_HBAR|MID_HBAR|BOT_HBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
554  /* 4 */ MID_HBAR |LEFT_TOP_VBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
555  /* 5 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR |RIGHT_BOT_VBAR,
556  /* 6 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR |RIGHT_BOT_VBAR,
557  /* 7 */ TOP_HBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
558  /* 8 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR|LEFT_BOT_VBAR|RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
559  /* 9 */ TOP_HBAR|BOT_HBAR|MID_HBAR|LEFT_TOP_VBAR |RIGHT_TOP_VBAR|RIGHT_BOT_VBAR,
560  };
561  unsigned mask = masks[digit];
562  int i;
563 
564  draw_rectangle(0, dst, dst_linesize, segment_width, 0, 0, 8, 13);
565  for (i = 0; i < FF_ARRAY_ELEMS(segments); i++)
566  if (mask & (1<<i))
567  draw_rectangle(255, dst, dst_linesize, segment_width,
568  segments[i].x, segments[i].y, segments[i].w, segments[i].h);
569 }
570 
571 #define GRADIENT_SIZE (6 * 256)
572 
573 static void test_fill_picture(AVFilterContext *ctx, AVFrame *frame)
574 {
575  TestSourceContext *test = ctx->priv;
576  uint8_t *p, *p0;
577  int x, y;
578  int color, color_rest;
579  int icolor;
580  int radius;
581  int quad0, quad;
582  int dquad_x, dquad_y;
583  int grad, dgrad, rgrad, drgrad;
584  int seg_size;
585  int second;
586  int i;
587  uint8_t *data = frame->data[0];
588  int width = frame->width;
589  int height = frame->height;
590 
591  /* draw colored bars and circle */
592  radius = (width + height) / 4;
593  quad0 = width * width / 4 + height * height / 4 - radius * radius;
594  dquad_y = 1 - height;
595  p0 = data;
596  for (y = 0; y < height; y++) {
597  p = p0;
598  color = 0;
599  color_rest = 0;
600  quad = quad0;
601  dquad_x = 1 - width;
602  for (x = 0; x < width; x++) {
603  icolor = color;
604  if (quad < 0)
605  icolor ^= 7;
606  quad += dquad_x;
607  dquad_x += 2;
608  *(p++) = icolor & 1 ? 255 : 0;
609  *(p++) = icolor & 2 ? 255 : 0;
610  *(p++) = icolor & 4 ? 255 : 0;
611  color_rest += 8;
612  if (color_rest >= width) {
613  color_rest -= width;
614  color++;
615  }
616  }
617  quad0 += dquad_y;
618  dquad_y += 2;
619  p0 += frame->linesize[0];
620  }
621 
622  /* draw sliding color line */
623  p0 = p = data + frame->linesize[0] * (height * 3/4);
624  grad = (256 * test->nb_frame * test->time_base.num / test->time_base.den) %
625  GRADIENT_SIZE;
626  rgrad = 0;
627  dgrad = GRADIENT_SIZE / width;
628  drgrad = GRADIENT_SIZE % width;
629  for (x = 0; x < width; x++) {
630  *(p++) =
631  grad < 256 || grad >= 5 * 256 ? 255 :
632  grad >= 2 * 256 && grad < 4 * 256 ? 0 :
633  grad < 2 * 256 ? 2 * 256 - 1 - grad : grad - 4 * 256;
634  *(p++) =
635  grad >= 4 * 256 ? 0 :
636  grad >= 1 * 256 && grad < 3 * 256 ? 255 :
637  grad < 1 * 256 ? grad : 4 * 256 - 1 - grad;
638  *(p++) =
639  grad < 2 * 256 ? 0 :
640  grad >= 3 * 256 && grad < 5 * 256 ? 255 :
641  grad < 3 * 256 ? grad - 2 * 256 : 6 * 256 - 1 - grad;
642  grad += dgrad;
643  rgrad += drgrad;
644  if (rgrad >= GRADIENT_SIZE) {
645  grad++;
646  rgrad -= GRADIENT_SIZE;
647  }
648  if (grad >= GRADIENT_SIZE)
649  grad -= GRADIENT_SIZE;
650  }
651  p = p0;
652  for (y = height / 8; y > 0; y--) {
653  memcpy(p+frame->linesize[0], p, 3 * width);
654  p += frame->linesize[0];
655  }
656 
657  /* draw digits */
658  seg_size = width / 80;
659  if (seg_size >= 1 && height >= 13 * seg_size) {
660  int64_t p10decimals = 1;
661  double time = av_q2d(test->time_base) * test->nb_frame *
662  ff_exp10(test->nb_decimals);
663  if (time >= INT_MAX)
664  return;
665 
666  for (x = 0; x < test->nb_decimals; x++)
667  p10decimals *= 10;
668 
669  second = av_rescale_rnd(test->nb_frame * test->time_base.num, p10decimals, test->time_base.den, AV_ROUND_ZERO);
670  x = width - (width - seg_size * 64) / 2;
671  y = (height - seg_size * 13) / 2;
672  p = data + (x*3 + y * frame->linesize[0]);
673  for (i = 0; i < 8; i++) {
674  p -= 3 * 8 * seg_size;
675  draw_digit(second % 10, p, frame->linesize[0], seg_size);
676  second /= 10;
677  if (second == 0)
678  break;
679  }
680  }
681 }
682 
683 static av_cold int test_init(AVFilterContext *ctx)
684 {
685  TestSourceContext *test = ctx->priv;
686 
687  test->fill_picture_fn = test_fill_picture;
688  return init(ctx);
689 }
690 
691 const FFFilter ff_vsrc_testsrc = {
692  .p.name = "testsrc",
693  .p.description = NULL_IF_CONFIG_SMALL("Generate test pattern."),
694  .p.priv_class = &testsrc_class,
695  .priv_size = sizeof(TestSourceContext),
696  .init = test_init,
697  .uninit = uninit,
698  .activate = activate,
701 };
702 
703 #endif /* CONFIG_TESTSRC_FILTER */
704 
705 static void av_unused set_color(TestSourceContext *s, FFDrawColor *color, uint32_t argb)
706 {
707  uint8_t rgba[4] = { (argb >> 16) & 0xFF,
708  (argb >> 8) & 0xFF,
709  (argb >> 0) & 0xFF,
710  (argb >> 24) & 0xFF, };
711  ff_draw_color(&s->draw, color, rgba);
712 }
713 
714 #if CONFIG_TESTSRC2_FILTER
715 
716 static const AVOption testsrc2_options[] = {
718  { "alpha", "set global alpha (opacity)", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 255}, 0, 255, FLAGS },
719  { NULL }
720 };
721 
722 AVFILTER_DEFINE_CLASS(testsrc2);
723 
724 static uint32_t color_gradient(unsigned index)
725 {
726  unsigned si = index & 0xFF, sd = 0xFF - si;
727  switch (index >> 8) {
728  case 0: return 0xFF0000 + (si << 8);
729  case 1: return 0x00FF00 + (sd << 16);
730  case 2: return 0x00FF00 + (si << 0);
731  case 3: return 0x0000FF + (sd << 8);
732  case 4: return 0x0000FF + (si << 16);
733  case 5: return 0xFF0000 + (sd << 0);
734  default: av_assert0(0); return 0;
735  }
736 }
737 
739  int x0, int y0, const uint8_t *text)
740 {
741  int x = x0;
742 
743  for (; *text; text++) {
744  if (*text == '\n') {
745  x = x0;
746  y0 += 16;
747  continue;
748  }
749  ff_blend_mask(&s->draw, color, frame->data, frame->linesize,
750  frame->width, frame->height,
751  avpriv_vga16_font + *text * 16, 1, 8, 16, 0, 0, x, y0);
752  x += 8;
753  }
754 }
755 
756 static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
757 {
758  TestSourceContext *s = ctx->priv;
760  unsigned alpha = (uint32_t)s->alpha << 24;
761 
762  /* colored background */
763  {
764  unsigned i, x = 0, x2;
765 
766  x = 0;
767  for (i = 1; i < 7; i++) {
768  x2 = av_rescale(i, s->w, 6);
769  x2 = ff_draw_round_to_sub(&s->draw, 0, 0, x2);
770  set_color(s, &color, ((i & 1) ? 0xFF0000 : 0) |
771  ((i & 2) ? 0x00FF00 : 0) |
772  ((i & 4) ? 0x0000FF : 0) |
773  alpha);
774  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
775  x, 0, x2 - x, frame->height);
776  x = x2;
777  }
778  }
779 
780  /* oblique gradient */
781  /* note: too slow if using blending */
782  if (s->h >= 64) {
783  unsigned x, dx, y0, y, g0, g;
784 
785  dx = ff_draw_round_to_sub(&s->draw, 0, +1, 1);
786  y0 = av_rescale_q(s->pts, s->time_base, av_make_q(2, s->h - 16));
787  g0 = av_rescale_q(s->pts, s->time_base, av_make_q(1, 128));
788  for (x = 0; x < s->w; x += dx) {
789  g = (av_rescale(x, 6 * 256, s->w) + g0) % (6 * 256);
790  set_color(s, &color, color_gradient(g) | alpha);
791  y = y0 + av_rescale(x, s->h / 2, s->w);
792  y %= 2 * (s->h - 16);
793  if (y > s->h - 16)
794  y = 2 * (s->h - 16) - y;
795  y = ff_draw_round_to_sub(&s->draw, 1, 0, y);
796  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
797  x, y, dx, 16);
798  }
799  }
800 
801  /* top right: draw clock hands */
802  if (s->w >= 64 && s->h >= 64) {
803  int l = (FFMIN(s->w, s->h) - 32) >> 1;
804  int steps = FFMAX(4, l >> 5);
805  int xc = (s->w >> 2) + (s->w >> 1);
806  int yc = (s->h >> 2);
807  int cycle = l << 2;
808  int pos, xh, yh;
809  int c, i;
810 
811  for (c = 0; c < 3; c++) {
812  set_color(s, &color, (0xBBBBBB ^ (0xFF << (c << 3))) | alpha);
813  pos = av_rescale_q(s->pts, s->time_base, av_make_q(64 >> (c << 1), cycle)) % cycle;
814  xh = pos < 1 * l ? pos :
815  pos < 2 * l ? l :
816  pos < 3 * l ? 3 * l - pos : 0;
817  yh = pos < 1 * l ? 0 :
818  pos < 2 * l ? pos - l :
819  pos < 3 * l ? l :
820  cycle - pos;
821  xh -= l >> 1;
822  yh -= l >> 1;
823  for (i = 1; i <= steps; i++) {
824  int x = av_rescale(xh, i, steps) + xc;
825  int y = av_rescale(yh, i, steps) + yc;
826  x = ff_draw_round_to_sub(&s->draw, 0, -1, x);
827  y = ff_draw_round_to_sub(&s->draw, 1, -1, y);
828  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
829  x, y, 8, 8);
830  }
831  }
832  }
833 
834  /* bottom left: beating rectangles */
835  if (s->w >= 64 && s->h >= 64) {
836  int l = (FFMIN(s->w, s->h) - 16) >> 2;
837  int cycle = l << 3;
838  int xc = (s->w >> 2);
839  int yc = (s->h >> 2) + (s->h >> 1);
840  int xm1 = ff_draw_round_to_sub(&s->draw, 0, -1, xc - 8);
841  int xm2 = ff_draw_round_to_sub(&s->draw, 0, +1, xc + 8);
842  int ym1 = ff_draw_round_to_sub(&s->draw, 1, -1, yc - 8);
843  int ym2 = ff_draw_round_to_sub(&s->draw, 1, +1, yc + 8);
844  int size, step, x1, x2, y1, y2;
845 
846  size = av_rescale_q(s->pts, s->time_base, av_make_q(4, cycle));
847  step = size / l;
848  size %= l;
849  if (step & 1)
850  size = l - size;
851  step = (step >> 1) & 3;
852  set_color(s, &color, 0xFF808080);
853  x1 = ff_draw_round_to_sub(&s->draw, 0, -1, xc - 4 - size);
854  x2 = ff_draw_round_to_sub(&s->draw, 0, +1, xc + 4 + size);
855  y1 = ff_draw_round_to_sub(&s->draw, 1, -1, yc - 4 - size);
856  y2 = ff_draw_round_to_sub(&s->draw, 1, +1, yc + 4 + size);
857  if (step == 0 || step == 2)
858  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
859  x1, ym1, x2 - x1, ym2 - ym1);
860  if (step == 1 || step == 2)
861  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
862  xm1, y1, xm2 - xm1, y2 - y1);
863  if (step == 3)
864  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
865  x1, y1, x2 - x1, y2 - y1);
866  }
867 
868  /* bottom right: checker with random noise */
869  {
870  unsigned xmin = av_rescale(5, s->w, 8);
871  unsigned xmax = av_rescale(7, s->w, 8);
872  unsigned ymin = av_rescale(5, s->h, 8);
873  unsigned ymax = av_rescale(7, s->h, 8);
874  unsigned x, y, i, r;
875  uint8_t alpha[256];
876 
877  r = s->pts;
878  for (y = ymin; y + 15 < ymax; y += 16) {
879  for (x = xmin; x + 15 < xmax; x += 16) {
880  if ((x ^ y) & 16)
881  continue;
882  for (i = 0; i < 256; i++) {
883  r = r * 1664525 + 1013904223;
884  alpha[i] = r >> 24;
885  }
886  set_color(s, &color, 0xFF00FF80);
887  ff_blend_mask(&s->draw, &color, frame->data, frame->linesize,
888  frame->width, frame->height,
889  alpha, 16, 16, 16, 3, 0, x, y);
890  }
891  }
892  }
893 
894  /* bouncing square */
895  if (s->w >= 16 && s->h >= 16) {
896  unsigned w = s->w - 8;
897  unsigned h = s->h - 8;
898  unsigned x = av_rescale_q(s->pts, s->time_base, av_make_q(233, 55 * w)) % (w << 1);
899  unsigned y = av_rescale_q(s->pts, s->time_base, av_make_q(233, 89 * h)) % (h << 1);
900  if (x > w)
901  x = (w << 1) - x;
902  if (y > h)
903  y = (h << 1) - y;
904  x = ff_draw_round_to_sub(&s->draw, 0, -1, x);
905  y = ff_draw_round_to_sub(&s->draw, 1, -1, y);
906  set_color(s, &color, 0xFF8000FF);
907  ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
908  x, y, 8, 8);
909  }
910 
911  /* top right: draw frame time and frame number */
912  {
913  char buf[256];
914  unsigned time;
915 
916  time = av_rescale_q(s->pts, s->time_base, av_make_q(1, 1000)) % 86400000;
917  set_color(s, &color, 0xC0000000);
918  ff_blend_rectangle(&s->draw, &color, frame->data, frame->linesize,
919  frame->width, frame->height,
920  2, 2, 100, 36);
921  set_color(s, &color, 0xFFFF8000);
922  snprintf(buf, sizeof(buf), "%02d:%02d:%02d.%03d\n%12"PRIi64,
923  time / 3600000, (time / 60000) % 60, (time / 1000) % 60,
924  time % 1000, s->pts);
925  draw_text(s, frame, &color, 4, 4, buf);
926  }
927 }
928 static av_cold int test2_init(AVFilterContext *ctx)
929 {
930  TestSourceContext *s = ctx->priv;
931 
932  s->fill_picture_fn = test2_fill_picture;
933  return init(ctx);
934 }
935 
936 static int test2_query_formats(const AVFilterContext *ctx,
937  AVFilterFormatsConfig **cfg_in,
938  AVFilterFormatsConfig **cfg_out)
939 {
940  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_draw_supported_pixel_formats(0));
941 }
942 
943 static int test2_config_props(AVFilterLink *inlink)
944 {
945  AVFilterContext *ctx = inlink->src;
946  TestSourceContext *s = ctx->priv;
947 
948  av_assert0(ff_draw_init2(&s->draw, inlink->format, inlink->colorspace,
949  inlink->color_range, 0) >= 0);
950  s->w = ff_draw_round_to_sub(&s->draw, 0, -1, s->w);
951  s->h = ff_draw_round_to_sub(&s->draw, 1, -1, s->h);
952  if (av_image_check_size(s->w, s->h, 0, ctx) < 0)
953  return AVERROR(EINVAL);
954  return config_props(inlink);
955 }
956 
957 static const AVFilterPad avfilter_vsrc_testsrc2_outputs[] = {
958  {
959  .name = "default",
960  .type = AVMEDIA_TYPE_VIDEO,
961  .config_props = test2_config_props,
962  },
963 };
964 
965 const FFFilter ff_vsrc_testsrc2 = {
966  .p.name = "testsrc2",
967  .p.description = NULL_IF_CONFIG_SMALL("Generate another test pattern."),
968  .p.priv_class = &testsrc2_class,
969  .priv_size = sizeof(TestSourceContext),
970  .init = test2_init,
971  .uninit = uninit,
972  .activate = activate,
973  FILTER_OUTPUTS(avfilter_vsrc_testsrc2_outputs),
974  FILTER_QUERY_FUNC2(test2_query_formats),
975 };
976 
977 #endif /* CONFIG_TESTSRC2_FILTER */
978 
979 #if CONFIG_RGBTESTSRC_FILTER
980 
981 static const AVOption rgbtestsrc_options[] = {
983  { "complement", "set complement colors", OFFSET(complement), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
984  { "co", "set complement colors", OFFSET(complement), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
985  { NULL }
986 };
987 
988 AVFILTER_DEFINE_CLASS(rgbtestsrc);
989 
990 #define R 0
991 #define G 1
992 #define B 2
993 #define A 3
994 
995 static void rgbtest_put_pixel(uint8_t *dstp[4], int dst_linesizep[4],
996  int x, int y, unsigned r, unsigned g, unsigned b, enum AVPixelFormat fmt,
997  uint8_t rgba_map[4])
998 {
1000  uint8_t *dst = dstp[0];
1001  ptrdiff_t dst_linesize = dst_linesizep[0];
1002  uint32_t v;
1003  uint64_t v16;
1004  uint8_t *p;
1005  uint16_t *p16;
1006 
1007  switch (fmt) {
1008  case AV_PIX_FMT_BGR444: ((uint16_t*)(dst + y*dst_linesize))[x] = ((r >> 4) << 8) | ((g >> 4) << 4) | (b >> 4); break;
1009  case AV_PIX_FMT_RGB444: ((uint16_t*)(dst + y*dst_linesize))[x] = ((b >> 4) << 8) | ((g >> 4) << 4) | (r >> 4); break;
1010  case AV_PIX_FMT_BGR555: ((uint16_t*)(dst + y*dst_linesize))[x] = ((r>>3)<<10) | ((g>>3)<<5) | (b>>3); break;
1011  case AV_PIX_FMT_RGB555: ((uint16_t*)(dst + y*dst_linesize))[x] = ((b>>3)<<10) | ((g>>3)<<5) | (r>>3); break;
1012  case AV_PIX_FMT_BGR565: ((uint16_t*)(dst + y*dst_linesize))[x] = ((r>>3)<<11) | ((g>>2)<<5) | (b>>3); break;
1013  case AV_PIX_FMT_RGB565: ((uint16_t*)(dst + y*dst_linesize))[x] = ((b>>3)<<11) | ((g>>2)<<5) | (r>>3); break;
1014  case AV_PIX_FMT_RGB24:
1015  case AV_PIX_FMT_BGR24:
1016  v = (r << (rgba_map[R]*8)) + (g << (rgba_map[G]*8)) + (b << (rgba_map[B]*8));
1017  p = dst + 3*x + y*dst_linesize;
1018  AV_WL24(p, v);
1019  break;
1020  case AV_PIX_FMT_RGB48:
1021  case AV_PIX_FMT_BGR48:
1022  v16 = ((uint64_t)r << (rgba_map[R]*16)) + ((uint64_t)g << (rgba_map[G]*16)) + ((uint64_t)b << (rgba_map[B]*16));
1023  p16 = (uint16_t *)(dst + 6*x + y*dst_linesize);
1024  *p16++ = v16 >> 32;
1025  *p16++ = v16 >> 16;
1026  *p16++ = v16;
1027  break;
1028  case AV_PIX_FMT_RGBA64:
1029  case AV_PIX_FMT_BGRA64:
1030  v16 = ((uint64_t)r << (rgba_map[R]*16)) + ((uint64_t)g << (rgba_map[G]*16)) + ((uint64_t)b << (rgba_map[B]*16));
1031  p16 = (uint16_t *)(dst + 8*x + y*dst_linesize);
1032  *p16++ = v16 >> 32;
1033  *p16++ = v16 >> 16;
1034  *p16++ = v16;
1035  *p16++ = 0xffff;
1036  break;
1037  case AV_PIX_FMT_RGBA:
1038  case AV_PIX_FMT_BGRA:
1039  case AV_PIX_FMT_ARGB:
1040  case AV_PIX_FMT_ABGR:
1041  v = (r << (rgba_map[R]*8)) + (g << (rgba_map[G]*8)) + (b << (rgba_map[B]*8)) + (255U << (rgba_map[A]*8));
1042  p = dst + 4*x + y*dst_linesize;
1043  AV_WL32A(p, v);
1044  break;
1045  case AV_PIX_FMT_X2RGB10LE:
1046  case AV_PIX_FMT_X2BGR10LE:
1047  v = (r << ((desc->comp[0].offset*8) + desc->comp[0].shift)) +
1048  (g << ((desc->comp[1].offset*8) + desc->comp[1].shift)) +
1049  (b << ((desc->comp[2].offset*8) + desc->comp[2].shift)) +
1050  (3U << ((desc->comp[3].offset*8) + desc->comp[3].shift));
1051  p = dst + 4*x + y*dst_linesize;
1052  AV_WL32A(p, v);
1053  break;
1054  case AV_PIX_FMT_GBRP:
1055  p = dstp[0] + x + y * dst_linesize;
1056  p[0] = g;
1057  p = dstp[1] + x + y * dst_linesizep[1];
1058  p[0] = b;
1059  p = dstp[2] + x + y * dst_linesizep[2];
1060  p[0] = r;
1061  break;
1062  case AV_PIX_FMT_GBRP9:
1063  case AV_PIX_FMT_GBRP10:
1064  case AV_PIX_FMT_GBRP12:
1065  case AV_PIX_FMT_GBRP14:
1066  case AV_PIX_FMT_GBRP16:
1067  p16 = (uint16_t *)(dstp[0] + x*2 + y * dst_linesizep[0]);
1068  p16[0] = g;
1069  p16 = (uint16_t *)(dstp[1] + x*2 + y * dst_linesizep[1]);
1070  p16[0] = b;
1071  p16 = (uint16_t *)(dstp[2] + x*2 + y * dst_linesizep[2]);
1072  p16[0] = r;
1073  break;
1074  }
1075 }
1076 
1077 static void rgbtest_fill_picture_complement(AVFilterContext *ctx, AVFrame *frame)
1078 {
1079  TestSourceContext *test = ctx->priv;
1080  int x, y, w = frame->width, h = frame->height;
1081 
1082  for (y = 0; y < h; y++) {
1083  for (x = 0; x < w; x++) {
1084  int c = (1 << FFMAX(test->depth, 8))*x/w;
1085  int r = 0, g = 0, b = 0;
1086 
1087  if (6*y < h ) r = c;
1088  else if (6*y < 2*h) g = c, b = c;
1089  else if (6*y < 3*h) g = c;
1090  else if (6*y < 4*h) r = c, b = c;
1091  else if (6*y < 5*h) b = c;
1092  else r = c, g = c;
1093 
1094  rgbtest_put_pixel(frame->data, frame->linesize, x, y, r, g, b,
1095  ctx->outputs[0]->format, test->rgba_map);
1096  }
1097  }
1098 }
1099 
1100 static void rgbtest_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1101 {
1102  TestSourceContext *test = ctx->priv;
1103  int x, y, w = frame->width, h = frame->height;
1104 
1105  for (y = 0; y < h; y++) {
1106  for (x = 0; x < w; x++) {
1107  int c = (1 << FFMAX(test->depth, 8))*x/w;
1108  int r = 0, g = 0, b = 0;
1109 
1110  if (3*y < h ) r = c;
1111  else if (3*y < 2*h) g = c;
1112  else b = c;
1113 
1114  rgbtest_put_pixel(frame->data, frame->linesize, x, y, r, g, b,
1115  ctx->outputs[0]->format, test->rgba_map);
1116  }
1117  }
1118 }
1119 
1120 static av_cold int rgbtest_init(AVFilterContext *ctx)
1121 {
1122  TestSourceContext *test = ctx->priv;
1123 
1124  test->draw_once = 1;
1125  test->fill_picture_fn = test->complement ? rgbtest_fill_picture_complement : rgbtest_fill_picture;
1126  return init(ctx);
1127 }
1128 
1129 static const enum AVPixelFormat rgbtest_pix_fmts[] = {
1141  };
1142 
1143 static int rgbtest_config_props(AVFilterLink *outlink)
1144 {
1145  TestSourceContext *test = outlink->src->priv;
1147 
1148  test->depth = desc->comp[0].depth;
1149  ff_fill_rgba_map(test->rgba_map, outlink->format);
1150  return config_props(outlink);
1151 }
1152 
1153 static const AVFilterPad avfilter_vsrc_rgbtestsrc_outputs[] = {
1154  {
1155  .name = "default",
1156  .type = AVMEDIA_TYPE_VIDEO,
1157  .config_props = rgbtest_config_props,
1158  },
1159 };
1160 
1161 const FFFilter ff_vsrc_rgbtestsrc = {
1162  .p.name = "rgbtestsrc",
1163  .p.description = NULL_IF_CONFIG_SMALL("Generate RGB test pattern."),
1164  .p.priv_class = &rgbtestsrc_class,
1165  .priv_size = sizeof(TestSourceContext),
1166  .init = rgbtest_init,
1167  .uninit = uninit,
1168  .activate = activate,
1169  FILTER_OUTPUTS(avfilter_vsrc_rgbtestsrc_outputs),
1170  FILTER_PIXFMTS_ARRAY(rgbtest_pix_fmts),
1171 };
1172 
1173 #undef R
1174 #undef G
1175 #undef B
1176 #undef A
1177 
1178 #endif /* CONFIG_RGBTESTSRC_FILTER */
1179 
1180 #if CONFIG_YUVTESTSRC_FILTER
1181 
1182 #define Y 0
1183 #define U 1
1184 #define V 2
1185 #define A 3
1186 
1187 static void yuvtest_put_pixel(uint8_t *dstp[4], int dst_linesizep[4],
1188  int i, int j, unsigned y, unsigned u, unsigned v, enum AVPixelFormat fmt,
1189  uint8_t ayuv_map[4])
1190 {
1192  uint32_t n;
1193 
1194  switch (fmt) {
1195  case AV_PIX_FMT_VYU444:
1196  n = (y << (ayuv_map[Y]*8)) + (u << (ayuv_map[U]*8)) + (v << (ayuv_map[V]*8));
1197  AV_WL24(&dstp[0][i*3 + j*dst_linesizep[0]], n);
1198  break;
1199  case AV_PIX_FMT_V30XLE:
1200  case AV_PIX_FMT_XV30LE:
1201  n = (y << ((desc->comp[0].offset*8) + desc->comp[0].shift)) +
1202  (u << ((desc->comp[1].offset*8) + desc->comp[1].shift)) +
1203  (v << ((desc->comp[2].offset*8) + desc->comp[2].shift)) +
1204  (3U << ((desc->comp[3].offset*8) + desc->comp[3].shift));
1205  AV_WL32A(&dstp[0][i*4 + j*dst_linesizep[0]], n);
1206  break;
1207  case AV_PIX_FMT_XV36:
1208  case AV_PIX_FMT_XV48:
1209  case AV_PIX_FMT_AYUV64:
1210  AV_WN16A(&dstp[0][i*8 + ayuv_map[Y]*2 + j*dst_linesizep[0]], y << desc->comp[0].shift);
1211  AV_WN16A(&dstp[0][i*8 + ayuv_map[U]*2 + j*dst_linesizep[0]], u << desc->comp[1].shift);
1212  AV_WN16A(&dstp[0][i*8 + ayuv_map[V]*2 + j*dst_linesizep[0]], v << desc->comp[2].shift);
1213  AV_WN16A(&dstp[0][i*8 + ayuv_map[A]*2 + j*dst_linesizep[0]], UINT16_MAX << desc->comp[3].shift);
1214  break;
1215  case AV_PIX_FMT_UYVA:
1216  case AV_PIX_FMT_VUYA:
1217  case AV_PIX_FMT_VUYX:
1218  case AV_PIX_FMT_AYUV:
1219  n = (y << (ayuv_map[Y]*8)) + (u << (ayuv_map[U]*8)) + (v << (ayuv_map[V]*8)) + (255U << (ayuv_map[A]*8));
1220  AV_WL32A(&dstp[0][i*4 + j*dst_linesizep[0]], n);
1221  break;
1222  case AV_PIX_FMT_YUV444P:
1223  case AV_PIX_FMT_YUVJ444P:
1224  dstp[0][i + j*dst_linesizep[0]] = y;
1225  dstp[1][i + j*dst_linesizep[1]] = u;
1226  dstp[2][i + j*dst_linesizep[2]] = v;
1227  break;
1228  case AV_PIX_FMT_YUV444P9:
1229  case AV_PIX_FMT_YUV444P10:
1230  case AV_PIX_FMT_YUV444P12:
1231  case AV_PIX_FMT_YUV444P14:
1232  case AV_PIX_FMT_YUV444P16:
1233  AV_WN16A(&dstp[0][i*2 + j*dst_linesizep[0]], y);
1234  AV_WN16A(&dstp[1][i*2 + j*dst_linesizep[1]], u);
1235  AV_WN16A(&dstp[2][i*2 + j*dst_linesizep[2]], v);
1236  break;
1237  case AV_PIX_FMT_NV24:
1238  dstp[0][i + j*dst_linesizep[0] + 0] = y;
1239  dstp[1][i*2 + j*dst_linesizep[1] + 0] = u;
1240  dstp[1][i*2 + j*dst_linesizep[1] + 1] = v;
1241  break;
1242  case AV_PIX_FMT_NV42:
1243  dstp[0][i + j*dst_linesizep[0] + 0] = y;
1244  dstp[1][i*2 + j*dst_linesizep[1] + 1] = u;
1245  dstp[1][i*2 + j*dst_linesizep[1] + 0] = v;
1246  break;
1247  case AV_PIX_FMT_P410:
1248  case AV_PIX_FMT_P412:
1249  case AV_PIX_FMT_P416:
1250  AV_WN16A(&dstp[0][i*2 + j*dst_linesizep[0] + 0], y << (16 - desc->comp[0].depth));
1251  AV_WN16A(&dstp[1][i*4 + j*dst_linesizep[1] + 0], u << (16 - desc->comp[1].depth));
1252  AV_WN16A(&dstp[1][i*4 + j*dst_linesizep[1] + 2], v << (16 - desc->comp[1].depth));
1253  break;
1254  }
1255 }
1256 
1257 static void yuvtest_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1258 {
1259  TestSourceContext *test = ctx->priv;
1260  int i, j, w = frame->width, h = frame->height;
1261  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(ctx->outputs[0]->format);
1262  const int factor = 1 << desc->comp[0].depth;
1263  const int mid = 1 << (desc->comp[0].depth - 1);
1264 
1265  for (j = 0; j < h; j++) {
1266  for (i = 0; i < w; i++) {
1267  int c = factor * i / w;
1268  int y = mid, u = mid, v = mid;
1269 
1270  if (3*j < h ) y = c;
1271  else if (3*j < 2*h) u = c;
1272  else v = c;
1273 
1274  yuvtest_put_pixel(frame->data, frame->linesize, i, j, y, u, v,
1275  ctx->outputs[0]->format, test->ayuv_map);
1276  }
1277  }
1278 }
1279 
1280 static av_cold int yuvtest_init(AVFilterContext *ctx)
1281 {
1282  TestSourceContext *test = ctx->priv;
1283 
1284  test->draw_once = 1;
1285  test->fill_picture_fn = yuvtest_fill_picture;
1286  return init(ctx);
1287 }
1288 
1289 static const enum AVPixelFormat yuvtest_pix_fmts[] = {
1300 };
1301 
1302 static int yuvtest_config_props(AVFilterLink *outlink)
1303 {
1304  TestSourceContext *test = outlink->src->priv;
1305 
1306  ff_fill_ayuv_map(test->ayuv_map, outlink->format);
1307  return config_props(outlink);
1308 }
1309 
1310 static const AVFilterPad avfilter_vsrc_yuvtestsrc_outputs[] = {
1311  {
1312  .name = "default",
1313  .type = AVMEDIA_TYPE_VIDEO,
1314  .config_props = yuvtest_config_props,
1315  },
1316 };
1317 
1318 const FFFilter ff_vsrc_yuvtestsrc = {
1319  .p.name = "yuvtestsrc",
1320  .p.description = NULL_IF_CONFIG_SMALL("Generate YUV test pattern."),
1321  .p.priv_class = &nullsrc_yuvtestsrc_class,
1322  .priv_size = sizeof(TestSourceContext),
1323  .init = yuvtest_init,
1324  .uninit = uninit,
1325  .activate = activate,
1326  FILTER_OUTPUTS(avfilter_vsrc_yuvtestsrc_outputs),
1327  FILTER_PIXFMTS_ARRAY(yuvtest_pix_fmts),
1328 };
1329 
1330 #undef Y
1331 #undef U
1332 #undef V
1333 #undef A
1334 
1335 #endif /* CONFIG_YUVTESTSRC_FILTER */
1336 
1337 #if CONFIG_PAL75BARS_FILTER || CONFIG_PAL100BARS_FILTER || CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER
1338 
1339 static const uint8_t rainbow[7][4] = {
1340  { 180, 128, 128, 255 }, /* 75% white */
1341  { 162, 44, 142, 255 }, /* 75% yellow */
1342  { 131, 156, 44, 255 }, /* 75% cyan */
1343  { 112, 72, 58, 255 }, /* 75% green */
1344  { 84, 184, 198, 255 }, /* 75% magenta */
1345  { 65, 100, 212, 255 }, /* 75% red */
1346  { 35, 212, 114, 255 }, /* 75% blue */
1347 };
1348 
1349 static const uint8_t rainbow100[7][4] = {
1350  { 235, 128, 128, 255 }, /* 100% white */
1351  { 210, 16, 146, 255 }, /* 100% yellow */
1352  { 170, 166, 16, 255 }, /* 100% cyan */
1353  { 145, 54, 34, 255 }, /* 100% green */
1354  { 106, 202, 222, 255 }, /* 100% magenta */
1355  { 81, 90, 240, 255 }, /* 100% red */
1356  { 41, 240, 110, 255 }, /* 100% blue */
1357 };
1358 
1359 static const uint8_t rainbowhd[7][4] = {
1360  { 180, 128, 128, 255 }, /* 75% white */
1361  { 168, 44, 136, 255 }, /* 75% yellow */
1362  { 145, 147, 44, 255 }, /* 75% cyan */
1363  { 133, 63, 52, 255 }, /* 75% green */
1364  { 63, 193, 204, 255 }, /* 75% magenta */
1365  { 51, 109, 212, 255 }, /* 75% red */
1366  { 28, 212, 120, 255 }, /* 75% blue */
1367 };
1368 
1369 static const uint8_t wobnair[7][4] = {
1370  { 35, 212, 114, 255 }, /* 75% blue */
1371  { 19, 128, 128, 255 }, /* 7.5% intensity black */
1372  { 84, 184, 198, 255 }, /* 75% magenta */
1373  { 19, 128, 128, 255 }, /* 7.5% intensity black */
1374  { 131, 156, 44, 255 }, /* 75% cyan */
1375  { 19, 128, 128, 255 }, /* 7.5% intensity black */
1376  { 180, 128, 128, 255 }, /* 75% white */
1377 };
1378 
1379 static const uint8_t white[4] = { 235, 128, 128, 255 };
1380 
1381 /* pluge pulses */
1382 static const uint8_t neg4ire[4] = { 7, 128, 128, 255 };
1383 static const uint8_t pos4ire[4] = { 24, 128, 128, 255 };
1384 
1385 /* fudged Q/-I */
1386 static const uint8_t i_pixel[4] = { 57, 156, 97, 255 };
1387 static const uint8_t q_pixel[4] = { 44, 171, 147, 255 };
1388 
1389 static const uint8_t gray40[4] = { 104, 128, 128, 255 };
1390 static const uint8_t gray15[4] = { 49, 128, 128, 255 };
1391 static const uint8_t cyan[4] = { 188, 154, 16, 255 };
1392 static const uint8_t yellow[4] = { 219, 16, 138, 255 };
1393 static const uint8_t blue[4] = { 32, 240, 118, 255 };
1394 static const uint8_t red[4] = { 63, 102, 240, 255 };
1395 static const uint8_t black0[4] = { 16, 128, 128, 255 };
1396 static const uint8_t black2[4] = { 20, 128, 128, 255 };
1397 static const uint8_t black4[4] = { 25, 128, 128, 255 };
1398 static const uint8_t neg2[4] = { 12, 128, 128, 255 };
1399 
1400 static void draw_bar(TestSourceContext *test, const uint8_t color[4],
1401  int x, int y, int w, int h,
1402  AVFrame *frame)
1403 {
1405  uint8_t *p, *p0;
1406  int plane;
1407 
1408  x = FFMIN(x, test->w - 1);
1409  y = FFMIN(y, test->h - 1);
1410  w = FFMAX(FFMIN(w, test->w - x), 0);
1411  h = FFMAX(FFMIN(h, test->h - y), 0);
1412 
1413  av_assert0(x + w <= test->w);
1414  av_assert0(y + h <= test->h);
1415 
1416  for (plane = 0; frame->data[plane]; plane++) {
1417  const int c = color[plane];
1418  const ptrdiff_t linesize = frame->linesize[plane];
1419  int i, px, py, pw, ph;
1420 
1421  if (plane == 1 || plane == 2) {
1422  px = x >> desc->log2_chroma_w;
1423  pw = AV_CEIL_RSHIFT(w, desc->log2_chroma_w);
1424  py = y >> desc->log2_chroma_h;
1425  ph = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
1426  } else {
1427  px = x;
1428  pw = w;
1429  py = y;
1430  ph = h;
1431  }
1432 
1433  p0 = p = frame->data[plane] + py * linesize + px;
1434  memset(p, c, pw);
1435  p += linesize;
1436  for (i = 1; i < ph; i++, p += linesize)
1437  memcpy(p, p0, pw);
1438  }
1439 }
1440 
1441 static const enum AVPixelFormat smptebars_pix_fmts[] = {
1446 };
1447 
1448 static int smptebars_query_formats(const AVFilterContext *ctx,
1449  AVFilterFormatsConfig **cfg_in,
1450  AVFilterFormatsConfig **cfg_out)
1451 {
1452  enum AVColorSpace csp;
1453  int ret;
1454 
1455  if (!strcmp(ctx->name, "smptehdbars")) {
1456  csp = AVCOL_SPC_BT709;
1457  } else {
1458  csp = AVCOL_SPC_BT470BG;
1459  }
1460 
1461  if ((ret = ff_set_common_color_spaces2(ctx, cfg_in, cfg_out,
1463  return ret;
1464  if ((ret = ff_set_common_color_ranges2(ctx, cfg_in, cfg_out,
1466  return ret;
1467  return ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, smptebars_pix_fmts);
1468 }
1469 
1470 AVFILTER_DEFINE_CLASS_EXT(palbars, "pal(75|100)bars", options);
1471 
1472 #if CONFIG_PAL75BARS_FILTER
1473 
1474 static void pal75bars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1475 {
1476  TestSourceContext *test = ctx->priv;
1477  int r_w, i, x = 0;
1478  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1479 
1480  r_w = FFALIGN((test->w + 7) / 8, 1 << pixdesc->log2_chroma_w);
1481 
1482  draw_bar(test, white, x, 0, r_w, test->h, picref);
1483  x += r_w;
1484  for (i = 1; i < 7; i++) {
1485  draw_bar(test, rainbow[i], x, 0, r_w, test->h, picref);
1486  x += r_w;
1487  }
1488  draw_bar(test, black0, x, 0, r_w, test->h, picref);
1489 }
1490 
1491 static av_cold int pal75bars_init(AVFilterContext *ctx)
1492 {
1493  TestSourceContext *test = ctx->priv;
1494 
1495  test->fill_picture_fn = pal75bars_fill_picture;
1496  test->draw_once = 1;
1497  return init(ctx);
1498 }
1499 
1500 const FFFilter ff_vsrc_pal75bars = {
1501  .p.name = "pal75bars",
1502  .p.description = NULL_IF_CONFIG_SMALL("Generate PAL 75% color bars."),
1503  .p.priv_class = &palbars_class,
1504  .priv_size = sizeof(TestSourceContext),
1505  .init = pal75bars_init,
1506  .uninit = uninit,
1507  .activate = activate,
1509  FILTER_QUERY_FUNC2(smptebars_query_formats),
1510 };
1511 
1512 #endif /* CONFIG_PAL75BARS_FILTER */
1513 
1514 #if CONFIG_PAL100BARS_FILTER
1515 
1516 static void pal100bars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1517 {
1518  TestSourceContext *test = ctx->priv;
1519  int r_w, i, x = 0;
1520  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1521 
1522  r_w = FFALIGN((test->w + 7) / 8, 1 << pixdesc->log2_chroma_w);
1523 
1524  for (i = 0; i < 7; i++) {
1525  draw_bar(test, rainbow100[i], x, 0, r_w, test->h, picref);
1526  x += r_w;
1527  }
1528  draw_bar(test, black0, x, 0, r_w, test->h, picref);
1529 }
1530 
1531 static av_cold int pal100bars_init(AVFilterContext *ctx)
1532 {
1533  TestSourceContext *test = ctx->priv;
1534 
1535  test->fill_picture_fn = pal100bars_fill_picture;
1536  test->draw_once = 1;
1537  return init(ctx);
1538 }
1539 
1540 const FFFilter ff_vsrc_pal100bars = {
1541  .p.name = "pal100bars",
1542  .p.description = NULL_IF_CONFIG_SMALL("Generate PAL 100% color bars."),
1543  .p.priv_class = &palbars_class,
1544  .priv_size = sizeof(TestSourceContext),
1545  .init = pal100bars_init,
1546  .uninit = uninit,
1547  .activate = activate,
1549  FILTER_QUERY_FUNC2(smptebars_query_formats),
1550 };
1551 
1552 #endif /* CONFIG_PAL100BARS_FILTER */
1553 
1554 AVFILTER_DEFINE_CLASS_EXT(smptebars, "smpte(hd)bars", options);
1555 
1556 #if CONFIG_SMPTEBARS_FILTER
1557 
1558 static void smptebars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1559 {
1560  TestSourceContext *test = ctx->priv;
1561  int r_w, r_h, w_h, p_w, p_h, i, tmp, x = 0;
1562  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1563 
1564  r_w = FFALIGN((test->w + 6) / 7, 1 << pixdesc->log2_chroma_w);
1565  r_h = FFALIGN(test->h * 2 / 3, 1 << pixdesc->log2_chroma_h);
1566  w_h = FFALIGN(test->h * 3 / 4 - r_h, 1 << pixdesc->log2_chroma_h);
1567  p_w = FFALIGN(r_w * 5 / 4, 1 << pixdesc->log2_chroma_w);
1568  p_h = test->h - w_h - r_h;
1569 
1570  for (i = 0; i < 7; i++) {
1571  draw_bar(test, rainbow[i], x, 0, r_w, r_h, picref);
1572  draw_bar(test, wobnair[i], x, r_h, r_w, w_h, picref);
1573  x += r_w;
1574  }
1575  x = 0;
1576  draw_bar(test, i_pixel, x, r_h + w_h, p_w, p_h, picref);
1577  x += p_w;
1578  draw_bar(test, white, x, r_h + w_h, p_w, p_h, picref);
1579  x += p_w;
1580  draw_bar(test, q_pixel, x, r_h + w_h, p_w, p_h, picref);
1581  x += p_w;
1582  tmp = FFALIGN(5 * r_w - x, 1 << pixdesc->log2_chroma_w);
1583  draw_bar(test, black0, x, r_h + w_h, tmp, p_h, picref);
1584  x += tmp;
1585  tmp = FFALIGN(r_w / 3, 1 << pixdesc->log2_chroma_w);
1586  draw_bar(test, neg4ire, x, r_h + w_h, tmp, p_h, picref);
1587  x += tmp;
1588  draw_bar(test, black0, x, r_h + w_h, tmp, p_h, picref);
1589  x += tmp;
1590  draw_bar(test, pos4ire, x, r_h + w_h, tmp, p_h, picref);
1591  x += tmp;
1592  draw_bar(test, black0, x, r_h + w_h, test->w - x, p_h, picref);
1593 }
1594 
1595 static av_cold int smptebars_init(AVFilterContext *ctx)
1596 {
1597  TestSourceContext *test = ctx->priv;
1598 
1599  test->fill_picture_fn = smptebars_fill_picture;
1600  test->draw_once = 1;
1601  return init(ctx);
1602 }
1603 
1604 const FFFilter ff_vsrc_smptebars = {
1605  .p.name = "smptebars",
1606  .p.description = NULL_IF_CONFIG_SMALL("Generate SMPTE color bars."),
1607  .p.priv_class = &smptebars_class,
1608  .priv_size = sizeof(TestSourceContext),
1609  .init = smptebars_init,
1610  .uninit = uninit,
1611  .activate = activate,
1613  FILTER_QUERY_FUNC2(smptebars_query_formats),
1614 };
1615 
1616 #endif /* CONFIG_SMPTEBARS_FILTER */
1617 
1618 #if CONFIG_SMPTEHDBARS_FILTER
1619 
1620 static void smptehdbars_fill_picture(AVFilterContext *ctx, AVFrame *picref)
1621 {
1622  TestSourceContext *test = ctx->priv;
1623  int d_w, r_w, r_h, l_w, i, tmp, x = 0, y = 0;
1624  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(picref->format);
1625 
1626  d_w = FFALIGN(test->w / 8, 1 << pixdesc->log2_chroma_w);
1627  r_h = FFALIGN(test->h * 7 / 12, 1 << pixdesc->log2_chroma_h);
1628  draw_bar(test, gray40, x, 0, d_w, r_h, picref);
1629  x += d_w;
1630 
1631  r_w = FFALIGN((((test->w + 3) / 4) * 3) / 7, 1 << pixdesc->log2_chroma_w);
1632  for (i = 0; i < 7; i++) {
1633  draw_bar(test, rainbowhd[i], x, 0, r_w, r_h, picref);
1634  x += r_w;
1635  }
1636  draw_bar(test, gray40, x, 0, test->w - x, r_h, picref);
1637  y = r_h;
1638  r_h = FFALIGN(test->h / 12, 1 << pixdesc->log2_chroma_h);
1639  draw_bar(test, cyan, 0, y, d_w, r_h, picref);
1640  x = d_w;
1641  draw_bar(test, i_pixel, x, y, r_w, r_h, picref);
1642  x += r_w;
1643  tmp = r_w * 6;
1644  draw_bar(test, rainbowhd[0], x, y, tmp, r_h, picref);
1645  x += tmp;
1646  l_w = x;
1647  draw_bar(test, blue, x, y, test->w - x, r_h, picref);
1648  y += r_h;
1649  draw_bar(test, yellow, 0, y, d_w, r_h, picref);
1650  x = d_w;
1651  draw_bar(test, q_pixel, x, y, r_w, r_h, picref);
1652  x += r_w;
1653 
1654  for (i = 0; i < tmp; i += 1 << pixdesc->log2_chroma_w) {
1655  uint8_t yramp[4] = {0};
1656 
1657  yramp[0] = i * 255 / tmp;
1658  yramp[1] = 128;
1659  yramp[2] = 128;
1660  yramp[3] = 255;
1661 
1662  draw_bar(test, yramp, x, y, 1 << pixdesc->log2_chroma_w, r_h, picref);
1663  x += 1 << pixdesc->log2_chroma_w;
1664  }
1665  draw_bar(test, red, x, y, test->w - x, r_h, picref);
1666  y += r_h;
1667  draw_bar(test, gray15, 0, y, d_w, test->h - y, picref);
1668  x = d_w;
1669  tmp = FFALIGN(r_w * 3 / 2, 1 << pixdesc->log2_chroma_w);
1670  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1671  x += tmp;
1672  tmp = FFALIGN(r_w * 2, 1 << pixdesc->log2_chroma_w);
1673  draw_bar(test, white, x, y, tmp, test->h - y, picref);
1674  x += tmp;
1675  tmp = FFALIGN(r_w * 5 / 6, 1 << pixdesc->log2_chroma_w);
1676  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1677  x += tmp;
1678  tmp = FFALIGN(r_w / 3, 1 << pixdesc->log2_chroma_w);
1679  draw_bar(test, neg2, x, y, tmp, test->h - y, picref);
1680  x += tmp;
1681  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1682  x += tmp;
1683  draw_bar(test, black2, x, y, tmp, test->h - y, picref);
1684  x += tmp;
1685  draw_bar(test, black0, x, y, tmp, test->h - y, picref);
1686  x += tmp;
1687  draw_bar(test, black4, x, y, tmp, test->h - y, picref);
1688  x += tmp;
1689  r_w = l_w - x;
1690  draw_bar(test, black0, x, y, r_w, test->h - y, picref);
1691  x += r_w;
1692  draw_bar(test, gray15, x, y, test->w - x, test->h - y, picref);
1693 }
1694 
1695 static av_cold int smptehdbars_init(AVFilterContext *ctx)
1696 {
1697  TestSourceContext *test = ctx->priv;
1698 
1699  test->fill_picture_fn = smptehdbars_fill_picture;
1700  test->draw_once = 1;
1701  return init(ctx);
1702 }
1703 
1704 const FFFilter ff_vsrc_smptehdbars = {
1705  .p.name = "smptehdbars",
1706  .p.description = NULL_IF_CONFIG_SMALL("Generate SMPTE HD color bars."),
1707  .p.priv_class = &smptebars_class,
1708  .priv_size = sizeof(TestSourceContext),
1709  .init = smptehdbars_init,
1710  .uninit = uninit,
1711  .activate = activate,
1713  FILTER_QUERY_FUNC2(smptebars_query_formats),
1714 };
1715 
1716 #endif /* CONFIG_SMPTEHDBARS_FILTER */
1717 #endif /* CONFIG_SMPTEBARS_FILTER || CONFIG_SMPTEHDBARS_FILTER */
1718 
1719 AVFILTER_DEFINE_CLASS_EXT(allyuv_allrgb, "allyuv/allrgb",
1721 
1722 #if CONFIG_ALLYUV_FILTER
1723 
1724 static void allyuv_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1725 {
1726  const ptrdiff_t ys = frame->linesize[0];
1727  const ptrdiff_t us = frame->linesize[1];
1728  const ptrdiff_t vs = frame->linesize[2];
1729  int x, y, j;
1730 
1731  for (y = 0; y < 4096; y++) {
1732  for (x = 0; x < 2048; x++) {
1733  frame->data[0][y * ys + x] = ((x / 8) % 256);
1734  frame->data[0][y * ys + 4095 - x] = ((x / 8) % 256);
1735  }
1736 
1737  for (x = 0; x < 2048; x+=8) {
1738  for (j = 0; j < 8; j++) {
1739  frame->data[1][vs * y + x + j] = (y%16 + (j % 8) * 16);
1740  frame->data[1][vs * y + 4095 - x - j] = (128 + y%16 + (j % 8) * 16);
1741  }
1742  }
1743 
1744  for (x = 0; x < 4096; x++)
1745  frame->data[2][y * us + x] = 256 * y / 4096;
1746  }
1747 }
1748 
1749 static av_cold int allyuv_init(AVFilterContext *ctx)
1750 {
1751  TestSourceContext *test = ctx->priv;
1752 
1753  test->w = test->h = 4096;
1754  test->draw_once = 1;
1755  test->fill_picture_fn = allyuv_fill_picture;
1756  return init(ctx);
1757 }
1758 
1759 const FFFilter ff_vsrc_allyuv = {
1760  .p.name = "allyuv",
1761  .p.description = NULL_IF_CONFIG_SMALL("Generate all yuv colors."),
1762  .p.priv_class = &allyuv_allrgb_class,
1763  .priv_size = sizeof(TestSourceContext),
1764  .init = allyuv_init,
1765  .uninit = uninit,
1766  .activate = activate,
1769 };
1770 
1771 #endif /* CONFIG_ALLYUV_FILTER */
1772 
1773 #if CONFIG_ALLRGB_FILTER
1774 
1775 static void allrgb_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1776 {
1777  unsigned x, y;
1778  const ptrdiff_t linesize = frame->linesize[0];
1779  uint8_t *line = frame->data[0];
1780 
1781  for (y = 0; y < 4096; y++) {
1782  uint8_t *dst = line;
1783 
1784  for (x = 0; x < 4096; x++) {
1785  *dst++ = x;
1786  *dst++ = y;
1787  *dst++ = (x >> 8) | ((y >> 8) << 4);
1788  }
1789  line += linesize;
1790  }
1791 }
1792 
1793 static av_cold int allrgb_init(AVFilterContext *ctx)
1794 {
1795  TestSourceContext *test = ctx->priv;
1796 
1797  test->w = test->h = 4096;
1798  test->draw_once = 1;
1799  test->fill_picture_fn = allrgb_fill_picture;
1800  return init(ctx);
1801 }
1802 
1803 static int allrgb_config_props(AVFilterLink *outlink)
1804 {
1805  TestSourceContext *test = outlink->src->priv;
1806 
1807  ff_fill_rgba_map(test->rgba_map, outlink->format);
1808  return config_props(outlink);
1809 }
1810 
1811 static const AVFilterPad avfilter_vsrc_allrgb_outputs[] = {
1812  {
1813  .name = "default",
1814  .type = AVMEDIA_TYPE_VIDEO,
1815  .config_props = allrgb_config_props,
1816  },
1817 };
1818 
1819 const FFFilter ff_vsrc_allrgb = {
1820  .p.name = "allrgb",
1821  .p.description = NULL_IF_CONFIG_SMALL("Generate all RGB colors."),
1822  .p.priv_class = &allyuv_allrgb_class,
1823  .priv_size = sizeof(TestSourceContext),
1824  .init = allrgb_init,
1825  .uninit = uninit,
1826  .activate = activate,
1827  FILTER_OUTPUTS(avfilter_vsrc_allrgb_outputs),
1829 };
1830 
1831 #endif /* CONFIG_ALLRGB_FILTER */
1832 
1833 #if CONFIG_COLORSPECTRUM_FILTER
1834 
1835 static const AVOption colorspectrum_options[] = {
1837  { "type", "set the color spectrum type", OFFSET(type), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, .unit = "type" },
1838  { "black","fade to black", 0, AV_OPT_TYPE_CONST,{.i64=0},0, 0, FLAGS, .unit = "type" },
1839  { "white","fade to white", 0, AV_OPT_TYPE_CONST,{.i64=1},0, 0, FLAGS, .unit = "type" },
1840  { "all", "white to black", 0, AV_OPT_TYPE_CONST,{.i64=2},0, 0, FLAGS, .unit = "type" },
1841  { NULL }
1842 };
1843 
1844 AVFILTER_DEFINE_CLASS(colorspectrum);
1845 
1846 static inline float mix(float a, float b, float mix)
1847 {
1848  return a * mix + b * (1.f - mix);
1849 }
1850 
1851 static void hsb2rgb(const float *c, float *rgb)
1852 {
1853  rgb[0] = av_clipf(fabsf(fmodf(c[0] * 6.f + 0.f, 6.f) - 3.f) - 1.f, 0.f, 1.f);
1854  rgb[1] = av_clipf(fabsf(fmodf(c[0] * 6.f + 4.f, 6.f) - 3.f) - 1.f, 0.f, 1.f);
1855  rgb[2] = av_clipf(fabsf(fmodf(c[0] * 6.f + 2.f, 6.f) - 3.f) - 1.f, 0.f, 1.f);
1856  rgb[0] = mix(c[3], (rgb[0] * rgb[0] * (3.f - 2.f * rgb[0])), c[1]) * c[2];
1857  rgb[1] = mix(c[3], (rgb[1] * rgb[1] * (3.f - 2.f * rgb[1])), c[1]) * c[2];
1858  rgb[2] = mix(c[3], (rgb[2] * rgb[2] * (3.f - 2.f * rgb[2])), c[1]) * c[2];
1859 }
1860 
1861 static void colorspectrum_fill_picture(AVFilterContext *ctx, AVFrame *frame)
1862 {
1863  TestSourceContext *test = ctx->priv;
1864  const float w = frame->width - 1.f;
1865  const float h = frame->height - 1.f;
1866  float c[4];
1867 
1868  for (int y = 0; y < frame->height; y++) {
1869  float *r = (float *)(frame->data[2] + y * frame->linesize[2]);
1870  float *g = (float *)(frame->data[0] + y * frame->linesize[0]);
1871  float *b = (float *)(frame->data[1] + y * frame->linesize[1]);
1872  const float yh = y / h;
1873 
1874  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;
1875  c[2] = 1.f;
1876  c[3] = test->type == 1 ? 1.f : test->type == 2 ? (yh > 0.5f ? 0.f : 1.f): 0.f;
1877  for (int x = 0; x < frame->width; x++) {
1878  float rgb[3];
1879 
1880  c[0] = x / w;
1881  hsb2rgb(c, rgb);
1882 
1883  r[x] = rgb[0];
1884  g[x] = rgb[1];
1885  b[x] = rgb[2];
1886  }
1887  }
1888 }
1889 
1890 static av_cold int colorspectrum_init(AVFilterContext *ctx)
1891 {
1892  TestSourceContext *test = ctx->priv;
1893 
1894  test->draw_once = 1;
1895  test->fill_picture_fn = colorspectrum_fill_picture;
1896  return init(ctx);
1897 }
1898 
1900  .p.name = "colorspectrum",
1901  .p.description = NULL_IF_CONFIG_SMALL("Generate colors spectrum."),
1902  .p.priv_class = &colorspectrum_class,
1903  .priv_size = sizeof(TestSourceContext),
1904  .init = colorspectrum_init,
1905  .uninit = uninit,
1906  .activate = activate,
1909 };
1910 
1911 #endif /* CONFIG_COLORSPECTRUM_FILTER */
1912 
1913 #if CONFIG_COLORCHART_FILTER
1914 
1915 static const AVOption colorchart_options[] = {
1917  { "patch_size", "set the single patch size", OFFSET(pw), AV_OPT_TYPE_IMAGE_SIZE, {.str="64x64"}, 0, 0, FLAGS },
1918  { "preset", "set the color checker chart preset", OFFSET(type), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, .unit = "preset" },
1919  { "reference", "reference", 0, AV_OPT_TYPE_CONST,{.i64=0}, 0, 0, FLAGS, .unit = "preset" },
1920  { "skintones", "skintones", 0, AV_OPT_TYPE_CONST,{.i64=1}, 0, 0, FLAGS, .unit = "preset" },
1921  { NULL }
1922 };
1923 
1924 AVFILTER_DEFINE_CLASS(colorchart);
1925 
1926 static const uint8_t reference_colors[][3] = {
1927  { 115, 82, 68 }, // dark skin
1928  { 194, 150, 130 }, // light skin
1929  { 98, 122, 157 }, // blue sky
1930  { 87, 108, 67 }, // foliage
1931  { 133, 128, 177 }, // blue flower
1932  { 103, 189, 170 }, // bluish green
1933 
1934  { 214, 126, 44 }, // orange
1935  { 80, 91, 166 }, // purple red
1936  { 193, 90, 99 }, // moderate red
1937  { 94, 60, 108 }, // purple
1938  { 157, 188, 64 }, // yellow green
1939  { 224, 163, 46 }, // orange yellow
1940 
1941  { 56, 61, 150 }, // blue
1942  { 70, 148, 73 }, // green
1943  { 175, 54, 60 }, // red
1944  { 231, 199, 31 }, // yellow
1945  { 187, 86, 149 }, // magenta
1946  { 8, 133, 161 }, // cyan
1947 
1948  { 243, 243, 242 }, // white
1949  { 200, 200, 200 }, // neutral 8
1950  { 160, 160, 160 }, // neutral 65
1951  { 122, 122, 121 }, // neutral 5
1952  { 85, 85, 85 }, // neutral 35
1953  { 52, 52, 52 }, // black
1954 };
1955 
1956 static const uint8_t skintones_colors[][3] = {
1957  { 54, 38, 43 },
1958  { 105, 43, 42 },
1959  { 147, 43, 43 },
1960  { 77, 41, 42 },
1961  { 134, 43, 41 },
1962  { 201, 134, 118 },
1963 
1964  { 59, 41, 41 },
1965  { 192, 103, 76 },
1966  { 208, 156, 141 },
1967  { 152, 82, 61 },
1968  { 162, 132, 118 },
1969  { 212, 171, 150 },
1970 
1971  { 205, 91, 31 },
1972  { 164, 100, 55 },
1973  { 204, 136, 95 },
1974  { 178, 142, 116 },
1975  { 210, 152, 108 },
1976  { 217, 167, 131 },
1977 
1978  { 206, 166, 126 },
1979  { 208, 163, 97 },
1980  { 245, 180, 0 },
1981  { 212, 184, 125 },
1982  { 179, 165, 150 },
1983  { 196, 184, 105 },
1984 };
1985 
1986 typedef struct ColorChartPreset {
1987  int w, h;
1988  const uint8_t (*colors)[3];
1989 } ColorChartPreset;
1990 
1991 static const ColorChartPreset colorchart_presets[] = {
1992  { 6, 4, reference_colors, },
1993  { 6, 4, skintones_colors, },
1994 };
1995 
1996 static int colorchart_config_props(AVFilterLink *inlink)
1997 {
1998  AVFilterContext *ctx = inlink->src;
1999  TestSourceContext *s = ctx->priv;
2000 
2001  av_assert0(ff_draw_init2(&s->draw, inlink->format, inlink->colorspace,
2002  inlink->color_range, 0) >= 0);
2003  if (av_image_check_size(s->w, s->h, 0, ctx) < 0)
2004  return AVERROR(EINVAL);
2005  return config_props(inlink);
2006 }
2007 
2008 static void colorchart_fill_picture(AVFilterContext *ctx, AVFrame *frame)
2009 {
2010  TestSourceContext *test = ctx->priv;
2011  const int preset = test->type;
2012  const int w = colorchart_presets[preset].w;
2013  const int h = colorchart_presets[preset].h;
2014  const int pw = test->pw;
2015  const int ph = test->ph;
2016 
2017  for (int y = 0; y < h; y++) {
2018  for (int x = 0; x < w; x++) {
2019  uint32_t pc = AV_RB24(colorchart_presets[preset].colors[y * w + x]);
2021 
2022  set_color(test, &color, pc);
2023  ff_fill_rectangle(&test->draw, &color, frame->data, frame->linesize,
2024  x * pw, y * ph, pw, ph);
2025  }
2026  }
2027 }
2028 
2029 static av_cold int colorchart_init(AVFilterContext *ctx)
2030 {
2031  TestSourceContext *test = ctx->priv;
2032  const int preset = test->type;
2033  const int w = colorchart_presets[preset].w;
2034  const int h = colorchart_presets[preset].h;
2035 
2036  test->w = w * test->pw;
2037  test->h = h * test->ph;
2038  test->draw_once = 1;
2039  test->fill_picture_fn = colorchart_fill_picture;
2040  return init(ctx);
2041 }
2042 
2043 static const AVFilterPad avfilter_vsrc_colorchart_outputs[] = {
2044  {
2045  .name = "default",
2046  .type = AVMEDIA_TYPE_VIDEO,
2047  .config_props = colorchart_config_props,
2048  },
2049 };
2050 
2051 const FFFilter ff_vsrc_colorchart = {
2052  .p.name = "colorchart",
2053  .p.description = NULL_IF_CONFIG_SMALL("Generate color checker chart."),
2054  .p.priv_class = &colorchart_class,
2055  .priv_size = sizeof(TestSourceContext),
2056  .init = colorchart_init,
2057  .uninit = uninit,
2058  .activate = activate,
2059  FILTER_OUTPUTS(avfilter_vsrc_colorchart_outputs),
2061 };
2062 
2063 #endif /* CONFIG_COLORCHART_FILTER */
2064 
2065 #if CONFIG_ZONEPLATE_FILTER
2066 
2067 static const AVOption zoneplate_options[] = {
2069  { "precision", "set LUT precision", OFFSET(lut_precision), AV_OPT_TYPE_INT, {.i64=10}, 4, 16, FLAGS },
2070  { "xo", "set X-axis offset", OFFSET(xo), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2071  { "yo", "set Y-axis offset", OFFSET(yo), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2072  { "to", "set T-axis offset", OFFSET(to), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2073  { "k0", "set 0-order phase", OFFSET(k0), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2074  { "kx", "set 1-order X-axis phase", OFFSET(kx), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2075  { "ky", "set 1-order Y-axis phase", OFFSET(ky), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2076  { "kt", "set 1-order T-axis phase", OFFSET(kt), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2077  { "kxt", "set X-axis*T-axis product phase", OFFSET(kxt), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2078  { "kyt", "set Y-axis*T-axis product phase", OFFSET(kyt), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2079  { "kxy", "set X-axis*Y-axis product phase", OFFSET(kxy), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2080  { "kx2", "set 2-order X-axis phase", OFFSET(kx2), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2081  { "ky2", "set 2-order Y-axis phase", OFFSET(ky2), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2082  { "kt2", "set 2-order T-axis phase", OFFSET(kt2), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2083  { "ku", "set 0-order U-color phase", OFFSET(kU), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2084  { "kv", "set 0-order V-color phase", OFFSET(kV), AV_OPT_TYPE_INT, {.i64=0}, INT_MIN, INT_MAX, FLAGSR },
2085  { NULL }
2086 };
2087 
2088 AVFILTER_DEFINE_CLASS(zoneplate);
2089 
2090 #define ZONEPLATE_SLICE(name, type) \
2091 static int zoneplate_fill_slice_##name(AVFilterContext *ctx, \
2092  void *arg, int job, \
2093  int nb_jobs) \
2094 { \
2095  TestSourceContext *test = ctx->priv; \
2096  AVFrame *frame = arg; \
2097  const int w = frame->width; \
2098  const int h = frame->height; \
2099  const int kxt = test->kxt, kyt = test->kyt, kx2 = test->kx2; \
2100  const int t = test->pts + test->to, k0 = test->k0; \
2101  const int kt = test->kt, kt2 = test->kt2, ky2 = test->ky2; \
2102  const int ky = test->ky, kx = test->kx, kxy = test->kxy; \
2103  const int lut_mask = (1 << test->lut_precision) - 1; \
2104  const int nkt2t = kt2 * t * t, nktt = kt * t; \
2105  const int start = (h * job ) / nb_jobs; \
2106  const int end = (h * (job+1)) / nb_jobs; \
2107  const ptrdiff_t ylinesize = frame->linesize[0] / sizeof(type); \
2108  const ptrdiff_t ulinesize = frame->linesize[1] / sizeof(type); \
2109  const ptrdiff_t vlinesize = frame->linesize[2] / sizeof(type); \
2110  const int xreset = -(w / 2) - test->xo; \
2111  const int yreset = -(h / 2) - test->yo + start; \
2112  const int kU = test->kU, kV = test->kV; \
2113  const int skxy = 0xffff / (w / 2); \
2114  const int skx2 = 0xffff / w; \
2115  const int dkxt = kxt * t; \
2116  type *ydst = ((type *)frame->data[0]) + start * ylinesize; \
2117  type *udst = ((type *)frame->data[1]) + start * ulinesize; \
2118  type *vdst = ((type *)frame->data[2]) + start * vlinesize; \
2119  const type *lut = (const type *)test->lut; \
2120  int akx, akxt, aky, akyt; \
2121  \
2122  aky = start * ky; \
2123  akyt = start * kyt * t; \
2124  \
2125  for (int j = start, y = yreset; j < end; j++, y++) { \
2126  const int dkxy = kxy * y * skxy; \
2127  const int nky2kt2 = (ky2 * y * y) / h + (nkt2t >> 1); \
2128  int akxy = dkxy * xreset; \
2129  \
2130  akx = 0; \
2131  akxt = 0; \
2132  aky += ky; \
2133  akyt += kyt * t; \
2134  \
2135  for (int i = 0, x = xreset; i < w; i++, x++) { \
2136  int phase = k0, uphase = kU, vphase = kV; \
2137  \
2138  akx += kx; \
2139  phase += akx + aky + nktt; \
2140  \
2141  akxt += dkxt; \
2142  akxy += dkxy; \
2143  phase += akxt + akyt; \
2144  phase += akxy >> 16; \
2145  phase += ((kx2 * x * x * skx2) >> 16) + nky2kt2; \
2146  uphase += phase; \
2147  vphase += phase; \
2148  \
2149  ydst[i] = lut[phase & lut_mask]; \
2150  udst[i] = lut[uphase & lut_mask]; \
2151  vdst[i] = lut[vphase & lut_mask]; \
2152  } \
2153  \
2154  ydst += ylinesize; \
2155  udst += ulinesize; \
2156  vdst += vlinesize; \
2157  } \
2158  \
2159  return 0; \
2160 }
2161 
2162 ZONEPLATE_SLICE( 8, uint8_t)
2163 ZONEPLATE_SLICE( 9, uint16_t)
2164 ZONEPLATE_SLICE(10, uint16_t)
2165 ZONEPLATE_SLICE(12, uint16_t)
2166 ZONEPLATE_SLICE(14, uint16_t)
2167 ZONEPLATE_SLICE(16, uint16_t)
2168 
2169 static void zoneplate_fill_picture(AVFilterContext *ctx, AVFrame *frame)
2170 {
2171  TestSourceContext *test = ctx->priv;
2172  ff_filter_execute(ctx, test->fill_slice_fn, frame, NULL,
2174 }
2175 
2176 static int zoneplate_config_props(AVFilterLink *outlink)
2177 {
2178  AVFilterContext *ctx = outlink->src;
2179  TestSourceContext *test = ctx->priv;
2181  const int lut_size = 1 << test->lut_precision;
2182  const int depth = desc->comp[0].depth;
2183  uint16_t *lut16;
2184  uint8_t *lut8;
2185 
2186  if (av_image_check_size(test->w, test->h, 0, ctx) < 0)
2187  return AVERROR(EINVAL);
2188 
2189  test->lut = av_calloc(lut_size, sizeof(*test->lut) * ((depth + 7) / 8));
2190  if (!test->lut)
2191  return AVERROR(ENOMEM);
2192 
2193  lut8 = test->lut;
2194  lut16 = (uint16_t *)test->lut;
2195  switch (depth) {
2196  case 8:
2197  for (int i = 0; i < lut_size; i++)
2198  lut8[i] = lrintf(255.f * (0.5f + 0.5f * sinf((2.f * M_PI * i) / lut_size)));
2199  break;
2200  default:
2201  for (int i = 0; i < lut_size; i++)
2202  lut16[i] = lrintf(((1 << depth) - 1) * (0.5f + 0.5f * sinf((2.f * M_PI * i) / lut_size)));
2203  break;
2204  }
2205 
2206  test->draw_once = 0;
2207  test->fill_picture_fn = zoneplate_fill_picture;
2208 
2209  switch (depth) {
2210  case 8: test->fill_slice_fn = zoneplate_fill_slice_8; break;
2211  case 9: test->fill_slice_fn = zoneplate_fill_slice_9; break;
2212  case 10: test->fill_slice_fn = zoneplate_fill_slice_10; break;
2213  case 12: test->fill_slice_fn = zoneplate_fill_slice_12; break;
2214  case 14: test->fill_slice_fn = zoneplate_fill_slice_14; break;
2215  case 16: test->fill_slice_fn = zoneplate_fill_slice_16; break;
2216  }
2217  return config_props(outlink);
2218 }
2219 
2220 static const enum AVPixelFormat zoneplate_pix_fmts[] = {
2225 };
2226 
2227 static int zoneplate_query_formats(const AVFilterContext *ctx,
2228  AVFilterFormatsConfig **cfg_in,
2229  AVFilterFormatsConfig **cfg_out)
2230 {
2231  int ret;
2232  if ((ret = ff_set_common_color_ranges2(ctx, cfg_in, cfg_out,
2234  return ret;
2235  return ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, zoneplate_pix_fmts);
2236 }
2237 
2238 static const AVFilterPad avfilter_vsrc_zoneplate_outputs[] = {
2239  {
2240  .name = "default",
2241  .type = AVMEDIA_TYPE_VIDEO,
2242  .config_props = zoneplate_config_props,
2243  },
2244 };
2245 
2246 const FFFilter ff_vsrc_zoneplate = {
2247  .p.name = "zoneplate",
2248  .p.description = NULL_IF_CONFIG_SMALL("Generate zone-plate."),
2249  .p.priv_class = &zoneplate_class,
2250  .p.flags = AVFILTER_FLAG_SLICE_THREADS,
2251  .priv_size = sizeof(TestSourceContext),
2252  .init = init,
2253  .uninit = uninit,
2254  .activate = activate,
2255  FILTER_OUTPUTS(avfilter_vsrc_zoneplate_outputs),
2256  FILTER_QUERY_FUNC2(zoneplate_query_formats),
2257  .process_command = ff_filter_process_command,
2258 };
2259 
2260 #endif /* CONFIG_ZONEPLATE_FILTER */
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:116
A
#define A(x)
Definition: vpx_arith.h:28
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:548
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
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:51
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:205
mix
static int mix(int c0, int c1)
Definition: 4xm.c:716
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:242
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:983
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:251
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1078
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3313
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
planes
static const struct @475 planes[]
ff_set_common_formats2
int ff_set_common_formats2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *formats)
Definition: formats.c:1007
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:264
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
TestSourceContext::k0
int k0
Definition: vsrc_testsrc.c:94
av_unused
#define av_unused
Definition: attributes.h:131
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:70
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3043
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
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
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:746
AVOption
AVOption.
Definition: opt.h:429
b
#define b
Definition: input.c:41
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:225
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:203
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:529
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
formats.h
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:3353
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:675
rgb
Definition: rpzaenc.c:60
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:543
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:272
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:541
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:590
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
us
#define us(width, name, range_min, range_max, subs,...)
Definition: cbs_h2645.c:263
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:551
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:38
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:528
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:209
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:90
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:661
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:959
FFFilter
Definition: filters.h:265
TestSourceContext::type
int type
Definition: vsrc_testsrc.c:78
AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:545
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:627
TestSourceContext::kt
int kt
Definition: vsrc_testsrc.c:94
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:546
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:538
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
to
const char * to
Definition: webvttdec.c:35
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
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
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:517
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:263
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:544
TestSourceContext::sar
AVRational sar
sample aspect ratio
Definition: vsrc_testsrc.c:61
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:515
FLAGS
#define FLAGS
Definition: vsrc_testsrc.c:104
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
AV_PIX_FMT_BGR48
#define AV_PIX_FMT_BGR48
Definition: pixfmt.h:516
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:31
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
AV_PIX_FMT_P410
#define AV_PIX_FMT_P410
Definition: pixfmt.h:596
NOSIZE_OPTIONS_OFFSET
#define NOSIZE_OPTIONS_OFFSET
Definition: vsrc_testsrc.c:120
options
Definition: swscale.c:42
ff_fill_ayuv_map
int ff_fill_ayuv_map(uint8_t *ayuv_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:89
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:419
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:540
AVFILTER_DEFINE_CLASS
#define AVFILTER_DEFINE_CLASS(fname)
Definition: filters.h:476
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:109
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:197
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
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:85
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:3278
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
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:370
ff_draw_init2
int ff_draw_init2(FFDrawContext *draw, enum AVPixelFormat format, enum AVColorSpace csp, enum AVColorRange range, unsigned flags)
Init a draw context.
Definition: drawutils.c:97
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:557
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:511
size
int size
Definition: twinvq_data.h:10344
color
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:96
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:518
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:248
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:532
AV_PIX_FMT_AYUV64
#define AV_PIX_FMT_AYUV64
Definition: pixfmt.h:580
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:497
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:917
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
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
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:520
TestSourceContext::h
int h
Definition: vsrc_testsrc.c:55
avpriv_vga16_font
const uint8_t avpriv_vga16_font[4096]
Definition: xga_font_data.c:160
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:664
ff_vsrc_smptebars
const FFFilter ff_vsrc_smptebars
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:542
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:669
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:519
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:857
AV_PIX_FMT_RGB555
#define AV_PIX_FMT_RGB555
Definition: pixfmt.h:513
FILTER_QUERY_FUNC2
#define FILTER_QUERY_FUNC2(func)
Definition: filters.h:239
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:652
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:517
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:44
FILTER_PIXFMTS
#define FILTER_PIXFMTS(...)
Definition: filters.h:248
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:669
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:729
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:524
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:512
ff_draw_color
void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4])
Prepare a color.
Definition: drawutils.c:173
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:264
TestSourceContext::kU
int kU
Definition: vsrc_testsrc.c:97
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:1016
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:1683
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
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
AVFilterContext
An instance of a filter.
Definition: avfilter.h:257
factor
static const int factor[16]
Definition: vf_pp7.c:80
TestSourceContext::pts
int64_t pts
Definition: vsrc_testsrc.c:59
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
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:150
desc
const char * desc
Definition: libsvtav1.c:79
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:201
FFFilter::p
AVFilter p
The public AVFilter.
Definition: filters.h:269
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:291
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:600
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:34
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:81
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:589
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
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:455
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:598
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:535
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:85
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:671
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:252
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
set_color
static void av_unused set_color(TestSourceContext *s, FFDrawColor *color, uint32_t argb)
Definition: vsrc_testsrc.c:705
COMMON_OPTIONS_NOSIZE
#define COMMON_OPTIONS_NOSIZE
Definition: vsrc_testsrc.c:111
AV_PIX_FMT_RGB444
#define AV_PIX_FMT_RGB444
Definition: pixfmt.h:514