38 #define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, ctx->hwctx->internal->cuda_dl, x)
39 #define DIV_UP(a, b) ( ((a) + (b) - 1) / (b) )
112 int x_position,
int y_position,
113 uint8_t* main_data,
int main_linesize,
114 int main_width,
int main_height,
115 uint8_t* overlay_data,
int overlay_linesize,
116 int overlay_width,
int overlay_height,
117 uint8_t* alpha_data,
int alpha_linesize,
118 int alpha_adj_x,
int alpha_adj_y) {
122 void* kernel_args[] = {
123 &x_position, &y_position,
124 &main_data, &main_linesize,
125 &overlay_data, &overlay_linesize,
126 &overlay_width, &overlay_height,
127 &alpha_data, &alpha_linesize,
128 &alpha_adj_x, &alpha_adj_y,
135 0,
ctx->cu_stream, kernel_args,
NULL));
150 CUcontext
dummy, cuda_ctx =
ctx->hwctx->cuda_ctx;
152 AVFrame *input_main, *input_overlay;
154 ctx->cu_ctx = cuda_ctx;
175 ret =
CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
184 ctx->x_position,
ctx->y_position,
189 input_overlay->
data[3], input_overlay->
linesize[3], 1, 1);
193 switch(
ctx->in_format_overlay) {
196 ctx->x_position,
ctx->y_position / 2,
206 ctx->x_position / 2 ,
ctx->y_position / 2,
210 input_overlay->
width / 2, input_overlay->
height / 2,
211 input_overlay->
data[3], input_overlay->
linesize[3], 2, 2);
214 ctx->x_position / 2 ,
ctx->y_position / 2,
218 input_overlay->
width / 2, input_overlay->
height / 2,
219 input_overlay->
data[3], input_overlay->
linesize[3], 2, 2);
253 if (
ctx->hwctx &&
ctx->cu_module) {
307 CUcontext
dummy, cuda_ctx;
326 if (!frames_ctx_overlay) {
331 ctx->in_format_overlay = frames_ctx_overlay->sw_format;
349 if (!
ctx->hw_device_ctx)
353 cuda_ctx =
ctx->hwctx->cuda_ctx;
356 ctx->cu_stream =
ctx->hwctx->stream;
366 err =
CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
377 err =
CHECK_CU(cu->cuModuleGetFunction(&
ctx->cu_func,
ctx->cu_module,
"Overlay_Cuda"));
396 #define OFFSET(x) offsetof(OverlayCUDAContext, x)
397 #define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
400 {
"x",
"Overlay x position",
402 {
"y",
"Overlay y position",
404 {
"eof_action",
"Action to take when encountering EOF from secondary input ",
410 {
"shortest",
"force termination when the shortest input terminates",
OFFSET(
fs.opt_shortest),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
FLAGS },
439 .
name =
"overlay_cuda",
442 .priv_class = &overlay_cuda_class,
449 .preinit = overlay_cuda_framesync_preinit,
static int query_formats(AVFilterContext *ctx)
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
static int activate(AVFilterContext *ctx)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
static av_cold int init(AVCodecContext *avctx)
#define fs(width, name, subs,...)
static av_cold int uninit(AVCodecContext *avctx)
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
int ff_framesync_dualinput_get(FFFrameSync *fs, AVFrame **f0, AVFrame **f1)
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
int ff_framesync_init_dualinput(FFFrameSync *fs, AVFilterContext *parent)
Initialize a frame sync structure for dualinput.
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_make_writable(AVFrame *frame)
Ensure that the frame data is writable, avoiding data copy if possible.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
FFmpeg internal API for CUDA.
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
Memory handling functions.
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.
AVPixelFormat
Pixel format.
@ 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...
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
A reference to a data buffer.
uint8_t * data
The data buffer.
This struct is allocated as AVHWDeviceContext.hwctx.
Describe the class of an AVClass context structure.
AVFilterLink ** inputs
array of pointers to input links
void * priv
private data for use by the filter
AVFilterLink ** outputs
array of pointers to output links
A link between two filters.
AVFilterContext * src
source filter
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
AVBufferRef * hw_frames_ctx
For hwaccel pixel formats, this should be a reference to the AVHWFramesContext describing the frames.
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
AVFormatInternal * internal
An opaque field for libavformat internal usage.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
This struct describes a set or pool of "hardware" frames (i.e.
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
enum AVPixelFormat in_format_main
enum AVPixelFormat in_format_overlay
AVBufferRef * hw_device_ctx
AVCUDADeviceContext * hwctx
AVFilter ff_vf_overlay_cuda
static int overlay_cuda_config_output(AVFilterLink *outlink)
Configure output.
static enum AVPixelFormat supported_main_formats[]
static int overlay_cuda_query_formats(AVFilterContext *avctx)
Query formats.
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.
static const AVOption overlay_cuda_options[]
static int format_is_supported(const enum AVPixelFormat formats[], enum AVPixelFormat fmt)
Helper to find out if provided format is supported by filter.
static const AVFilterPad overlay_cuda_inputs[]
static int overlay_cuda_blend(FFFrameSync *fs)
Perform blend overlay picture over main picture.
static enum AVPixelFormat supported_overlay_formats[]
static av_cold void overlay_cuda_uninit(AVFilterContext *avctx)
Uninitialize overlay_cuda.
static const AVFilterPad overlay_cuda_outputs[]
static int overlay_cuda_activate(AVFilterContext *avctx)
Activate overlay_cuda.
static av_cold int overlay_cuda_init(AVFilterContext *avctx)
Initialize overlay_cuda.
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.
FRAMESYNC_DEFINE_CLASS(overlay_cuda, OverlayCUDAContext, fs)
const char vf_overlay_cuda_ptx[]