summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhighgod0401 <highgod0401@gmail.com>2013-04-11 12:57:52 +0800
committerMichael Niedermayer <michaelni@gmx.at>2013-04-11 12:46:34 +0200
commit9d442b9cc0347bf9fc9c753cda62df7f43842416 (patch)
tree2b176a8879d7c6dbc7b0a63197f768f671cb343e
parent4c9b031559c6bd8a02ba12441476260323e84e0a (diff)
opencl: add spec opencl device APIs 20130411
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--doc/all-components.texi1
-rw-r--r--doc/ffmpeg-utils.texi1
-rw-r--r--doc/libavutil.texi1
-rw-r--r--doc/opencl.texi20
-rw-r--r--libavfilter/deshake_opencl.c5
-rw-r--r--libavutil/opencl.c84
-rw-r--r--libavutil/opencl.h44
-rw-r--r--libavutil/version.h2
8 files changed, 116 insertions, 42 deletions
diff --git a/doc/all-components.texi b/doc/all-components.texi
index a0f113434d..6800db9e34 100644
--- a/doc/all-components.texi
+++ b/doc/all-components.texi
@@ -3,6 +3,7 @@
@ifset config-avutil
@include syntax.texi
@include eval.texi
+@include opencl.texi
@end ifset
@ifset config-avcodec
diff --git a/doc/ffmpeg-utils.texi b/doc/ffmpeg-utils.texi
index c5822a8efc..d8f0d0d432 100644
--- a/doc/ffmpeg-utils.texi
+++ b/doc/ffmpeg-utils.texi
@@ -19,6 +19,7 @@ by the libavutil library.
@include syntax.texi
@include eval.texi
+@include opencl.texi
@chapter See Also
diff --git a/doc/libavutil.texi b/doc/libavutil.texi
index 50b0d0e3da..e48dd7f808 100644
--- a/doc/libavutil.texi
+++ b/doc/libavutil.texi
@@ -33,6 +33,7 @@ ffmpeg-utils(1)
@end ifnothtml
@include authors.texi
+@include opencl.texi
@ignore
diff --git a/doc/opencl.texi b/doc/opencl.texi
new file mode 100644
index 0000000000..40a7e3101f
--- /dev/null
+++ b/doc/opencl.texi
@@ -0,0 +1,20 @@
+@chapter OpenCL Options
+@c man begin OPENCL OPTIONS
+
+When FFmpeg is configured with @code{--enable-opencl}, it is possible
+to set the options to set in the global OpenCL context. The list of
+supported options follows:
+
+@table @option
+@item build_options
+Set build options which used to compiled kernels, see reference "OpenCL Specification Version: 1.2 chapter 5.6.4"
+
+@item platform_idx
+Select platform to run OpenCL code, the platform_idx is the index of platform in device list which can be getted by function av_opencl_get_device_list().
+
+@item device_idx
+Select device to run OpenCL code, the device_idx is the index of device in device list which can be getted by function av_opencl_get_device_list().
+
+@end table
+
+@c man end OPENCL OPTIONS
diff --git a/libavfilter/deshake_opencl.c b/libavfilter/deshake_opencl.c
index 63d144a241..0f6dcc4d6a 100644
--- a/libavfilter/deshake_opencl.c
+++ b/libavfilter/deshake_opencl.c
@@ -98,10 +98,7 @@ int ff_opencl_deshake_init(AVFilterContext *ctx)
{
int ret = 0;
DeshakeContext *deshake = ctx->priv;
- AVDictionary *options = NULL;
- av_dict_set(&options, "build_options", "-I.", 0);
- ret = av_opencl_init(options, NULL);
- av_dict_free(&options);
+ ret = av_opencl_init(NULL);
if (ret < 0)
return ret;
deshake->opencl_ctx.matrix_size = MATRIX_SIZE;
diff --git a/libavutil/opencl.c b/libavutil/opencl.c
index a01eab8aa5..aeccc079ff 100644
--- a/libavutil/opencl.c
+++ b/libavutil/opencl.c
@@ -24,6 +24,7 @@
#include "avstring.h"
#include "log.h"
#include "avassert.h"
+#include "opt.h"
#if HAVE_PTHREADS
@@ -73,10 +74,23 @@ typedef struct {
const AVClass *class;
int log_offset;
void *log_ctx;
+ int init_flag;
+ int platform_idx;
+ int device_idx;
+ char *build_options;
} OpenclUtils;
+#define OFFSET(x) offsetof(OpenclUtils, x)
+
+static const AVOption opencl_options[] = {
+ { "platform_idx", "set platform index value", OFFSET(platform_idx), AV_OPT_TYPE_INT, {.i64=-1}, -1, INT_MAX},
+ { "device_idx", "set device index value", OFFSET(device_idx), AV_OPT_TYPE_INT, {.i64=-1}, -1, INT_MAX},
+ { "build_options", "build options of opencl", OFFSET(build_options), AV_OPT_TYPE_STRING, {.str="-I."}, CHAR_MIN, CHAR_MAX},
+};
+
static const AVClass openclutils_class = {
.class_name = "OPENCLUTILS",
+ .option = opencl_options,
.item_name = av_default_item_name,
.version = LIBAVUTIL_VERSION_INT,
.log_level_offset_offset = offsetof(OpenclUtils, log_offset),
@@ -311,6 +325,36 @@ void av_opencl_free_device_list(AVOpenCLDeviceList **device_list)
av_freep(device_list);
}
+int av_opencl_set_option(const char *key, const char *val)
+{
+ int ret = 0;
+ LOCK_OPENCL
+ if (!openclutils.init_flag) {
+ av_opt_set_defaults(&openclutils);
+ openclutils.init_flag = 1;
+ }
+ ret = av_opt_set(&openclutils, key, val, 0);
+ UNLOCK_OPENCL
+ return ret;
+}
+
+int av_opencl_get_option(const char *key, uint8_t **out_val)
+{
+ int ret = 0;
+ LOCK_OPENCL
+ ret = av_opt_get(&openclutils, key, 0, out_val);
+ UNLOCK_OPENCL
+ return ret;
+}
+
+void av_opencl_free_option(void)
+{
+ /*FIXME: free openclutils context*/
+ LOCK_OPENCL
+ av_opt_free(&openclutils);
+ UNLOCK_OPENCL
+}
+
AVOpenCLExternalEnv *av_opencl_alloc_external_env(void)
{
AVOpenCLExternalEnv *ext = av_mallocz(sizeof(AVOpenCLExternalEnv));
@@ -561,46 +605,22 @@ end:
return ret;
}
-int av_opencl_init(AVDictionary *options, AVOpenCLExternalEnv *ext_opencl_env)
+int av_opencl_init(AVOpenCLExternalEnv *ext_opencl_env)
{
int ret = 0;
- AVDictionaryEntry *opt_build_entry;
- AVDictionaryEntry *opt_platform_entry;
- AVDictionaryEntry *opt_device_entry;
- char *pos;
LOCK_OPENCL
if (!gpu_env.init_count) {
- opt_platform_entry = av_dict_get(options, "platform_idx", NULL, 0);
- opt_device_entry = av_dict_get(options, "device_idx", NULL, 0);
- /* initialize devices, context, command_queue */
- gpu_env.platform_idx = -1;
- gpu_env.device_idx = -1;
- if (opt_platform_entry) {
- gpu_env.platform_idx = strtol(opt_platform_entry->value, &pos, 10);
- if (pos == opt_platform_entry->value) {
- av_log(&openclutils, AV_LOG_ERROR, "Platform index should be a number\n");
- ret = AVERROR(EINVAL);
- goto end;
- }
- }
- if (opt_device_entry) {
- gpu_env.device_idx = strtol(opt_device_entry->value, &pos, 10);
- if (pos == opt_platform_entry->value) {
- av_log(&openclutils, AV_LOG_ERROR, "Device index should be a number\n");
- ret = AVERROR(EINVAL);
- goto end;
- }
+ if (!openclutils.init_flag) {
+ av_opt_set_defaults(&openclutils);
+ openclutils.init_flag = 1;
}
+ gpu_env.device_idx = openclutils.device_idx;
+ gpu_env.platform_idx = openclutils.platform_idx;
ret = init_opencl_env(&gpu_env, ext_opencl_env);
if (ret < 0)
goto end;
}
- /*initialize program, kernel_name, kernel_count*/
- opt_build_entry = av_dict_get(options, "build_options", NULL, 0);
- if (opt_build_entry)
- ret = compile_kernel_file(&gpu_env, opt_build_entry->value);
- else
- ret = compile_kernel_file(&gpu_env, NULL);
+ ret = compile_kernel_file(&gpu_env, openclutils.build_options);
if (ret < 0)
goto end;
if (gpu_env.kernel_code_count <= 0) {
@@ -654,6 +674,8 @@ void av_opencl_uninit(void)
}
free_device_list(&gpu_env.device_list);
end:
+ if ((gpu_env.init_count <= 0) && (gpu_env.kernel_count <= 0))
+ av_opt_free(&openclutils); //FIXME: free openclutils context
UNLOCK_OPENCL
}
diff --git a/libavutil/opencl.h b/libavutil/opencl.h
index bcb25ed8be..acafe36ad6 100644
--- a/libavutil/opencl.h
+++ b/libavutil/opencl.h
@@ -97,6 +97,43 @@ int av_opencl_get_device_list(AVOpenCLDeviceList **device_list);
void av_opencl_free_device_list(AVOpenCLDeviceList **device_list);
/**
+ * Set option in the global OpenCL context.
+ *
+ * This options affect the operation performed by the next
+ * av_opencl_init() operation.
+ *
+ * The currently accepted options are:
+ * - build_options: set options to compile registered kernels code
+ * - platform: set index of platform in device list
+ * - device: set index of device in device list
+ *
+ * See reference "OpenCL Specification Version: 1.2 chapter 5.6.4".
+ *
+ * @param key option key
+ * @param val option value
+ * @return >=0 on success, a negative error code in case of failure
+ * @see av_opencl_get_option()
+ */
+int av_opencl_set_option(const char *key, const char *val);
+
+/**
+ * Get option value from the global OpenCL context.
+ *
+ * @param key option key
+ * @param out_val pointer to location where option value will be
+ * written, must be freed with av_freep()
+ * @return >=0 on success, a negative error code in case of failure
+ * @see av_opencl_set_option()
+ */
+int av_opencl_get_option(const char *key, uint8_t **out_val);
+
+/**
+ * Free option values of the global OpenCL context.
+ *
+ */
+void av_opencl_free_option(void);
+
+/**
* Allocate OpenCL external environment.
*
* It must be freed with av_opencl_free_external_env().
@@ -128,16 +165,11 @@ int av_opencl_register_kernel_code(const char *kernel_code);
* Initialize the run time OpenCL environment and compile the kernel
* code registered with av_opencl_register_kernel_code().
*
- * Currently, the only accepted option is "build_options", used to set
- * options to compile registered kernels code. See reference "OpenCL
- * Specification Version: 1.2 chapter 5.6.4".
- *
- * @param options dictionary of key/value options
* @param ext_opencl_env external OpenCL environment, created by an
* application program, ignored if set to NULL
* @return >=0 on success, a negative error code in case of failure
*/
- int av_opencl_init(AVDictionary *options, AVOpenCLExternalEnv *ext_opencl_env);
+ int av_opencl_init(AVOpenCLExternalEnv *ext_opencl_env);
/**
* Create kernel object in the specified kernel environment.
diff --git a/libavutil/version.h b/libavutil/version.h
index 7d1ab9c312..6531397a4e 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -75,7 +75,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 52
-#define LIBAVUTIL_VERSION_MINOR 25
+#define LIBAVUTIL_VERSION_MINOR 26
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \