lavu/opencl:add opencl set param function
authorhighgod0401 <highgod0401@gmail.com>
Thu, 25 Apr 2013 11:28:40 +0000 (19:28 +0800)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 26 Apr 2013 01:04:42 +0000 (03:04 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavutil/Makefile
libavutil/opencl_internal.c [new file with mode: 0644]
libavutil/opencl_internal.h [new file with mode: 0644]

index 33f82ed..e14d5a4 100644 (file)
@@ -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 (file)
index 0000000..f15c934
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2012 Peng Gao <peng@multicorewareinc.com>
+ * Copyright (C) 2012 Li   Cao <li@multicorewareinc.com>
+ * Copyright (C) 2012 Wei  Gao <weigao@multicorewareinc.com>
+ *
+ * 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 (file)
index 0000000..34b39a0
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2012 Peng Gao <peng@multicorewareinc.com>
+ * Copyright (C) 2012 Li   Cao <li@multicorewareinc.com>
+ * Copyright (C) 2012 Wei  Gao <weigao@multicorewareinc.com>
+ *
+ * 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, ...);