diff --git a/libavutil/Makefile b/libavutil/Makefile index 33f82ed8f1..e14d5a44f3 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -108,7 +108,7 @@ OBJS = adler32.o \ xtea.o \ OBJS-$(CONFIG_LZO) += lzo.o -OBJS-$(CONFIG_OPENCL) += opencl.o +OBJS-$(CONFIG_OPENCL) += opencl.o opencl_internal.o OBJS += $(COMPAT_OBJS:%=../compat/%) diff --git a/libavutil/opencl_internal.c b/libavutil/opencl_internal.c new file mode 100644 index 0000000000..f15c934f3e --- /dev/null +++ b/libavutil/opencl_internal.c @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2012 Peng Gao + * Copyright (C) 2012 Li Cao + * Copyright (C) 2012 Wei Gao + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "opencl_internal.h" +#include "libavutil/log.h" + +int ff_opencl_set_parameter(FFOpenclParam *opencl_param, ...) +{ + int ret = 0; + va_list arg_ptr; + void *param; + size_t param_size; + cl_int status; + if (!opencl_param->kernel) { + av_log(opencl_param->ctx, AV_LOG_ERROR, "OpenCL kernel must be set\n"); + return AVERROR(EINVAL); + } + va_start(arg_ptr, opencl_param); + do { + param = va_arg(arg_ptr, void *); + if (!param) + break; + param_size = va_arg(arg_ptr, size_t); + if (!param_size) { + av_log(opencl_param->ctx, AV_LOG_ERROR, "Parameter size must not be 0\n"); + ret = AVERROR(EINVAL); + goto end; + } + status = clSetKernelArg(opencl_param->kernel, opencl_param->param_num, param_size, param); + if (status != CL_SUCCESS) { + av_log(opencl_param->ctx, AV_LOG_ERROR, "Cannot set kernel argument: %d\n", status); + ret = AVERROR_EXTERNAL; + goto end; + } + opencl_param->param_num++; + } while (param && param_size); +end: + va_end(arg_ptr); + return ret; +} diff --git a/libavutil/opencl_internal.h b/libavutil/opencl_internal.h new file mode 100644 index 0000000000..34b39a0d6b --- /dev/null +++ b/libavutil/opencl_internal.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 Peng Gao + * Copyright (C) 2012 Li Cao + * Copyright (C) 2012 Wei Gao + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "opencl.h" + +#define FF_OPENCL_PARAM_INFO(a) ((void*)(&(a))), (sizeof(a)) + +typedef struct { + cl_kernel kernel; + int param_num; + void *ctx; +} FFOpenclParam; + +int ff_opencl_set_parameter(FFOpenclParam *opencl_param, ...);