openclbasetransform: Fix some bug that raises a segfault.
[valastuff:gst-plugins-cl.git] / src / openclbasetransform.vala
1 /* vim: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab: */
2
3 using GOpenCL;
4
5 namespace Gst.OpenCl
6 {
7   /*
8    * An OpenCL Kernel element.
9    */
10   public class OpenCLBaseTransform : Gst.BaseTransform
11   {
12     protected static Gst.PadTemplate sink_factory;
13     protected static Gst.PadTemplate src_factory;
14     
15     protected Platform platform;
16     protected Context ctx;
17     protected CommandQueue q;
18     protected Program program;
19     
20     protected string kernel_source;
21     protected GOpenCL.Kernel kernel;
22     
23     public uint platform_idx {
24       get;
25       set;
26       default = 0;
27     }
28     public string kernel_name {
29       get;
30       set;
31       default = "default_kernel";
32     }
33     public string? kernel_file {
34       get;
35       set;
36       default = null;
37     }
38     
39     construct {
40       Platform[] platforms = Platform.get_available ();
41       platform = platforms[platform_idx];
42       Device[] devices = platform.get_devices ();
43
44       debug (@"$(platforms.length) platform(s) available.");
45       debug (@"Platform: $(platform.get_info(OpenCL.PlatformInfo.NAME))");
46       debug (@"$(devices.length) device(s) attached to platform $(platform).");
47       
48       ctx = platform.create_context ();
49       q = ctx.create_command_queue ();
50     }
51     
52     protected class void init_any_caps ()
53     {
54       sink_factory = new Gst.PadTemplate (
55         "sink", 
56         Gst.PadDirection.SINK, 
57         Gst.PadPresence.ALWAYS, 
58         new Gst.Caps.any ()
59       );
60
61       src_factory = new Gst.PadTemplate (
62         "src", 
63         Gst.PadDirection.SRC, 
64         Gst.PadPresence.ALWAYS, 
65         new Gst.Caps.any ()
66       );
67
68       add_pad_template (sink_factory);
69       add_pad_template (src_factory);
70     }
71     
72     string load_source_from_file ()
73     {
74       uint8[] c = null;
75       if (this.kernel_file != null)
76       {
77         File f = File.new_for_path (this.kernel_file);
78         f.load_contents (null, out c);
79       }
80       return (string) c;
81     }
82     
83     public override bool start ()
84     {
85       string source = this.load_source_from_file () ?? kernel_source;
86       debug (@"Building program from:\n $(kernel_file)\n ?? $(source)"); // FIXME it should be file ?? source, but this segfaults
87       program = ctx.create_program_with_source (source);
88       kernel = program.create_kernel (this.kernel_name);
89       
90       return true;
91     }
92
93     public override bool stop ()
94     {
95       return true;
96     }
97   }
98 }