FFmpeg
vf_overlay_cuda.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Yaroslav Pogrebnyak <yyyaroslav@gmail.com>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * Overlay one video on top of another using cuda hardware acceleration
24  */
25 
26 #include "libavutil/log.h"
27 #include "libavutil/opt.h"
28 #include "libavutil/pixdesc.h"
29 #include "libavutil/hwcontext.h"
31 #include "libavutil/cuda_check.h"
32 #include "libavutil/eval.h"
33 
34 #include "avfilter.h"
35 #include "filters.h"
36 #include "framesync.h"
37 #include "internal.h"
38 
39 #include "cuda/load_helper.h"
40 
41 #define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, ctx->hwctx->internal->cuda_dl, x)
42 #define DIV_UP(a, b) ( ((a) + (b) - 1) / (b) )
43 
44 #define BLOCK_X 32
45 #define BLOCK_Y 16
46 
47 #define MAIN 0
48 #define OVERLAY 1
49 
50 static const enum AVPixelFormat supported_main_formats[] = {
54 };
55 
61 };
62 
63 enum var_name {
74 };
75 
76 enum EvalMode {
80 };
81 
82 static const char *const var_names[] = {
83  "main_w", "W", ///< width of the main video
84  "main_h", "H", ///< height of the main video
85  "overlay_w", "w", ///< width of the overlay video
86  "overlay_h", "h", ///< height of the overlay video
87  "x",
88  "y",
89  "n", ///< number of frame
90  "pos", ///< position in the file
91  "t", ///< timestamp expressed in seconds
92  NULL
93 };
94 
95 /**
96  * OverlayCUDAContext
97  */
98 typedef struct OverlayCUDAContext {
99  const AVClass *class;
100 
103 
106 
107  CUcontext cu_ctx;
108  CUmodule cu_module;
109  CUfunction cu_func;
110  CUstream cu_stream;
111 
113 
117 
119  char *x_expr, *y_expr;
120 
123 
124 /**
125  * Helper to find out if provided format is supported by filter
126  */
127 static int format_is_supported(const enum AVPixelFormat formats[], enum AVPixelFormat fmt)
128 {
129  for (int i = 0; formats[i] != AV_PIX_FMT_NONE; i++)
130  if (formats[i] == fmt)
131  return 1;
132  return 0;
133 }
134 
135 static inline int normalize_xy(double d, int chroma_sub)
136 {
137  if (isnan(d))
138  return INT_MAX;
139  return (int)d & ~((1 << chroma_sub) - 1);
140 }
141 
143 {
144  OverlayCUDAContext *s = ctx->priv;
145 
146  s->var_values[VAR_X] = av_expr_eval(s->x_pexpr, s->var_values, NULL);
147  s->var_values[VAR_Y] = av_expr_eval(s->y_pexpr, s->var_values, NULL);
148  /* necessary if x is expressed from y */
149  s->var_values[VAR_X] = av_expr_eval(s->x_pexpr, s->var_values, NULL);
150 
151  s->x_position = normalize_xy(s->var_values[VAR_X], 1);
152 
153  /* the cuda pixel format is using hwaccel, normalizing y is unnecessary */
154  s->y_position = s->var_values[VAR_Y];
155 }
156 
157 static int set_expr(AVExpr **pexpr, const char *expr, const char *option, void *log_ctx)
158 {
159  int ret;
160  AVExpr *old = NULL;
161 
162  if (*pexpr)
163  old = *pexpr;
164  ret = av_expr_parse(pexpr, expr, var_names,
165  NULL, NULL, NULL, NULL, 0, log_ctx);
166  if (ret < 0) {
167  av_log(log_ctx, AV_LOG_ERROR,
168  "Error when evaluating the expression '%s' for %s\n",
169  expr, option);
170  *pexpr = old;
171  return ret;
172  }
173 
174  av_expr_free(old);
175  return 0;
176 }
177 
178 /**
179  * Helper checks if we can process main and overlay pixel formats
180  */
181 static int formats_match(const enum AVPixelFormat format_main, const enum AVPixelFormat format_overlay) {
182  switch(format_main) {
183  case AV_PIX_FMT_NV12:
184  return format_overlay == AV_PIX_FMT_NV12;
185  case AV_PIX_FMT_YUV420P:
186  return format_overlay == AV_PIX_FMT_YUV420P ||
187  format_overlay == AV_PIX_FMT_YUVA420P;
188  default:
189  return 0;
190  }
191 }
192 
193 /**
194  * Call overlay kernell for a plane
195  */
198  int x_position, int y_position,
199  uint8_t* main_data, int main_linesize,
200  int main_width, int main_height,
201  uint8_t* overlay_data, int overlay_linesize,
202  int overlay_width, int overlay_height,
203  uint8_t* alpha_data, int alpha_linesize,
204  int alpha_adj_x, int alpha_adj_y) {
205 
206  CudaFunctions *cu = ctx->hwctx->internal->cuda_dl;
207 
208  void* kernel_args[] = {
209  &x_position, &y_position,
210  &main_data, &main_linesize,
211  &overlay_data, &overlay_linesize,
212  &overlay_width, &overlay_height,
213  &alpha_data, &alpha_linesize,
214  &alpha_adj_x, &alpha_adj_y,
215  };
216 
217  return CHECK_CU(cu->cuLaunchKernel(
218  ctx->cu_func,
219  DIV_UP(main_width, BLOCK_X), DIV_UP(main_height, BLOCK_Y), 1,
220  BLOCK_X, BLOCK_Y, 1,
221  0, ctx->cu_stream, kernel_args, NULL));
222 }
223 
224 /**
225  * Perform blend overlay picture over main picture
226  */
228 {
229  int ret;
230 
231  AVFilterContext *avctx = fs->parent;
232  OverlayCUDAContext *ctx = avctx->priv;
233  AVFilterLink *outlink = avctx->outputs[0];
234  AVFilterLink *inlink = avctx->inputs[0];
235 
236  CudaFunctions *cu = ctx->hwctx->internal->cuda_dl;
237  CUcontext dummy, cuda_ctx = ctx->hwctx->cuda_ctx;
238 
239  AVFrame *input_main, *input_overlay;
240 
241  int pos = 0;
242 
243  ctx->cu_ctx = cuda_ctx;
244 
245  // read main and overlay frames from inputs
246  ret = ff_framesync_dualinput_get(fs, &input_main, &input_overlay);
247  if (ret < 0)
248  return ret;
249 
250  if (!input_main)
251  return AVERROR_BUG;
252 
253  if (!input_overlay)
254  return ff_filter_frame(outlink, input_main);
255 
256  ret = ff_inlink_make_frame_writable(inlink, &input_main);
257  if (ret < 0) {
258  av_frame_free(&input_main);
259  return ret;
260  }
261 
262  // push cuda context
263 
264  ret = CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
265  if (ret < 0) {
266  av_frame_free(&input_main);
267  return ret;
268  }
269 
270  if (ctx->eval_mode == EVAL_MODE_FRAME) {
271  pos = input_main->pkt_pos;
272  ctx->var_values[VAR_N] = inlink->frame_count_out;
273  ctx->var_values[VAR_T] = input_main->pts == AV_NOPTS_VALUE ?
274  NAN : input_main->pts * av_q2d(inlink->time_base);
275  ctx->var_values[VAR_POS] = pos == -1 ? NAN : pos;
276  ctx->var_values[VAR_OVERLAY_W] = ctx->var_values[VAR_OW] = input_overlay->width;
277  ctx->var_values[VAR_OVERLAY_H] = ctx->var_values[VAR_OH] = input_overlay->height;
278  ctx->var_values[VAR_MAIN_W ] = ctx->var_values[VAR_MW] = input_main->width;
279  ctx->var_values[VAR_MAIN_H ] = ctx->var_values[VAR_MH] = input_main->height;
280 
281  eval_expr(avctx);
282 
283  av_log(avctx, AV_LOG_DEBUG, "n:%f t:%f pos:%f x:%f xi:%d y:%f yi:%d\n",
284  ctx->var_values[VAR_N], ctx->var_values[VAR_T], ctx->var_values[VAR_POS],
285  ctx->var_values[VAR_X], ctx->x_position,
286  ctx->var_values[VAR_Y], ctx->y_position);
287  }
288 
289  // overlay first plane
290 
292  ctx->x_position, ctx->y_position,
293  input_main->data[0], input_main->linesize[0],
294  input_main->width, input_main->height,
295  input_overlay->data[0], input_overlay->linesize[0],
296  input_overlay->width, input_overlay->height,
297  input_overlay->data[3], input_overlay->linesize[3], 1, 1);
298 
299  // overlay rest planes depending on pixel format
300 
301  switch(ctx->in_format_overlay) {
302  case AV_PIX_FMT_NV12:
304  ctx->x_position, ctx->y_position / 2,
305  input_main->data[1], input_main->linesize[1],
306  input_main->width, input_main->height / 2,
307  input_overlay->data[1], input_overlay->linesize[1],
308  input_overlay->width, input_overlay->height / 2,
309  0, 0, 0, 0);
310  break;
311  case AV_PIX_FMT_YUV420P:
312  case AV_PIX_FMT_YUVA420P:
314  ctx->x_position / 2 , ctx->y_position / 2,
315  input_main->data[1], input_main->linesize[1],
316  input_main->width / 2, input_main->height / 2,
317  input_overlay->data[1], input_overlay->linesize[1],
318  input_overlay->width / 2, input_overlay->height / 2,
319  input_overlay->data[3], input_overlay->linesize[3], 2, 2);
320 
322  ctx->x_position / 2 , ctx->y_position / 2,
323  input_main->data[2], input_main->linesize[2],
324  input_main->width / 2, input_main->height / 2,
325  input_overlay->data[2], input_overlay->linesize[2],
326  input_overlay->width / 2, input_overlay->height / 2,
327  input_overlay->data[3], input_overlay->linesize[3], 2, 2);
328  break;
329  default:
330  av_log(ctx, AV_LOG_ERROR, "Passed unsupported overlay pixel format\n");
331  av_frame_free(&input_main);
332  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
333  return AVERROR_BUG;
334  }
335 
336  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
337 
338  return ff_filter_frame(outlink, input_main);
339 }
340 
342 {
343  AVFilterContext *ctx = inlink->dst;
344  OverlayCUDAContext *s = inlink->dst->priv;
345  int ret;
346 
347 
348  /* Finish the configuration by evaluating the expressions
349  now when both inputs are configured. */
350  s->var_values[VAR_MAIN_W ] = s->var_values[VAR_MW] = ctx->inputs[MAIN ]->w;
351  s->var_values[VAR_MAIN_H ] = s->var_values[VAR_MH] = ctx->inputs[MAIN ]->h;
352  s->var_values[VAR_OVERLAY_W] = s->var_values[VAR_OW] = ctx->inputs[OVERLAY]->w;
353  s->var_values[VAR_OVERLAY_H] = s->var_values[VAR_OH] = ctx->inputs[OVERLAY]->h;
354  s->var_values[VAR_X] = NAN;
355  s->var_values[VAR_Y] = NAN;
356  s->var_values[VAR_N] = 0;
357  s->var_values[VAR_T] = NAN;
358  s->var_values[VAR_POS] = NAN;
359 
360  if ((ret = set_expr(&s->x_pexpr, s->x_expr, "x", ctx)) < 0 ||
361  (ret = set_expr(&s->y_pexpr, s->y_expr, "y", ctx)) < 0)
362  return ret;
363 
364  if (s->eval_mode == EVAL_MODE_INIT) {
365  eval_expr(ctx);
366  av_log(ctx, AV_LOG_VERBOSE, "x:%f xi:%d y:%f yi:%d\n",
367  s->var_values[VAR_X], s->x_position,
368  s->var_values[VAR_Y], s->y_position);
369  }
370 
371  return 0;
372 }
373 
374 /**
375  * Initialize overlay_cuda
376  */
378 {
379  OverlayCUDAContext* ctx = avctx->priv;
380  ctx->fs.on_event = &overlay_cuda_blend;
381 
382  return 0;
383 }
384 
385 /**
386  * Uninitialize overlay_cuda
387  */
389 {
390  OverlayCUDAContext* ctx = avctx->priv;
391 
392  ff_framesync_uninit(&ctx->fs);
393 
394  if (ctx->hwctx && ctx->cu_module) {
395  CUcontext dummy;
396  CudaFunctions *cu = ctx->hwctx->internal->cuda_dl;
397  CHECK_CU(cu->cuCtxPushCurrent(ctx->cu_ctx));
398  CHECK_CU(cu->cuModuleUnload(ctx->cu_module));
399  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
400  }
401 
402  av_expr_free(ctx->x_pexpr); ctx->x_pexpr = NULL;
403  av_expr_free(ctx->y_pexpr); ctx->y_pexpr = NULL;
404  av_buffer_unref(&ctx->hw_device_ctx);
405  ctx->hwctx = NULL;
406 }
407 
408 /**
409  * Activate overlay_cuda
410  */
412 {
413  OverlayCUDAContext *ctx = avctx->priv;
414 
415  return ff_framesync_activate(&ctx->fs);
416 }
417 
418 /**
419  * Configure output
420  */
422 {
423  extern const unsigned char ff_vf_overlay_cuda_ptx_data[];
424  extern const unsigned int ff_vf_overlay_cuda_ptx_len;
425 
426  int err;
427  AVFilterContext* avctx = outlink->src;
428  OverlayCUDAContext* ctx = avctx->priv;
429 
430  AVFilterLink *inlink = avctx->inputs[0];
431  AVHWFramesContext *frames_ctx = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
432 
433  AVFilterLink *inlink_overlay = avctx->inputs[1];
434  AVHWFramesContext *frames_ctx_overlay = (AVHWFramesContext*)inlink_overlay->hw_frames_ctx->data;
435 
436  CUcontext dummy, cuda_ctx;
437  CudaFunctions *cu;
438 
439  // check main input formats
440 
441  if (!frames_ctx) {
442  av_log(ctx, AV_LOG_ERROR, "No hw context provided on main input\n");
443  return AVERROR(EINVAL);
444  }
445 
446  ctx->in_format_main = frames_ctx->sw_format;
447  if (!format_is_supported(supported_main_formats, ctx->in_format_main)) {
448  av_log(ctx, AV_LOG_ERROR, "Unsupported main input format: %s\n",
449  av_get_pix_fmt_name(ctx->in_format_main));
450  return AVERROR(ENOSYS);
451  }
452 
453  // check overlay input formats
454 
455  if (!frames_ctx_overlay) {
456  av_log(ctx, AV_LOG_ERROR, "No hw context provided on overlay input\n");
457  return AVERROR(EINVAL);
458  }
459 
460  ctx->in_format_overlay = frames_ctx_overlay->sw_format;
461  if (!format_is_supported(supported_overlay_formats, ctx->in_format_overlay)) {
462  av_log(ctx, AV_LOG_ERROR, "Unsupported overlay input format: %s\n",
463  av_get_pix_fmt_name(ctx->in_format_overlay));
464  return AVERROR(ENOSYS);
465  }
466 
467  // check we can overlay pictures with those pixel formats
468 
469  if (!formats_match(ctx->in_format_main, ctx->in_format_overlay)) {
470  av_log(ctx, AV_LOG_ERROR, "Can't overlay %s on %s \n",
471  av_get_pix_fmt_name(ctx->in_format_overlay), av_get_pix_fmt_name(ctx->in_format_main));
472  return AVERROR(EINVAL);
473  }
474 
475  // initialize
476 
477  ctx->hw_device_ctx = av_buffer_ref(frames_ctx->device_ref);
478  if (!ctx->hw_device_ctx)
479  return AVERROR(ENOMEM);
480  ctx->hwctx = ((AVHWDeviceContext*)ctx->hw_device_ctx->data)->hwctx;
481 
482  cuda_ctx = ctx->hwctx->cuda_ctx;
483  ctx->fs.time_base = inlink->time_base;
484 
485  ctx->cu_stream = ctx->hwctx->stream;
486 
487  outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
488  if (!outlink->hw_frames_ctx)
489  return AVERROR(ENOMEM);
490 
491  // load functions
492 
493  cu = ctx->hwctx->internal->cuda_dl;
494 
495  err = CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
496  if (err < 0) {
497  return err;
498  }
499 
500  err = ff_cuda_load_module(ctx, ctx->hwctx, &ctx->cu_module, ff_vf_overlay_cuda_ptx_data, ff_vf_overlay_cuda_ptx_len);
501  if (err < 0) {
502  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
503  return err;
504  }
505 
506  err = CHECK_CU(cu->cuModuleGetFunction(&ctx->cu_func, ctx->cu_module, "Overlay_Cuda"));
507  if (err < 0) {
508  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
509  return err;
510  }
511 
512  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
513 
514  // init dual input
515 
516  err = ff_framesync_init_dualinput(&ctx->fs, avctx);
517  if (err < 0) {
518  return err;
519  }
520 
521  return ff_framesync_configure(&ctx->fs);
522 }
523 
524 
525 #define OFFSET(x) offsetof(OverlayCUDAContext, x)
526 #define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
527 
528 static const AVOption overlay_cuda_options[] = {
529  { "x", "set the x expression of overlay", OFFSET(x_expr), AV_OPT_TYPE_STRING, { .str = "0" }, 0, 0, FLAGS },
530  { "y", "set the y expression of overlay", OFFSET(y_expr), AV_OPT_TYPE_STRING, { .str = "0" }, 0, 0, FLAGS },
531  { "eof_action", "Action to take when encountering EOF from secondary input ",
532  OFFSET(fs.opt_eof_action), AV_OPT_TYPE_INT, { .i64 = EOF_ACTION_REPEAT },
533  EOF_ACTION_REPEAT, EOF_ACTION_PASS, .flags = FLAGS, "eof_action" },
534  { "repeat", "Repeat the previous frame.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_REPEAT }, .flags = FLAGS, "eof_action" },
535  { "endall", "End both streams.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_ENDALL }, .flags = FLAGS, "eof_action" },
536  { "pass", "Pass through the main input.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_PASS }, .flags = FLAGS, "eof_action" },
537  { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, { .i64 = EVAL_MODE_FRAME }, 0, EVAL_MODE_NB - 1, FLAGS, "eval" },
538  { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, { .i64=EVAL_MODE_INIT }, .flags = FLAGS, .unit = "eval" },
539  { "frame", "eval expressions per-frame", 0, AV_OPT_TYPE_CONST, { .i64=EVAL_MODE_FRAME }, .flags = FLAGS, .unit = "eval" },
540  { "shortest", "force termination when the shortest input terminates", OFFSET(fs.opt_shortest), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
541  { "repeatlast", "repeat overlay of the last overlay frame", OFFSET(fs.opt_repeatlast), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
542  { NULL },
543 };
544 
546 
548  {
549  .name = "main",
550  .type = AVMEDIA_TYPE_VIDEO,
551  },
552  {
553  .name = "overlay",
554  .type = AVMEDIA_TYPE_VIDEO,
555  .config_props = config_input_overlay,
556  },
557 };
558 
560  {
561  .name = "default",
562  .type = AVMEDIA_TYPE_VIDEO,
563  .config_props = &overlay_cuda_config_output,
564  },
565 };
566 
568  .name = "overlay_cuda",
569  .description = NULL_IF_CONFIG_SMALL("Overlay one video on top of another using CUDA"),
570  .priv_size = sizeof(OverlayCUDAContext),
571  .priv_class = &overlay_cuda_class,
578  .preinit = overlay_cuda_framesync_preinit,
579  .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
580 };
formats
formats
Definition: signature.h:48
ff_framesync_configure
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
Definition: framesync.c:134
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:253
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
formats_match
static int formats_match(const enum AVPixelFormat format_main, const enum AVPixelFormat format_overlay)
Helper checks if we can process main and overlay pixel formats.
Definition: vf_overlay_cuda.c:181
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
overlay_cuda_call_kernel
static int overlay_cuda_call_kernel(OverlayCUDAContext *ctx, int x_position, int y_position, uint8_t *main_data, int main_linesize, int main_width, int main_height, uint8_t *overlay_data, int overlay_linesize, int overlay_width, int overlay_height, uint8_t *alpha_data, int alpha_linesize, int alpha_adj_x, int alpha_adj_y)
Call overlay kernell for a plane.
Definition: vf_overlay_cuda.c:196
VAR_POS
@ VAR_POS
Definition: vf_overlay_cuda.c:71
hwcontext_cuda_internal.h
ff_framesync_uninit
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
Definition: framesync.c:304
FF_FILTER_FLAG_HWFRAME_AWARE
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
Definition: internal.h:374
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:969
overlay_cuda_inputs
static const AVFilterPad overlay_cuda_inputs[]
Definition: vf_overlay_cuda.c:547
OverlayCUDAContext::y_position
int y_position
Definition: vf_overlay_cuda.c:116
OverlayCUDAContext::cu_ctx
CUcontext cu_ctx
Definition: vf_overlay_cuda.c:107
EVAL_MODE_INIT
@ EVAL_MODE_INIT
Definition: vf_overlay_cuda.c:77
ff_cuda_load_module
int ff_cuda_load_module(void *avctx, AVCUDADeviceContext *hwctx, CUmodule *cu_module, const unsigned char *data, const unsigned int length)
Loads a CUDA module and applies any decompression, if neccesary.
Definition: load_helper.c:34
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:99
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:330
pixdesc.h
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:437
AVFrame::width
int width
Definition: frame.h:402
OverlayCUDAContext::hw_device_ctx
AVBufferRef * hw_device_ctx
Definition: vf_overlay_cuda.c:104
OverlayCUDAContext::in_format_overlay
enum AVPixelFormat in_format_overlay
Definition: vf_overlay_cuda.c:101
AVOption
AVOption.
Definition: opt.h:251
normalize_xy
static int normalize_xy(double d, int chroma_sub)
Definition: vf_overlay_cuda.c:135
EOF_ACTION_ENDALL
@ EOF_ACTION_ENDALL
Definition: framesync.h:28
overlay_cuda_outputs
static const AVFilterPad overlay_cuda_outputs[]
Definition: vf_overlay_cuda.c:559
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
OverlayCUDAContext::in_format_main
enum AVPixelFormat in_format_main
Definition: vf_overlay_cuda.c:102
OVERLAY
#define OVERLAY
Definition: vf_overlay_cuda.c:48
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:165
FFFrameSync
Frame sync structure.
Definition: framesync.h:168
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:351
av_expr_parse
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition: eval.c:685
ff_vf_overlay_cuda
const AVFilter ff_vf_overlay_cuda
Definition: vf_overlay_cuda.c:567
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:407
VAR_MW
@ VAR_MW
Definition: vf_overlay_cuda.c:64
dummy
int dummy
Definition: motion.c:65
OverlayCUDAContext::fs
FFFrameSync fs
Definition: vf_overlay_cuda.c:112
av_expr_free
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition: eval.c:336
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:49
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:61
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
s
#define s(width, name)
Definition: cbs_vp9.c:256
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:101
AVFrame::pkt_pos
int64_t pkt_pos
reordered pos from the last AVPacket that has been input into the decoder
Definition: frame.h:619
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
OverlayCUDAContext::x_position
int x_position
Definition: vf_overlay_cuda.c:115
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:365
OFFSET
#define OFFSET(x)
Definition: vf_overlay_cuda.c:525
filters.h
var_name
var_name
Definition: noise_bsf.c:46
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
ctx
AVFormatContext * ctx
Definition: movenc.c:48
av_expr_eval
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:766
AVExpr
Definition: eval.c:157
VAR_OH
@ VAR_OH
Definition: vf_overlay_cuda.c:67
load_helper.h
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:66
EOF_ACTION_PASS
@ EOF_ACTION_PASS
Definition: framesync.h:29
overlay_cuda_config_output
static int overlay_cuda_config_output(AVFilterLink *outlink)
Configure output.
Definition: vf_overlay_cuda.c:421
NAN
#define NAN
Definition: mathematics.h:64
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:194
ff_inlink_make_frame_writable
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
Make sure a frame is writable.
Definition: avfilter.c:1408
option
option
Definition: libkvazaar.c:312
CHECK_CU
#define CHECK_CU(x)
Definition: vf_overlay_cuda.c:41
set_expr
static int set_expr(AVExpr **pexpr, const char *expr, const char *option, void *log_ctx)
Definition: vf_overlay_cuda.c:157
config_input_overlay
static int config_input_overlay(AVFilterLink *inlink)
Definition: vf_overlay_cuda.c:341
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
BLOCK_Y
#define BLOCK_Y
Definition: vf_overlay_cuda.c:45
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:222
OverlayCUDAContext::x_expr
char * x_expr
Definition: vf_overlay_cuda.c:119
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
EVAL_MODE_NB
@ EVAL_MODE_NB
Definition: vf_overlay_cuda.c:79
fs
#define fs(width, name, subs,...)
Definition: cbs_vp9.c:258
AVHWFramesContext::device_ref
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
Definition: hwcontext.h:141
isnan
#define isnan(x)
Definition: libm.h:340
activate
filter_frame For filters that do not use the activate() callback
AVFilterContext::inputs
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:400
MAIN
#define MAIN
Definition: vf_overlay_cuda.c:47
overlay_cuda_init
static av_cold int overlay_cuda_init(AVFilterContext *avctx)
Initialize overlay_cuda.
Definition: vf_overlay_cuda.c:377
eval.h
FRAMESYNC_DEFINE_CLASS
FRAMESYNC_DEFINE_CLASS(overlay_cuda, OverlayCUDAContext, fs)
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:115
ff_framesync_init_dualinput
int ff_framesync_init_dualinput(FFFrameSync *fs, AVFilterContext *parent)
Initialize a frame sync structure for dualinput.
Definition: framesync.c:372
VAR_Y
@ VAR_Y
Definition: vf_overlay_cuda.c:69
OverlayCUDAContext::x_pexpr
AVExpr * x_pexpr
Definition: vf_overlay_cuda.c:121
VAR_MAIN_H
@ VAR_MAIN_H
Definition: vf_overlay_cuda.c:65
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
FLAGS
#define FLAGS
Definition: vf_overlay_cuda.c:526
overlay_cuda_options
static const AVOption overlay_cuda_options[]
Definition: vf_overlay_cuda.c:528
VAR_T
@ VAR_T
Definition: vf_overlay_cuda.c:72
EVAL_MODE_FRAME
@ EVAL_MODE_FRAME
Definition: vf_overlay_cuda.c:78
OverlayCUDAContext
OverlayCUDAContext.
Definition: vf_overlay_cuda.c:98
overlay_cuda_uninit
static av_cold void overlay_cuda_uninit(AVFilterContext *avctx)
Uninitialize overlay_cuda.
Definition: vf_overlay_cuda.c:388
format_is_supported
static int format_is_supported(const enum AVPixelFormat formats[], enum AVPixelFormat fmt)
Helper to find out if provided format is supported by filter.
Definition: vf_overlay_cuda.c:127
VAR_X
@ VAR_X
Definition: vf_overlay_cuda.c:68
internal.h
FILTER_SINGLE_PIXFMT
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition: internal.h:184
overlay_cuda_blend
static int overlay_cuda_blend(FFFrameSync *fs)
Perform blend overlay picture over main picture.
Definition: vf_overlay_cuda.c:227
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
VAR_OVERLAY_H
@ VAR_OVERLAY_H
Definition: vf_overlay_cuda.c:67
OverlayCUDAContext::hwctx
AVCUDADeviceContext * hwctx
Definition: vf_overlay_cuda.c:105
EvalMode
EvalMode
Definition: af_volume.h:39
BLOCK_X
#define BLOCK_X
Definition: vf_overlay_cuda.c:44
OverlayCUDAContext::cu_stream
CUstream cu_stream
Definition: vf_overlay_cuda.c:110
OverlayCUDAContext::cu_func
CUfunction cu_func
Definition: vf_overlay_cuda.c:109
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:55
AVFilter
Filter definition.
Definition: avfilter.h:161
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:124
AVCUDADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_cuda.h:42
supported_overlay_formats
static enum AVPixelFormat supported_overlay_formats[]
Definition: vf_overlay_cuda.c:56
ret
ret
Definition: filter_design.txt:187
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:89
cuda_check.h
OverlayCUDAContext::cu_module
CUmodule cu_module
Definition: vf_overlay_cuda.c:108
pos
unsigned int pos
Definition: spdifenc.c:413
EOF_ACTION_REPEAT
@ EOF_ACTION_REPEAT
Definition: framesync.h:27
AVFrame::height
int height
Definition: frame.h:402
OverlayCUDAContext::y_pexpr
AVExpr * y_pexpr
Definition: vf_overlay_cuda.c:121
supported_main_formats
static enum AVPixelFormat supported_main_formats[]
Definition: vf_overlay_cuda.c:50
framesync.h
DIV_UP
#define DIV_UP(a, b)
Definition: vf_overlay_cuda.c:42
VAR_MH
@ VAR_MH
Definition: vf_overlay_cuda.c:65
VAR_OW
@ VAR_OW
Definition: vf_overlay_cuda.c:66
OverlayCUDAContext::y_expr
char * y_expr
Definition: vf_overlay_cuda.c:119
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
avfilter.h
VAR_OVERLAY_W
@ VAR_OVERLAY_W
Definition: vf_overlay_cuda.c:66
AVFilterContext
An instance of a filter.
Definition: avfilter.h:392
var_names
static const char *const var_names[]
Definition: vf_overlay_cuda.c:82
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
VAR_MAIN_W
@ VAR_MAIN_W
Definition: vf_overlay_cuda.c:64
overlay_cuda_activate
static int overlay_cuda_activate(AVFilterContext *avctx)
Activate overlay_cuda.
Definition: vf_overlay_cuda.c:411
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:244
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:195
VAR_VARS_NB
@ VAR_VARS_NB
Definition: vf_overlay_cuda.c:73
VAR_N
@ VAR_N
Definition: vf_overlay_cuda.c:70
d
d
Definition: ffmpeg_filter.c:156
hwcontext.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
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:375
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
eval_expr
static void eval_expr(AVFilterContext *ctx)
Definition: vf_overlay_cuda.c:142
uninit
static av_cold int uninit(AVCodecContext *avctx)
Definition: crystalhd.c:285
ff_framesync_activate
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
Definition: framesync.c:355
ff_framesync_dualinput_get
int ff_framesync_dualinput_get(FFFrameSync *fs, AVFrame **f0, AVFrame **f1)
Definition: framesync.c:390
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:229
OverlayCUDAContext::eval_mode
int eval_mode
Definition: vf_overlay_cuda.c:114
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2808
AVFilterContext::outputs
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:404
OverlayCUDAContext::var_values
double var_values[VAR_VARS_NB]
Definition: vf_overlay_cuda.c:118