FFmpeg
Loading...
Searching...
No Matches
vf_overlay_vaapi.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18#include <string.h>
19
20#include "libavutil/opt.h"
21#include "libavutil/pixdesc.h"
22
23#include "avfilter.h"
24#include "filters.h"
25#include "framesync.h"
26#include "vaapi_vpp.h"
27#include "video.h"
28#include "libavutil/eval.h"
29
41
42typedef struct OverlayVAAPIContext {
43 VAAPIVPPContext vpp_ctx; /**< must be the first field */
45
51 int ox;
52 int oy;
53 int ow;
54 int oh;
55 float alpha;
56 unsigned int blend_flags;
59
60static const char *const var_names[] = {
61 "main_w", "W", /* input width of the main layer */
62 "main_h", "H", /* input height of the main layer */
63 "overlay_iw", /* input width of the overlay layer */
64 "overlay_ih", /* input height of the overlay layer */
65 "overlay_x", "x", /* x position of the overlay layer inside of main */
66 "overlay_y", "y", /* y position of the overlay layer inside of main */
67 "overlay_w", "w", /* output width of overlay layer */
68 "overlay_h", "h", /* output height of overlay layer */
69 NULL
70};
71
72static int eval_expr(AVFilterContext *avctx)
73{
75 double *var_values = ctx->var_values;
76 int ret = 0;
77 AVExpr *ox_expr = NULL, *oy_expr = NULL;
78 AVExpr *ow_expr = NULL, *oh_expr = NULL;
79
80#define PARSE_EXPR(e, s) {\
81 ret = av_expr_parse(&(e), s, var_names, NULL, NULL, NULL, NULL, 0, ctx); \
82 if (ret < 0) {\
83 av_log(ctx, AV_LOG_ERROR, "Error when parsing '%s'.\n", s);\
84 goto release;\
85 }\
86}
87 PARSE_EXPR(ox_expr, ctx->overlay_ox)
88 PARSE_EXPR(oy_expr, ctx->overlay_oy)
89 PARSE_EXPR(ow_expr, ctx->overlay_ow)
90 PARSE_EXPR(oh_expr, ctx->overlay_oh)
91#undef PASS_EXPR
92
93 var_values[VAR_OVERLAY_W] =
94 var_values[VAR_OW] = av_expr_eval(ow_expr, var_values, NULL);
95 var_values[VAR_OVERLAY_H] =
96 var_values[VAR_OH] = av_expr_eval(oh_expr, var_values, NULL);
97
98 /* calc again in case ow is relative to oh */
99 var_values[VAR_OVERLAY_W] =
100 var_values[VAR_OW] = av_expr_eval(ow_expr, var_values, NULL);
101
102 var_values[VAR_OVERLAY_X] =
103 var_values[VAR_OX] = av_expr_eval(ox_expr, var_values, NULL);
104 var_values[VAR_OVERLAY_Y] =
105 var_values[VAR_OY] = av_expr_eval(oy_expr, var_values, NULL);
106
107 /* calc again in case ox is relative to oy */
108 var_values[VAR_OVERLAY_X] =
109 var_values[VAR_OX] = av_expr_eval(ox_expr, var_values, NULL);
110
111 /* calc overlay_w and overlay_h again in case relative to ox,oy */
112 var_values[VAR_OVERLAY_W] =
113 var_values[VAR_OW] = av_expr_eval(ow_expr, var_values, NULL);
114 var_values[VAR_OVERLAY_H] =
115 var_values[VAR_OH] = av_expr_eval(oh_expr, var_values, NULL);
116 var_values[VAR_OVERLAY_W] =
117 var_values[VAR_OW] = av_expr_eval(ow_expr, var_values, NULL);
118
119release:
120 av_expr_free(ox_expr);
121 av_expr_free(oy_expr);
122 av_expr_free(ow_expr);
123 av_expr_free(oh_expr);
124
125 return ret;
126}
127
129{
130 VAAPIVPPContext *vpp_ctx = avctx->priv;
131 VAStatus vas;
132 int support_flag;
133 VAProcPipelineCaps pipeline_caps;
134
135 memset(&pipeline_caps, 0, sizeof(pipeline_caps));
136 vas = vaQueryVideoProcPipelineCaps(vpp_ctx->hwctx->display,
137 vpp_ctx->va_context,
138 NULL, 0,
139 &pipeline_caps);
140 if (vas != VA_STATUS_SUCCESS) {
141 av_log(avctx, AV_LOG_ERROR, "Failed to query pipeline "
142 "caps: %d (%s).\n", vas, vaErrorStr(vas));
143 return AVERROR(EIO);
144 }
145
146 if (!pipeline_caps.blend_flags) {
147 av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support overlay\n");
148 return AVERROR(EINVAL);
149 }
150
151 support_flag = pipeline_caps.blend_flags & VA_BLEND_GLOBAL_ALPHA;
152 if (!support_flag) {
153 av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support global alpha blending\n");
154 return AVERROR(EINVAL);
155 }
156
157 return 0;
158}
159
161{
162 AVFilterContext *avctx = fs->parent;
163 AVFilterLink *outlink = avctx->outputs[0];
164 OverlayVAAPIContext *ctx = avctx->priv;
165 VAAPIVPPContext *vpp_ctx = avctx->priv;
166 AVFrame *input_main, *input_overlay;
167 AVFrame *output;
168 VAProcPipelineParameterBuffer params[2];
169 VABlendState blend_state = { 0 }; /**< Blend State */
170 VARectangle overlay_region, output_region;
171 int err;
172
173 err = ff_framesync_get_frame(fs, 0, &input_main, 0);
174 if (err < 0)
175 return err;
176 err = ff_framesync_get_frame(fs, 1, &input_overlay, 0);
177 if (err < 0)
178 return err;
179
180 av_log(avctx, AV_LOG_DEBUG, "Filter main: %s, %ux%u (%"PRId64").\n",
181 av_get_pix_fmt_name(input_main->format),
182 input_main->width, input_main->height, input_main->pts);
183
184 if (vpp_ctx->va_context == VA_INVALID_ID)
185 return AVERROR(EINVAL);
186
187 output = ff_get_video_buffer(outlink, outlink->w, outlink->h);
188 if (!output) {
189 err = AVERROR(ENOMEM);
190 goto fail;
191 }
192
193 err = av_frame_copy_props(output, input_main);
194 if (err < 0)
195 goto fail;
196
197 err = ff_vaapi_vpp_init_params(avctx, &params[0],
198 input_main, output);
199 if (err < 0)
200 goto fail;
201
202 output_region = (VARectangle) {
203 .x = 0,
204 .y = 0,
205 .width = output->width,
206 .height = output->height,
207 };
208
209 params[0].output_region = &output_region;
210 params[0].output_background_color = VAAPI_VPP_BACKGROUND_BLACK;
211
212 if (input_overlay) {
213 av_log(avctx, AV_LOG_DEBUG, "Filter overlay: %s, %ux%u (%"PRId64").\n",
214 av_get_pix_fmt_name(input_overlay->format),
215 input_overlay->width, input_overlay->height, input_overlay->pts);
216
217 overlay_region = (VARectangle) {
218 .x = ctx->ox,
219 .y = ctx->oy,
220 .width = ctx->ow ? ctx->ow : input_overlay->width,
221 .height = ctx->oh ? ctx->oh : input_overlay->height,
222 };
223
224 if (overlay_region.x + overlay_region.width > input_main->width ||
225 overlay_region.y + overlay_region.height > input_main->height) {
227 "The overlay image exceeds the scope of the main image, "
228 "will crop the overlay image according based on the main image.\n");
229 }
230
231 memcpy(&params[1], &params[0], sizeof(params[0]));
232
233 blend_state.flags = ctx->blend_flags;
234 blend_state.global_alpha = ctx->blend_alpha;
235 params[1].blend_state = &blend_state;
236
237 params[1].surface = (VASurfaceID)(uintptr_t)input_overlay->data[3];
238 params[1].surface_region = NULL;
239 params[1].output_region = &overlay_region;
240 }
241
242 err = ff_vaapi_vpp_render_pictures(avctx, params, input_overlay ? 2 : 1, output);
243 if (err < 0)
244 goto fail;
245
246 av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
248 output->width, output->height, output->pts);
249
250 return ff_filter_frame(outlink, output);
251
252fail:
253 av_frame_free(&output);
254 return err;
255}
256
258{
259 FilterLink *l = ff_filter_link(link);
260 enum AVPixelFormat pix_fmt = link->format;
262 AVHWFramesContext *fctx;
263
264 if (link->format == AV_PIX_FMT_VAAPI) {
266 pix_fmt = fctx->sw_format;
267 }
268
270 if (!desc)
271 return 0;
272
273 return !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
274}
275
277{
278 AVFilterContext *avctx = inlink->dst;
279 OverlayVAAPIContext *ctx = avctx->priv;
280
281 ctx->var_values[VAR_MAIN_IW] =
282 ctx->var_values[VAR_MW] = inlink->w;
283 ctx->var_values[VAR_MAIN_IH] =
284 ctx->var_values[VAR_MH] = inlink->h;
285
286 return ff_vaapi_vpp_config_input(inlink);
287}
288
290{
291 AVFilterContext *avctx = inlink->dst;
292 OverlayVAAPIContext *ctx = avctx->priv;
293 int ret;
294
295 ctx->var_values[VAR_OVERLAY_IW] = inlink->w;
296 ctx->var_values[VAR_OVERLAY_IH] = inlink->h;
297
298 ret = eval_expr(avctx);
299 if (ret < 0)
300 return ret;
301
302 ctx->ox = (int)ctx->var_values[VAR_OX];
303 ctx->oy = (int)ctx->var_values[VAR_OY];
304 ctx->ow = (int)ctx->var_values[VAR_OW];
305 ctx->oh = (int)ctx->var_values[VAR_OH];
306
307 ctx->blend_flags = 0;
308 ctx->blend_alpha = 1.0f;
309
310 if (ctx->alpha < 1.0f) {
311 ctx->blend_flags |= VA_BLEND_GLOBAL_ALPHA;
312 ctx->blend_alpha = ctx->alpha;
313 }
314
315 if (have_alpha_planar(inlink))
316 ctx->blend_flags |= VA_BLEND_PREMULTIPLIED_ALPHA;
317
318 return 0;
319}
320
322{
323 AVFilterContext *avctx = outlink->src;
324 OverlayVAAPIContext *ctx = avctx->priv;
325 VAAPIVPPContext *vpp_ctx = avctx->priv;
326 int err;
327
328 outlink->time_base = avctx->inputs[0]->time_base;
329 vpp_ctx->output_width = avctx->inputs[0]->w;
330 vpp_ctx->output_height = avctx->inputs[0]->h;
331
332 err = ff_vaapi_vpp_config_output(outlink);
333 if (err < 0)
334 return err;
335
337 if (err < 0)
338 return err;
339
340 err = ff_framesync_init_dualinput(&ctx->fs, avctx);
341 if (err < 0)
342 return err;
343
344 ctx->fs.on_event = overlay_vaapi_blend;
345 ctx->fs.time_base = outlink->time_base;
346
347 return ff_framesync_configure(&ctx->fs);
348}
349
351{
352 VAAPIVPPContext *vpp_ctx = avctx->priv;
353
356
357 return 0;
358}
359
361{
362 OverlayVAAPIContext *ctx = avctx->priv;
363
364 return ff_framesync_activate(&ctx->fs);
365}
366
368{
369 OverlayVAAPIContext *ctx = avctx->priv;
370
373}
374
375#define OFFSET(x) offsetof(OverlayVAAPIContext, x)
376#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
378 { "x", "Overlay x position", OFFSET(overlay_ox), AV_OPT_TYPE_STRING, { .str="0"}, 0, 255, .flags = FLAGS},
379 { "y", "Overlay y position", OFFSET(overlay_oy), AV_OPT_TYPE_STRING, { .str="0"}, 0, 255, .flags = FLAGS},
380 { "w", "Overlay width", OFFSET(overlay_ow), AV_OPT_TYPE_STRING, { .str="overlay_iw"}, 0, 255, .flags = FLAGS},
381 { "h", "Overlay height", OFFSET(overlay_oh), AV_OPT_TYPE_STRING, { .str="overlay_ih*w/overlay_iw"}, 0, 255, .flags = FLAGS},
382 { "alpha", "Overlay global alpha", OFFSET(alpha), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 1.0, .flags = FLAGS },
383 { "eof_action", "Action to take when encountering EOF from secondary input ",
384 OFFSET(fs.opt_eof_action), AV_OPT_TYPE_INT, { .i64 = EOF_ACTION_REPEAT },
385 EOF_ACTION_REPEAT, EOF_ACTION_PASS, .flags = FLAGS, .unit = "eof_action" },
386 { "repeat", "Repeat the previous frame.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_REPEAT }, .flags = FLAGS, .unit = "eof_action" },
387 { "endall", "End both streams.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_ENDALL }, .flags = FLAGS, .unit = "eof_action" },
388 { "pass", "Pass through the main input.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_PASS }, .flags = FLAGS, .unit = "eof_action" },
389 { "shortest", "force termination when the shortest input terminates", OFFSET(fs.opt_shortest), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
390 { "repeatlast", "repeat overlay of the last overlay frame", OFFSET(fs.opt_repeatlast), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
391 { NULL },
392};
393
395
397 {
398 .name = "main",
399 .type = AVMEDIA_TYPE_VIDEO,
400 .config_props = overlay_vaapi_config_input_main,
401 },
402 {
403 .name = "overlay",
404 .type = AVMEDIA_TYPE_VIDEO,
406 },
407};
408
410 {
411 .name = "default",
412 .type = AVMEDIA_TYPE_VIDEO,
413 .config_props = &overlay_vaapi_config_output,
414 },
415};
416
418 .p.name = "overlay_vaapi",
419 .p.description = NULL_IF_CONFIG_SMALL("Overlay one video on top of another"),
420 .p.priv_class = &overlay_vaapi_class,
421 .priv_size = sizeof(OverlayVAAPIContext),
425 .preinit = overlay_vaapi_framesync_preinit,
429 .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
430};
SwsAArch64OpImplParams params
Definition ops.c:51
const FFFilter ff_vf_overlay_vaapi
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
Main libavfilter public API header.
#define fs(width, name, subs,...)
Definition cbs_vp9.c:200
#define FLAGS
Definition cmdutils.c:598
#define NULL
Definition coverity.c:32
static enum AVPixelFormat pix_fmt
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition eval.c:368
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition eval.c:824
simple arithmetic expression evaluator
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
Definition framesync.c:137
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
Definition framesync.c:352
int ff_framesync_get_frame(FFFrameSync *fs, unsigned in, AVFrame **rframe, unsigned get)
Get the current frame in an input.
Definition framesync.c:269
int ff_framesync_init_dualinput(FFFrameSync *fs, AVFilterContext *parent)
Initialize a frame sync structure for dualinput.
Definition framesync.c:372
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
Definition framesync.c:301
#define FRAMESYNC_DEFINE_CLASS(name, context, field)
Definition framesync.h:352
@ EOF_ACTION_REPEAT
Definition framesync.h:27
#define fail
Definition test.h:479
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition opt.h:270
@ 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 AVERROR(e)
Definition error.h:45
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
static const int16_t alpha[]
Definition ilbcdata.h:55
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
Definition filters.h:208
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition filters.h:199
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition filters.h:254
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
const char * desc
Definition libsvtav1.c:83
var_name
Definition noise.c:46
@ VAR_VARS_NB
Definition noise.c:59
static const char *const var_names[]
Definition noise.c:30
AVOptions.
@ EOF_ACTION_PASS
Definition packetsync.h:31
@ EOF_ACTION_ENDALL
Definition packetsync.h:30
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:3380
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
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition pixfmt.h:126
@ VAR_OH
Definition scale_eval.c:47
@ VAR_OW
Definition scale_eval.c:46
static av_cold int preinit(AVBitStreamFilterContext *ctx)
Definition source.c:137
uint8_t * data
The data buffer.
Definition buffer.h:90
Definition eval.c:171
An instance of a filter.
Definition avfilter.h:273
AVFilterLink ** inputs
array of pointers to input links
Definition avfilter.h:281
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
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition frame.h:574
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
int width
Definition frame.h:544
int height
Definition frame.h:544
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition frame.h:559
This struct describes a set or pool of "hardware" frames (i.e.
Definition hwcontext.h:118
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition hwcontext.h:213
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
VADisplay display
The VADisplay handle, to be filled by the user.
Frame sync structure.
Definition framesync.h:168
double var_values[VAR_VARS_NB]
VAAPIVPPContext vpp_ctx
must be the first field
enum AVPixelFormat output_format
Definition vaapi_vpp.h:52
VAContextID va_context
Definition vaapi_vpp.h:46
AVVAAPIDeviceContext * hwctx
Definition vaapi_vpp.h:41
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
int ff_vaapi_vpp_render_pictures(AVFilterContext *avctx, VAProcPipelineParameterBuffer *params_list, int cout, AVFrame *output_frame)
Definition vaapi_vpp.c:639
int ff_vaapi_vpp_config_output(AVFilterLink *outlink)
Definition vaapi_vpp.c:97
int ff_vaapi_vpp_config_input(AVFilterLink *inlink)
Definition vaapi_vpp.c:71
void ff_vaapi_vpp_ctx_init(AVFilterContext *avctx)
Definition vaapi_vpp.c:714
int ff_vaapi_vpp_init_params(AVFilterContext *avctx, VAProcPipelineParameterBuffer *params, const AVFrame *input_frame, AVFrame *output_frame)
Definition vaapi_vpp.c:533
void ff_vaapi_vpp_ctx_uninit(AVFilterContext *avctx)
Definition vaapi_vpp.c:728
#define VAAPI_VPP_BACKGROUND_BLACK
Definition vaapi_vpp.h:36
@ VAR_OVERLAY_H
Definition vf_overlay.h:31
@ VAR_MW
Definition vf_overlay.h:28
@ VAR_MH
Definition vf_overlay.h:29
@ VAR_OVERLAY_W
Definition vf_overlay.h:30
@ VAR_OVERLAY_Y
@ VAR_OY
@ VAR_OVERLAY_X
@ VAR_OX
@ VAR_MAIN_IH
@ VAR_OVERLAY_IH
@ VAR_OVERLAY_IW
@ VAR_VARS_NB
@ VAR_MAIN_IW
static int overlay_vaapi_blend(FFFrameSync *fs)
static int overlay_vaapi_config_output(AVFilterLink *outlink)
static const AVOption overlay_vaapi_options[]
static int eval_expr(AVFilterContext *avctx)
static const AVFilterPad overlay_vaapi_inputs[]
static int overlay_vaapi_activate(AVFilterContext *avctx)
static int overlay_vaapi_build_filter_params(AVFilterContext *avctx)
static const AVFilterPad overlay_vaapi_outputs[]
static int overlay_vaapi_config_input_overlay(AVFilterLink *inlink)
static av_cold int overlay_vaapi_init(AVFilterContext *avctx)
static int overlay_vaapi_config_input_main(AVFilterLink *inlink)
static av_cold void overlay_vaapi_uninit(AVFilterContext *avctx)
#define PARSE_EXPR(e, s)
#define OFFSET(x)
static int have_alpha_planar(AVFilterLink *link)
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition video.c:89