55 ctx->hwctx =
ctx->device->hwctx;
69 "hardware frames context on the input.\n");
74 if (avctx->
inputs[0] != inlink)
88 if (!
ctx->output_width)
89 ctx->output_width = inlink->
w;
90 if (!
ctx->output_height)
91 ctx->output_height = inlink->
h;
106 if (!
ctx->device_ref) {
119 if (!output_frames_ref) {
127 output_frames->
width =
ctx->output_width;
128 output_frames->
height =
ctx->output_height;
133 "frames: %d.\n", err);
138 outlink->
w =
ctx->output_width;
139 outlink->
h =
ctx->output_height;
162 cle = clReleaseProgram(
ctx->program);
163 if (cle != CL_SUCCESS)
165 "program: %d.\n", cle);
172 const char **program_source_array,
178 ctx->program = clCreateProgramWithSource(
ctx->hwctx->context, nb_strings,
179 program_source_array,
186 cle = clBuildProgram(
ctx->program, 1, &
ctx->hwctx->device_id,
188 if (cle != CL_SUCCESS) {
191 if (cle == CL_BUILD_PROGRAM_FAILURE) {
195 clGetProgramBuildInfo(
ctx->program,
ctx->hwctx->device_id,
196 CL_PROGRAM_BUILD_LOG, 0,
NULL, &log_length);
200 cle = clGetProgramBuildInfo(
ctx->program,
201 ctx->hwctx->device_id,
202 CL_PROGRAM_BUILD_LOG,
203 log_length, log,
NULL);
204 if (cle == CL_SUCCESS)
211 clReleaseProgram(
ctx->program);
220 const char *filename)
225 const char *src_const;
231 "source file \"%s\".\n", filename);
255 if (rb == 0 && ferror(file)) {
284 cl_mem_object_type
type;
301 cle = clGetMemObjectInfo(image, CL_MEM_TYPE,
sizeof(
type),
303 if (cle != CL_SUCCESS) {
305 "plane %d: %d.\n", plane, cle);
308 if (
type != CL_MEM_OBJECT_IMAGE2D) {
314 cle = clGetImageInfo(image, CL_IMAGE_WIDTH,
sizeof(
size_t),
316 if (cle != CL_SUCCESS) {
322 cle = clGetImageInfo(image, CL_IMAGE_HEIGHT,
sizeof(
size_t),
324 if (cle != CL_SUCCESS) {
330 if (block_alignment) {
335 work_size[0] =
width;
345 av_bprintf(buf,
"__constant float %s[9] = {\n", name_str);
346 for (
i = 0;
i < 3;
i++) {
347 for (j = 0; j < 3; j++)
358 clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START,
sizeof(time_start), &time_start,
NULL);
359 clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END,
sizeof(time_end), &time_end,
NULL);
361 return time_end - time_start;
void av_bprintf(AVBPrint *buf, const char *fmt,...)
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_UNKNOWN
Unknown error, typically from an external library.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
FILE * av_fopen_utf8(const char *path, const char *mode)
Open a file using a UTF-8 filename.
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
static enum AVPixelFormat pix_fmts[]
Memory handling functions.
void ff_opencl_filter_uninit(AVFilterContext *avctx)
Uninitialise an OpenCL filter context.
int ff_opencl_filter_load_program(AVFilterContext *avctx, const char **program_source_array, int nb_strings)
Load a new OpenCL program from strings in memory.
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.
static int opencl_filter_set_device(AVFilterContext *avctx, AVBufferRef *device)
cl_ulong ff_opencl_get_event_time(cl_event event)
Gets the command start and end times for the given event and returns the difference (the time that th...
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_query_formats(AVFilterContext *avctx)
Return that all inputs and outputs support only AV_PIX_FMT_OPENCL.
int ff_opencl_filter_load_program_from_file(AVFilterContext *avctx, const char *filename)
Load a new OpenCL program from a file.
void ff_opencl_print_const_matrix_3x3(AVBPrint *buf, const char *name_str, double mat[3][3])
Print a 3x3 matrix into a buffer as __constant array, which could be included in an OpenCL program.
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.
A reference to a data buffer.
uint8_t * data
The data buffer.
AVFilterLink ** inputs
array of pointers to input links
void * priv
private data for use by the filter
AVBufferRef * hw_device_ctx
For filters which will create hardware frames, sets the device the filter should create them in.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVBufferRef * hw_frames_ctx
For hwaccel pixel formats, this should be a reference to the AVHWFramesContext describing the frames.
AVFilterContext * dst
dest filter
This structure describes decoded (raw) audio or video data.
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,...
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.
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
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.
int width
The allocated dimensions of the frames in this pool.