19#include "config_components.h"
62 ctx->command_queue = clCreateCommandQueue(
ctx->ocf.hwctx->context,
63 ctx->ocf.hwctx->device_id,
65 if (!
ctx->command_queue) {
67 "command queue: %d.\n", cle);
71 ctx->kernel = clCreateKernel(
ctx->ocf.program,
ctx->kernel_name, &cle);
73 if (cle == CL_INVALID_KERNEL_NAME) {
75 "program.\n",
ctx->kernel_name);
92 size_t global_work[2];
94 int err, input, plane;
109 dst = (cl_mem)output->
data[plane];
113 cle = clSetKernelArg(
ctx->kernel, 0,
sizeof(cl_mem), &
dst);
114 if (cle != CL_SUCCESS) {
116 "destination image argument: %d.\n", cle);
120 cle = clSetKernelArg(
ctx->kernel, 1,
sizeof(cl_uint), &
ctx->index);
121 if (cle != CL_SUCCESS) {
123 "index argument: %d.\n", cle);
128 for (input = 0; input <
ctx->nb_inputs; input++) {
131 src = (cl_mem)
ctx->frames[input]->data[plane];
134 cle = clSetKernelArg(
ctx->kernel, 2 + input,
sizeof(cl_mem), &
src);
135 if (cle != CL_SUCCESS) {
137 "source image argument %d: %d.\n", input, cle);
149 plane, global_work[0], global_work[1]);
151 cle = clEnqueueNDRangeKernel(
ctx->command_queue,
ctx->kernel, 2,
NULL,
156 cle = clFinish(
ctx->command_queue);
159 if (
ctx->nb_inputs > 0) {
175 clFinish(
ctx->command_queue);
193 for (
i = 0;
i <
ctx->nb_inputs;
i++) {
221 if (
ctx->nb_inputs > 0) {
233 for (
i = 0;
i <
ctx->nb_inputs;
i++) {
260 ctx->ocf.output_width =
ctx->width;
261 ctx->ocf.output_height =
ctx->height;
263 if (!strcmp(avctx->
filter->
name,
"openclsrc")) {
264 if (!
ctx->ocf.output_width || !
ctx->ocf.output_height) {
266 "dimensions to be specified.\n");
271 ctx->ocf.output_format =
ctx->source_format;
279 for (
i = 0;
i <
ctx->nb_inputs;
i++) {
281 memset(&input, 0,
sizeof(input));
304 if (
ctx->nb_inputs > 0) {
311 cle = clReleaseKernel(
ctx->kernel);
312 if (cle != CL_SUCCESS)
314 "kernel: %d.\n", cle);
317 if (
ctx->command_queue) {
318 cle = clReleaseCommandQueue(
ctx->command_queue);
319 if (cle != CL_SUCCESS)
321 "command queue: %d.\n", cle);
327#define OFFSET(x) offsetof(ProgramOpenCLContext, x)
328#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
330#if CONFIG_PROGRAM_OPENCL_FILTER
332static const AVOption program_opencl_options[] = {
333 {
"source",
"OpenCL program source file",
OFFSET(source_file),
335 {
"kernel",
"Kernel name in program",
OFFSET(kernel_name),
338 {
"inputs",
"Number of inputs",
OFFSET(nb_inputs),
351static const AVFilterPad program_opencl_outputs[] = {
360 .p.name =
"program_opencl",
362 .p.priv_class = &program_opencl_class,
367 .
preinit = &program_opencl_framesync_preinit,
378#if CONFIG_OPENCLSRC_FILTER
380static const AVOption openclsrc_options[] = {
381 {
"source",
"OpenCL program source file",
OFFSET(source_file),
383 {
"kernel",
"Kernel name in program",
OFFSET(kernel_name),
391 {
"format",
"Video format",
OFFSET(source_format),
394 {
"rate",
"Video frame rate",
OFFSET(source_rate),
396 {
"r",
"Video frame rate",
OFFSET(source_rate),
414 .p.name =
"openclsrc",
416 .p.priv_class = &openclsrc_class,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFFilter ff_vsrc_openclsrc
const FFFilter ff_vf_program_opencl
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
char * av_asprintf(const char *fmt,...)
#define i(width, name, range_min, range_max)
#define fs(width, name, subs,...)
int(* init)(AVBSFContext *ctx)
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
int ff_framesync_get_frame(FFFrameSync *fs, unsigned in, AVFrame **rframe, unsigned get)
Get the current frame in an input.
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
int ff_framesync_init(FFFrameSync *fs, AVFilterContext *parent, unsigned nb_in)
Initialize a frame sync structure.
#define FRAMESYNC_DEFINE_CLASS(name, context, field)
@ EXT_INFINITY
Extend the frame to infinity.
@ AV_OPT_TYPE_IMAGE_SIZE
Underlying C type is two consecutive integers.
@ AV_OPT_TYPE_PIXEL_FMT
Underlying C type is enum AVPixelFormat.
@ AV_OPT_TYPE_VIDEO_RATE
Underlying C type is AVRational.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ 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...
#define AVFILTER_FLAG_HWDEVICE
The filter can create hardware frames using AVFilterContext.hw_device_ctx.
#define AVFILTER_FLAG_DYNAMIC_INPUTS
The number of the filter inputs is not determined just by AVFilter.inputs.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_OUTPUTS(array)
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
void ff_opencl_filter_uninit(AVFilterContext *avctx)
Uninitialise an OpenCL filter context.
int ff_opencl_filter_config_input(AVFilterLink *inlink)
Check that the input link contains a suitable hardware frames context and extract the device from it.
int ff_opencl_filter_init(AVFilterContext *avctx)
Initialise an OpenCL filter context.
int ff_opencl_filter_work_size_from_image(AVFilterContext *avctx, size_t *work_size, AVFrame *frame, int plane, int block_alignment)
Find the work size needed needed for a given plane of an image.
int ff_opencl_filter_config_output(AVFilterLink *outlink)
Create a suitable hardware frames context for the output.
int ff_opencl_filter_load_program_from_file(AVFilterContext *avctx, const char *filename)
Load a new OpenCL program from a file.
#define CL_FAIL_ON_ERROR(errcode,...)
A helper macro to handle OpenCL errors.
@ EXT_STOP
Completely stop all streams with this one.
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_OPENCL
Hardware surfaces for OpenCL.
#define FF_ARRAY_ELEMS(a)
static av_cold int preinit(AVBitStreamFilterContext *ctx)
AVFilterLink ** inputs
array of pointers to input links
const AVFilter * filter
the AVFilter of which this is an instance
void * priv
private data for use by the filter
AVFilterLink ** outputs
array of pointers to output links
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
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.
A filter pad used for either input or output.
int(* config_props)(AVFilterLink *link)
Link configuration callback.
enum AVMediaType type
AVFilterPad type.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Rational number (pair of numerator and denominator).
enum FFFrameSyncExtMode after
Extrapolation mode for timestamps after the last frame.
enum FFFrameSyncExtMode before
Extrapolation mode for timestamps before the first frame.
AVRational time_base
Time base for the incoming frames.
unsigned sync
Synchronization level: frames on input at the highest sync level will generate output frame events.
enum AVPixelFormat source_format
cl_command_queue command_queue
static AVFormatContext * ctx
static av_cold int program_opencl_init(AVFilterContext *avctx)
static av_cold void program_opencl_uninit(AVFilterContext *avctx)
static int program_opencl_activate(AVFilterContext *avctx)
static int program_opencl_load(AVFilterContext *avctx)
static int program_opencl_filter(FFFrameSync *fs)
static int program_opencl_request_frame(AVFilterLink *outlink)
static int program_opencl_config_output(AVFilterLink *outlink)
static int program_opencl_run(AVFilterContext *avctx)
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.