[FFmpeg-devel] [PATCH]opencl: compile kernels separately

Wei Gao highgod0401 at gmail.com
Mon Nov 4 01:58:35 CET 2013


2013/11/2 Lenny Wang <lenny at multicorewareinc.com>

>
>
> Newly adjusted patch based on Michael's comments.  Please review, thanks.
>


diff --git a/libavfilter/deshake.h b/libavfilter/deshake.h
index c24090e..5792973 100644

@@ -108,11 +108,21 @@ int ff_opencl_deshake_init(AVFilterContext *ctx)
         deshake->opencl_ctx.matrix_size*sizeof(cl_float),
CL_MEM_READ_ONLY, NULL);
     if (ret < 0)
         return ret;
-    if (!deshake->opencl_ctx.kernel_env.kernel) {
-        ret =  av_opencl_create_kernel(&deshake->opencl_ctx.kernel_env,
"avfilter_transform");
-        if (ret < 0) {
-            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel for
name 'avfilter_transform'\n");
-            return ret;
+    deshake->opencl_ctx.command_queue = av_opencl_get_command_queue();
+    if (!deshake->opencl_ctx.command_queue) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to get OpenCL command queue in
filter 'deshake'\n");
+        return -1;
It should return a meaningful value, return AVERROR(EINVAL) should be OK.

+    }
+    deshake->opencl_ctx.program = av_opencl_compile("avfilter_transform",
NULL);
+    if (!deshake->opencl_ctx.program) {
+        av_log(ctx, AV_LOG_ERROR, "OpenCL failed to compile program
'avfilter_transform'\n");
+        return -1;
+    }
+    if (!deshake->opencl_ctx.kernel) {
+        deshake->opencl_ctx.kernel =
clCreateKernel(deshake->opencl_ctx.program, "avfilter_transform", &ret);
+        if (ret != CL_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel
'avfilter_transform'\n");
+            return -1;
It should return a meaningful value, return AVERROR(EINVAL) should be OK.


 int ff_opencl_deshake_process_inout_buf(AVFilterContext *ctx, AVFrame *in,
AVFrame *out)
 {
     int ret = 0;
diff --git a/libavfilter/unsharp.h b/libavfilter/unsharp.h
index c225929..2738243 100644
--- a/libavfilter/unsharp.h
+++ b/libavfilter/unsharp.h
@@ -33,6 +33,9 @@
 #if CONFIG_OPENCL

 #endif
diff --git a/libavfilter/unsharp_opencl.c b/libavfilter/unsharp_opencl.c
index b373b66..3dd0527 100644
--- a/libavfilter/unsharp_opencl.c
+++ b/libavfilter/unsharp_opencl.c
@@ -159,7 +159,7 @@ int ff_opencl_apply_unsharp(AVFilterContext *ctx,
AVFrame *in, AVFrame *out)
     FFOpenclParam opencl_param = {0};

     opencl_param.ctx = ctx;
-    opencl_param.kernel = unsharp->opencl_ctx.kernel_env.kernel;
+    opencl_param.kernel = unsharp->opencl_ctx.kernel;
     ret = ff_opencl_set_parameter(&opencl_param,

 FF_OPENCL_PARAM_INFO(unsharp->opencl_ctx.cl_inbuf),

 FF_OPENCL_PARAM_INFO(unsharp->opencl_ctx.cl_outbuf),
@@ -186,14 +186,14 @@ int ff_opencl_apply_unsharp(AVFilterContext *ctx,
AVFrame *in, AVFrame *out)
                                   NULL);
     if (ret < 0)

@@ -220,11 +220,21 @@ int ff_opencl_unsharp_init(AVFilterContext *ctx)
     if (ret < 0)
         return ret;
     unsharp->opencl_ctx.plane_num = PLANE_NUM;
-    if (!unsharp->opencl_ctx.kernel_env.kernel) {
-        ret = av_opencl_create_kernel(&unsharp->opencl_ctx.kernel_env,
"unsharp");
-        if (ret < 0) {
-            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel with
name 'unsharp'\n");
-            return ret;
+    unsharp->opencl_ctx.command_queue = av_opencl_get_command_queue();
+    if (!unsharp->opencl_ctx.command_queue) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to get OpenCL command queue in
filter 'unsharp'\n");
+        return -1;
It should return a meaningful value, return AVERROR(EINVAL) should be OK.

+    }
+    unsharp->opencl_ctx.program = av_opencl_compile("unsharp", NULL);
+    if (!unsharp->opencl_ctx.program) {
+        av_log(ctx, AV_LOG_ERROR, "OpenCL failed to compile program
'unsharp'\n");
+        return -1;
It should return a meaningful value, return AVERROR(EINVAL) should be OK.

+    }
+    if (!unsharp->opencl_ctx.kernel) {
+        unsharp->opencl_ctx.kernel =
clCreateKernel(unsharp->opencl_ctx.program, "unsharp", &ret);
+        if (ret != CL_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel
'unsharp'\n");
+            return -1;
It should return a meaningful value, return AVERROR(EINVAL) should be OK.

Looks good to me thanks


>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>


More information about the ffmpeg-devel mailing list