FFmpeg
Loading...
Searching...
No Matches
vf_drawbox.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2008 Affine Systems, Inc (Michael Sullivan, Bobby Impollonia)
3 * Copyright (c) 2013 Andrey Utkin <andrey.krieger.utkin gmail com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * Box and grid drawing filters. Also a nice template for a filter
25 * that needs to write in the input frame.
26 */
27
28#include "config_components.h"
29
31#include "libavutil/common.h"
32#include "libavutil/opt.h"
33#include "libavutil/eval.h"
34#include "libavutil/pixdesc.h"
37#include "avfilter.h"
38#include "drawutils.h"
39#include "filters.h"
40#include "video.h"
41
42static const char *const var_names[] = {
43 "dar",
44 "hsub", "vsub",
45 "in_h", "ih", ///< height of the input video
46 "in_w", "iw", ///< width of the input video
47 "sar",
48 "x",
49 "y",
50 "h", ///< height of the rendered box
51 "w", ///< width of the rendered box
52 "t",
53 "fill",
54 NULL
55};
56
57enum { Y, U, V, A };
58enum { R, G, B };
59
74
75struct DrawBoxContext;
76
77typedef int (*PixelBelongsToRegion)(struct DrawBoxContext *s, int x, int y);
78
79typedef struct DrawBoxContext {
80 const AVClass *class;
81 int x, y, w, h;
83 char *color_str;
84 uint8_t rgba_map[4];
85 uint8_t rgba_color[4];
86 unsigned char yuv_color[4];
87 int invert_color; ///< invert luma color
88 int vsub, hsub; ///< chroma subsampling
89 char *x_expr, *y_expr; ///< expression for x and y
90 char *w_expr, *h_expr; ///< expression for width and height
91 char *t_expr; ///< expression for thickness
92 char *box_source_string; ///< string for box data source
95 int step;
97
98 void (*draw_region)(AVFrame *frame, struct DrawBoxContext *ctx, int left, int top, int right, int down,
99 PixelBelongsToRegion pixel_belongs_to_region);
101
102static const int NUM_EXPR_EVALS = 5;
103
104#define ASSIGN_THREE_CHANNELS \
105 row[0] = frame->data[0] + y * frame->linesize[0]; \
106 row[1] = frame->data[1] + (y >> ctx->vsub) * frame->linesize[1]; \
107 row[2] = frame->data[2] + (y >> ctx->vsub) * frame->linesize[2];
108
109#define ASSIGN_FOUR_CHANNELS \
110 ASSIGN_THREE_CHANNELS \
111 row[3] = frame->data[3] + y * frame->linesize[3];
112
113static void draw_region(AVFrame *frame, DrawBoxContext *ctx, int left, int top, int right, int down,
114 PixelBelongsToRegion pixel_belongs_to_region)
115{
116 unsigned char *row[4];
117 int x, y;
118 if (ctx->have_alpha && ctx->replace) {
119 for (y = top; y < down; y++) {
121 if (ctx->invert_color) {
122 for (x = left; x < right; x++)
123 if (pixel_belongs_to_region(ctx, x, y))
124 row[0][x] = 0xff - row[0][x];
125 } else {
126 for (x = left; x < right; x++) {
127 if (pixel_belongs_to_region(ctx, x, y)) {
128 row[0][x ] = ctx->yuv_color[Y];
129 row[1][x >> ctx->hsub] = ctx->yuv_color[U];
130 row[2][x >> ctx->hsub] = ctx->yuv_color[V];
131 row[3][x ] = ctx->yuv_color[A];
132 }
133 }
134 }
135 }
136 } else {
137 for (y = top; y < down; y++) {
139 if (ctx->invert_color) {
140 for (x = left; x < right; x++)
141 if (pixel_belongs_to_region(ctx, x, y))
142 row[0][x] = 0xff - row[0][x];
143 } else {
144 for (x = left; x < right; x++) {
145 double alpha = (double)ctx->yuv_color[A] / 255;
146
147 if (pixel_belongs_to_region(ctx, x, y)) {
148 row[0][x ] = (1 - alpha) * row[0][x ] + alpha * ctx->yuv_color[Y];
149 row[1][x >> ctx->hsub] = (1 - alpha) * row[1][x >> ctx->hsub] + alpha * ctx->yuv_color[U];
150 row[2][x >> ctx->hsub] = (1 - alpha) * row[2][x >> ctx->hsub] + alpha * ctx->yuv_color[V];
151 }
152 }
153 }
154 }
155 }
156}
157
158#define ASSIGN_THREE_CHANNELS_PACKED \
159 row[0] = frame->data[0] + y * frame->linesize[0] + ctx->rgba_map[0]; \
160 row[1] = frame->data[0] + y * frame->linesize[0] + ctx->rgba_map[1]; \
161 row[2] = frame->data[0] + y * frame->linesize[0] + ctx->rgba_map[2];
162
163#define ASSIGN_FOUR_CHANNELS_PACKED \
164 ASSIGN_THREE_CHANNELS_PACKED \
165 row[3] = frame->data[0] + y * frame->linesize[0] + ctx->rgba_map[3];
166
167static void draw_region_rgb_packed(AVFrame *frame, DrawBoxContext *ctx, int left, int top, int right, int down,
168 PixelBelongsToRegion pixel_belongs_to_region)
169{
170 const int C = ctx->step;
171 uint8_t *row[4];
172
173 if (ctx->have_alpha && ctx->replace) {
174 for (int y = top; y < down; y++) {
176 if (ctx->invert_color) {
177 for (int x = left; x < right; x++)
178 if (pixel_belongs_to_region(ctx, x, y)) {
179 row[0][x*C] = 0xff - row[0][x*C];
180 row[1][x*C] = 0xff - row[1][x*C];
181 row[2][x*C] = 0xff - row[2][x*C];
182 }
183 } else {
184 for (int x = left; x < right; x++) {
185 if (pixel_belongs_to_region(ctx, x, y)) {
186 row[0][x*C] = ctx->rgba_color[R];
187 row[1][x*C] = ctx->rgba_color[G];
188 row[2][x*C] = ctx->rgba_color[B];
189 row[3][x*C] = ctx->rgba_color[A];
190 }
191 }
192 }
193 }
194 } else {
195 for (int y = top; y < down; y++) {
197 if (ctx->invert_color) {
198 for (int x = left; x < right; x++)
199 if (pixel_belongs_to_region(ctx, x, y)) {
200 row[0][x*C] = 0xff - row[0][x*C];
201 row[1][x*C] = 0xff - row[1][x*C];
202 row[2][x*C] = 0xff - row[2][x*C];
203 }
204 } else {
205 for (int x = left; x < right; x++) {
206 float alpha = (float)ctx->rgba_color[A] / 255.f;
207
208 if (pixel_belongs_to_region(ctx, x, y)) {
209 row[0][x*C] = (1.f - alpha) * row[0][x*C] + alpha * ctx->rgba_color[R];
210 row[1][x*C] = (1.f - alpha) * row[1][x*C] + alpha * ctx->rgba_color[G];
211 row[2][x*C] = (1.f - alpha) * row[2][x*C] + alpha * ctx->rgba_color[B];
212 }
213 }
214 }
215 }
216 }
217}
218
220{
222 if (!strcmp(box_source_string, "side_data_detection_bboxes")) {
224 } else {
225 // will support side_data_regions_of_interest next
226 return AVERROR(EINVAL);
227 }
228}
229
231{
232 DrawBoxContext *s = ctx->priv;
233
234 if (s->box_source_string) {
235 s->box_source = box_source_string_parse(s->box_source_string);
236 if ((int)s->box_source < 0) {
237 av_log(ctx, AV_LOG_ERROR, "Error box source: %s\n",s->box_source_string);
238 return AVERROR(EINVAL);
239 }
240 }
241
242 if (!strcmp(s->color_str, "invert"))
243 s->invert_color = 1;
244 else if (av_parse_color(s->rgba_color, s->color_str, -1, ctx) < 0)
245 return AVERROR(EINVAL);
246
247 if (!s->invert_color) {
248 s->yuv_color[Y] = RGB_TO_Y_CCIR(s->rgba_color[0], s->rgba_color[1], s->rgba_color[2]);
249 s->yuv_color[U] = RGB_TO_U_CCIR(s->rgba_color[0], s->rgba_color[1], s->rgba_color[2], 0);
250 s->yuv_color[V] = RGB_TO_V_CCIR(s->rgba_color[0], s->rgba_color[1], s->rgba_color[2], 0);
251 s->yuv_color[A] = s->rgba_color[3];
252 }
253
254 return 0;
255}
256
270
271static int config_input(AVFilterLink *inlink)
272{
273 AVFilterContext *ctx = inlink->dst;
274 DrawBoxContext *s = ctx->priv;
276 double var_values[VARS_NB], res;
277 char *expr;
278 int ret;
279 int i;
280
281 ff_fill_rgba_map(s->rgba_map, inlink->format);
282
283 if (!(desc->flags & AV_PIX_FMT_FLAG_RGB))
284 s->draw_region = draw_region;
285 else
286 s->draw_region = draw_region_rgb_packed;
287
288 s->step = av_get_padded_bits_per_pixel(desc) >> 3;
289 s->hsub = desc->log2_chroma_w;
290 s->vsub = desc->log2_chroma_h;
291 s->have_alpha = desc->flags & AV_PIX_FMT_FLAG_ALPHA;
292
293 var_values[VAR_IN_H] = var_values[VAR_IH] = inlink->h;
294 var_values[VAR_IN_W] = var_values[VAR_IW] = inlink->w;
295 var_values[VAR_SAR] = inlink->sample_aspect_ratio.num ? av_q2d(inlink->sample_aspect_ratio) : 1;
296 var_values[VAR_DAR] = (double)inlink->w / inlink->h * var_values[VAR_SAR];
297 var_values[VAR_HSUB] = s->hsub;
298 var_values[VAR_VSUB] = s->vsub;
299 var_values[VAR_X] = NAN;
300 var_values[VAR_Y] = NAN;
301 var_values[VAR_H] = NAN;
302 var_values[VAR_W] = NAN;
303 var_values[VAR_T] = NAN;
304
305 for (i = 0; i <= NUM_EXPR_EVALS; i++) {
306 /* evaluate expressions, fail on last iteration */
307 var_values[VAR_MAX] = inlink->w;
308 if ((ret = av_expr_parse_and_eval(&res, (expr = s->x_expr),
309 var_names, var_values,
310 NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0 && i == NUM_EXPR_EVALS)
311 goto fail;
312 s->x = var_values[VAR_X] = res;
313
314 var_values[VAR_MAX] = inlink->h;
315 if ((ret = av_expr_parse_and_eval(&res, (expr = s->y_expr),
316 var_names, var_values,
317 NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0 && i == NUM_EXPR_EVALS)
318 goto fail;
319 s->y = var_values[VAR_Y] = res;
320
321 var_values[VAR_MAX] = inlink->w - s->x;
322 if ((ret = av_expr_parse_and_eval(&res, (expr = s->w_expr),
323 var_names, var_values,
324 NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0 && i == NUM_EXPR_EVALS)
325 goto fail;
326 s->w = var_values[VAR_W] = res;
327
328 var_values[VAR_MAX] = inlink->h - s->y;
329 if ((ret = av_expr_parse_and_eval(&res, (expr = s->h_expr),
330 var_names, var_values,
331 NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0 && i == NUM_EXPR_EVALS)
332 goto fail;
333 s->h = var_values[VAR_H] = res;
334
335 var_values[VAR_MAX] = INT_MAX;
336 if ((ret = av_expr_parse_and_eval(&res, (expr = s->t_expr),
337 var_names, var_values,
338 NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0 && i == NUM_EXPR_EVALS)
339 goto fail;
340 s->thickness = var_values[VAR_T] = res;
341 }
342
343 /* if w or h are zero, use the input w/h */
344 s->w = (s->w > 0) ? s->w : inlink->w;
345 s->h = (s->h > 0) ? s->h : inlink->h;
346
347 /* sanity check width and height */
348 if (s->w < 0 || s->h < 0) {
349 av_log(ctx, AV_LOG_ERROR, "Size values less than 0 are not acceptable.\n");
350 return AVERROR(EINVAL);
351 }
352
353 av_log(ctx, AV_LOG_VERBOSE, "x:%d y:%d w:%d h:%d color:0x%02X%02X%02X%02X\n",
354 s->x, s->y, s->w, s->h,
355 s->yuv_color[Y], s->yuv_color[U], s->yuv_color[V], s->yuv_color[A]);
356
357 return 0;
358
359fail:
361 "Error when evaluating the expression '%s'.\n",
362 expr);
363 return ret;
364}
365
367{
368 return (y - s->y < s->thickness) || (s->y + s->h - 1 - y < s->thickness) ||
369 (x - s->x < s->thickness) || (s->x + s->w - 1 - x < s->thickness);
370}
371
373{
374 AVFilterContext *ctx = inlink->dst;
375 DrawBoxContext *s = ctx->priv;
377 const AVDetectionBBox *bbox;
378 AVFrameSideData *sd;
379 int loop = 1;
380
381 if (s->box_source == AV_FRAME_DATA_DETECTION_BBOXES) {
383 if (sd) {
385 loop = header->nb_bboxes;
386 } else {
387 av_log(ctx, AV_LOG_WARNING, "No detection bboxes.\n");
388 return ff_filter_frame(inlink->dst->outputs[0], frame);
389 }
390 }
391
392 for (int i = 0; i < loop; i++) {
393 if (header) {
395 s->y = bbox->y;
396 s->x = bbox->x;
397 s->h = bbox->h;
398 s->w = bbox->w;
399 }
400
401 s->draw_region(frame, s, FFMAX(s->x, 0), FFMAX(s->y, 0), FFMIN(s->x + s->w, frame->width),
402 FFMIN(s->y + s->h, frame->height), pixel_belongs_to_box);
403 }
404
405 return ff_filter_frame(inlink->dst->outputs[0], frame);
406}
407
408static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
409{
410 AVFilterLink *inlink = ctx->inputs[0];
411 DrawBoxContext *s = ctx->priv;
412 int old_x = s->x;
413 int old_y = s->y;
414 int old_w = s->w;
415 int old_h = s->h;
416 int old_t = s->thickness;
417 int old_r = s->replace;
418 int ret;
419
420 ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
421 if (ret < 0)
422 return ret;
423
424 ret = init(ctx);
425 if (ret < 0)
426 goto end;
427 ret = config_input(inlink);
428end:
429 if (ret < 0) {
430 s->x = old_x;
431 s->y = old_y;
432 s->w = old_w;
433 s->h = old_h;
434 s->thickness = old_t;
435 s->replace = old_r;
436 }
437
438 return ret;
439}
440
441#define OFFSET(x) offsetof(DrawBoxContext, x)
442#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
443
444#if CONFIG_DRAWBOX_FILTER
445
446static const AVOption drawbox_options[] = {
447 { "x", "set horizontal position of the left box edge", OFFSET(x_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
448 { "y", "set vertical position of the top box edge", OFFSET(y_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
449 { "width", "set width of the box", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
450 { "w", "set width of the box", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
451 { "height", "set height of the box", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
452 { "h", "set height of the box", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
453 { "color", "set color of the box", OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
454 { "c", "set color of the box", OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
455 { "thickness", "set the box thickness", OFFSET(t_expr), AV_OPT_TYPE_STRING, { .str="3" }, 0, 0, FLAGS },
456 { "t", "set the box thickness", OFFSET(t_expr), AV_OPT_TYPE_STRING, { .str="3" }, 0, 0, FLAGS },
457 { "replace", "replace color & alpha", OFFSET(replace), AV_OPT_TYPE_BOOL, { .i64=0 }, 0, 1, FLAGS },
458 { "box_source","use data from bounding box in side data", OFFSET(box_source_string), AV_OPT_TYPE_STRING, { .str=NULL }, 0, 1, FLAGS },
459 { NULL }
460};
461
462AVFILTER_DEFINE_CLASS(drawbox);
463
464static const AVFilterPad drawbox_inputs[] = {
465 {
466 .name = "default",
467 .type = AVMEDIA_TYPE_VIDEO,
469 .config_props = config_input,
470 .filter_frame = filter_frame,
471 },
472};
473
474const FFFilter ff_vf_drawbox = {
475 .p.name = "drawbox",
476 .p.description = NULL_IF_CONFIG_SMALL("Draw a colored box on the input video."),
477 .p.priv_class = &drawbox_class,
479 .priv_size = sizeof(DrawBoxContext),
480 .init = init,
481 FILTER_INPUTS(drawbox_inputs),
484 .process_command = process_command,
485};
486#endif /* CONFIG_DRAWBOX_FILTER */
487
488#if CONFIG_DRAWGRID_FILTER
489static av_pure av_always_inline int pixel_belongs_to_grid(DrawBoxContext *drawgrid, int x, int y)
490{
491 // x is horizontal (width) coord,
492 // y is vertical (height) coord
493 int x_modulo;
494 int y_modulo;
495
496 // Abstract from the offset
497 x -= drawgrid->x;
498 y -= drawgrid->y;
499
500 x_modulo = x % drawgrid->w;
501 y_modulo = y % drawgrid->h;
502
503 // If x or y got negative, fix values to preserve logics
504 if (x_modulo < 0)
505 x_modulo += drawgrid->w;
506 if (y_modulo < 0)
507 y_modulo += drawgrid->h;
508
509 return x_modulo < drawgrid->thickness // Belongs to vertical line
510 || y_modulo < drawgrid->thickness; // Belongs to horizontal line
511}
512
513static int drawgrid_filter_frame(AVFilterLink *inlink, AVFrame *frame)
514{
515 DrawBoxContext *drawgrid = inlink->dst->priv;
516
517 drawgrid->draw_region(frame, drawgrid, 0, 0, frame->width, frame->height, pixel_belongs_to_grid);
518
519 return ff_filter_frame(inlink->dst->outputs[0], frame);
520}
521
522static const AVOption drawgrid_options[] = {
523 { "x", "set horizontal offset", OFFSET(x_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
524 { "y", "set vertical offset", OFFSET(y_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
525 { "width", "set width of grid cell", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
526 { "w", "set width of grid cell", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
527 { "height", "set height of grid cell", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
528 { "h", "set height of grid cell", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str="0" }, 0, 0, FLAGS },
529 { "color", "set color of the grid", OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
530 { "c", "set color of the grid", OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
531 { "thickness", "set grid line thickness", OFFSET(t_expr), AV_OPT_TYPE_STRING, {.str="1"}, 0, 0, FLAGS },
532 { "t", "set grid line thickness", OFFSET(t_expr), AV_OPT_TYPE_STRING, {.str="1"}, 0, 0, FLAGS },
533 { "replace", "replace color & alpha", OFFSET(replace), AV_OPT_TYPE_BOOL, { .i64=0 }, 0, 1, FLAGS },
534 { NULL }
535};
536
537AVFILTER_DEFINE_CLASS(drawgrid);
538
539static const AVFilterPad drawgrid_inputs[] = {
540 {
541 .name = "default",
542 .type = AVMEDIA_TYPE_VIDEO,
544 .config_props = config_input,
545 .filter_frame = drawgrid_filter_frame,
546 },
547};
548
549const FFFilter ff_vf_drawgrid = {
550 .p.name = "drawgrid",
551 .p.description = NULL_IF_CONFIG_SMALL("Draw a colored grid on the input video."),
552 .p.priv_class = &drawgrid_class,
554 .priv_size = sizeof(DrawBoxContext),
555 .init = init,
556 FILTER_INPUTS(drawgrid_inputs),
559 .process_command = process_command,
560};
561
562#endif /* CONFIG_DRAWGRID_FILTER */
@ VAR_T
Definition aeval.c:53
static int config_input(AVFilterLink *inlink)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
const FFFilter ff_vf_drawbox
const FFFilter ff_vf_drawgrid
#define U(x)
Definition vpx_arith.h:37
#define A(x)
Definition vpx_arith.h:28
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define V
Definition avdct.c:32
@ VAR_H
Definition avfilter.c:565
@ VAR_W
Definition avfilter.c:564
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
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:906
Main libavfilter public API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
@ VAR_VSUB
Definition boxblur.c:42
@ VARS_NB
Definition boxblur.c:43
@ VAR_HSUB
Definition boxblur.c:41
#define Y
Definition boxblur.h:37
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
common internal and external API header
#define NULL
Definition coverity.c:32
static AVFrame * frame
static av_always_inline AVDetectionBBox * av_get_detection_bbox(const AVDetectionBBoxHeader *header, unsigned int idx)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition drawutils.c:80
misc drawing utilities
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
int av_expr_parse_and_eval(double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
Parse and evaluate an expression.
Definition eval.c:839
simple arithmetic expression evaluator
@ VAR_MAX
Definition f_drawgraph.c:91
@ VAR_IW
Definition f_select.c:147
@ VAR_IH
Definition f_select.c:146
static int loop
Definition ffplay.c:338
#define fail
Definition test.h:479
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition opt.h:275
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
Definition avfilter.h:196
#define AVERROR(e)
Definition error.h:45
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
AVFrameSideDataType
Definition frame.h:49
@ AV_FRAME_DATA_DETECTION_BBOXES
Bounding boxes for object detection and classification, as described by AVDetectionBBoxHeader.
Definition frame.h:194
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define B
Definition huffyuv.h:42
#define R
Definition huffyuv.h:44
#define G
Definition huffyuv.h:43
static const int16_t alpha[]
Definition ilbcdata.h:55
#define C
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define AVFILTERPAD_FLAG_NEEDS_WRITABLE
The filter expects writable frames from its input link, duplicating data buffers if needed.
Definition filters.h:59
#define FILTER_PIXFMTS_ARRAY(array)
Definition filters.h:244
#define AVFILTER_DEFINE_CLASS(fname)
Definition filters.h:478
@ VAR_X
Definition vf_blend.c:55
@ VAR_Y
Definition vf_blend.c:55
#define av_always_inline
Definition attributes.h:72
#define av_cold
Definition attributes.h:117
#define av_pure
Definition attributes.h:105
Various defines for YUV<->RGB conversion.
#define RGB_TO_U_CCIR(r1, g1, b1, shift)
Definition colorspace.h:102
#define RGB_TO_Y_CCIR(r, g, b)
Definition colorspace.h:98
#define RGB_TO_V_CCIR(r1, g1, b1, shift)
Definition colorspace.h:106
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
const char * desc
Definition libsvtav1.c:83
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define NAN
var_name
Definition noise.c:46
static const char *const var_names[]
Definition noise.c:30
AVOptions.
int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, void *log_ctx)
Put the RGBA values that correspond to color_string in rgba_color.
Definition parseutils.c:359
misc parsing utilities
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:3425
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition pixdesc.h:147
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition pixdesc.h:136
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition pixfmt.h:75
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition pixfmt.h:106
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition pixfmt.h:265
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition pixfmt.h:99
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition pixfmt.h:102
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition pixfmt.h:101
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
Definition pixfmt.h:107
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
Definition pixfmt.h:264
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition pixfmt.h:100
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition pixfmt.h:174
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
Definition pixfmt.h:263
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition pixfmt.h:173
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Definition pixfmt.h:262
@ 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_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
@ VAR_SAR
Definition scale_eval.c:49
@ VAR_IN_W
Definition scale_eval.c:44
@ VAR_IN_H
Definition scale_eval.c:45
@ VAR_DAR
Definition scale_eval.c:50
static const uint8_t header[24]
Definition sdr2.c:68
Describe the class of an AVClass context structure.
Definition log.h:76
int x
Distance in pixels from the left/top edge of the frame, together with width and height,...
An instance of a filter.
Definition avfilter.h:273
void * priv
private data for use by the filter
Definition avfilter.h:288
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:285
A filter pad used for either input or output.
Definition filters.h:40
Structure to hold side data for an AVFrame.
Definition frame.h:327
uint8_t * data
Definition frame.h:329
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
int num
Numerator.
Definition rational.h:59
char * y_expr
expression for x and y
Definition vf_drawbox.c:89
void(* draw_region)(AVFrame *frame, struct DrawBoxContext *ctx, int left, int top, int right, int down, PixelBelongsToRegion pixel_belongs_to_region)
Definition vf_drawbox.c:98
char * h_expr
expression for width and height
Definition vf_drawbox.c:90
uint8_t rgba_map[4]
Definition vf_drawbox.c:84
int invert_color
invert luma color
Definition vf_drawbox.c:87
char * color_str
Definition vf_drawbox.c:83
char * t_expr
expression for thickness
Definition vf_drawbox.c:91
int hsub
chroma subsampling
Definition vf_drawbox.c:88
unsigned char yuv_color[4]
Definition vf_drawbox.c:86
uint8_t rgba_color[4]
Definition vf_drawbox.c:85
char * box_source_string
string for box data source
Definition vf_drawbox.c:92
enum AVFrameSideDataType box_source
Definition vf_drawbox.c:96
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
int(* PixelBelongsToRegion)(struct DrawBoxContext *s, int x, int y)
Definition vf_drawbox.c:77
static const int NUM_EXPR_EVALS
Definition vf_drawbox.c:102
static int config_input(AVFilterLink *inlink)
Definition vf_drawbox.c:271
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition vf_drawbox.c:372
#define ASSIGN_FOUR_CHANNELS
Definition vf_drawbox.c:109
#define ASSIGN_FOUR_CHANNELS_PACKED
Definition vf_drawbox.c:163
static av_pure av_always_inline int pixel_belongs_to_box(DrawBoxContext *s, int x, int y)
Definition vf_drawbox.c:366
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
Definition vf_drawbox.c:408
#define OFFSET(x)
Definition vf_drawbox.c:441
#define ASSIGN_THREE_CHANNELS_PACKED
Definition vf_drawbox.c:158
static void draw_region_rgb_packed(AVFrame *frame, DrawBoxContext *ctx, int left, int top, int right, int down, PixelBelongsToRegion pixel_belongs_to_region)
Definition vf_drawbox.c:167
static void draw_region(AVFrame *frame, DrawBoxContext *ctx, int left, int top, int right, int down, PixelBelongsToRegion pixel_belongs_to_region)
Definition vf_drawbox.c:113
#define ASSIGN_THREE_CHANNELS
Definition vf_drawbox.c:104
static enum AVFrameSideDataType box_source_string_parse(const char *box_source_string)
Definition vf_drawbox.c:219
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition video.c:37