Implements process_command to allow program source to be sent as an arg.

Signed-off-by: Koushik Dutta <kou...@gmail.com>
---
 libavfilter/vf_program_opencl.c | 49 +++++++++++++++++++++++++++------
 1 file changed, 40 insertions(+), 9 deletions(-)

diff --git a/libavfilter/vf_program_opencl.c b/libavfilter/vf_program_opencl.c
index 3b49829161..f032400fbe 100644
--- a/libavfilter/vf_program_opencl.c
+++ b/libavfilter/vf_program_opencl.c
@@ -49,16 +49,9 @@ typedef struct ProgramOpenCLContext {
     AVRational          source_rate;
 } ProgramOpenCLContext;
 
-static int program_opencl_load(AVFilterContext *avctx)
-{
-    ProgramOpenCLContext *ctx = avctx->priv;
+static int program_opencl_loaded(AVFilterContext *avctx) {
     cl_int cle;
-    int err;
-
-    err = ff_opencl_filter_load_program_from_file(avctx, ctx->source_file);
-    if (err < 0)
-        return err;
-
+    ProgramOpenCLContext *ctx = avctx->priv;
     ctx->command_queue = clCreateCommandQueue(ctx->ocf.hwctx->context,
                                               ctx->ocf.hwctx->device_id,
                                               0, &cle);
@@ -83,6 +76,27 @@ static int program_opencl_load(AVFilterContext *avctx)
     return 0;
 }
 
+static int program_opencl_load(AVFilterContext *avctx)
+{
+    ProgramOpenCLContext *ctx = avctx->priv;
+    int err;
+
+    err = ff_opencl_filter_load_program_from_file(avctx, ctx->source_file);
+    if (err < 0)
+        return err;
+    return program_opencl_loaded(avctx);
+}
+
+static int program_opencl_load_source(AVFilterContext *avctx, const char 
*src_const)
+{
+    int err;
+
+    err = ff_opencl_filter_load_program(avctx, &src_const, 1);
+    if (err < 0)
+        return err;
+    return program_opencl_loaded(avctx);
+}
+
 static int program_opencl_run(AVFilterContext *avctx)
 {
     AVFilterLink     *outlink = avctx->outputs[0];
@@ -330,6 +344,22 @@ static av_cold void program_opencl_uninit(AVFilterContext 
*avctx)
 
 #if CONFIG_PROGRAM_OPENCL_FILTER
 
+
+static int process_command(AVFilterContext *ctx, const char *cmd, const char 
*args,
+                           char *res, int res_len, int flags) {
+    int ret;
+
+    if (!strcmp(cmd, "source")) {
+        ret = program_opencl_load_source(ctx, args);
+    } else
+        ret = AVERROR(ENOSYS);
+
+    if (ret < 0)
+        av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with 
existing parameters.\n");
+
+    return ret;
+}
+
 static const AVOption program_opencl_options[] = {
     { "source", "OpenCL program source file", OFFSET(source_file),
       AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
@@ -372,6 +402,7 @@ const AVFilter ff_vf_program_opencl = {
     FILTER_OUTPUTS(program_opencl_outputs),
     FILTER_SINGLE_PIXFMT(AV_PIX_FMT_OPENCL),
     .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+    .process_command = process_command,
 };
 
 #endif
-- 
2.39.5 (Apple Git-154)

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to