diff options
-rw-r--r-- | src/gstdsp66videokernel.c | 30 | ||||
-rw-r--r-- | src/gstdsp66videokernel.h | 4 | ||||
-rw-r--r-- | src/kernels/oclconv/conv.cl | 5 | ||||
-rw-r--r-- | src/kernels/oclconv/oclconv.cpp | 5 |
4 files changed, 36 insertions, 8 deletions
diff --git a/src/gstdsp66videokernel.c b/src/gstdsp66videokernel.c index 8174710..2d7bf5d 100644 --- a/src/gstdsp66videokernel.c +++ b/src/gstdsp66videokernel.c | |||
@@ -47,12 +47,14 @@ enum | |||
47 | #define DEFAULT_FILTERSIZE 5 | 47 | #define DEFAULT_FILTERSIZE 5 |
48 | #define DEFAULT_LUM_ONLY TRUE | 48 | #define DEFAULT_LUM_ONLY TRUE |
49 | #define DEFAULT_KERNELTYPE GST_DSP66_VIDEO_KERNELTYPE_MEDIAN | 49 | #define DEFAULT_KERNELTYPE GST_DSP66_VIDEO_KERNELTYPE_MEDIAN |
50 | #define DEFAULT_ARBKERNEL "Sobel3x3" | ||
50 | enum | 51 | enum |
51 | { | 52 | { |
52 | PROP_0, | 53 | PROP_0, |
53 | PROP_FILTERSIZE, | 54 | PROP_FILTERSIZE, |
54 | PROP_LUM_ONLY, | 55 | PROP_LUM_ONLY, |
55 | PROP_KERNELTYPE | 56 | PROP_KERNELTYPE, |
57 | PROP_ARBKERNEL | ||
56 | }; | 58 | }; |
57 | 59 | ||
58 | #define GST_TYPE_VIDEO_KERNEL_FILTERSIZE (gst_dsp66_video_kernel_filtersize_get_type()) | 60 | #define GST_TYPE_VIDEO_KERNEL_FILTERSIZE (gst_dsp66_video_kernel_filtersize_get_type()) |
@@ -69,6 +71,7 @@ static const GEnumValue dsp66_video_kerneltype[] = { | |||
69 | {GST_DSP66_VIDEO_KERNELTYPE_SOBEL, "Kernel sobel", "1"}, | 71 | {GST_DSP66_VIDEO_KERNELTYPE_SOBEL, "Kernel sobel", "1"}, |
70 | {GST_DSP66_VIDEO_KERNELTYPE_CONV, "Kernel conv", "2"}, | 72 | {GST_DSP66_VIDEO_KERNELTYPE_CONV, "Kernel conv", "2"}, |
71 | {GST_DSP66_VIDEO_KERNELTYPE_CANNY, "Kernel canny", "3"}, | 73 | {GST_DSP66_VIDEO_KERNELTYPE_CANNY, "Kernel canny", "3"}, |
74 | {GST_DSP66_VIDEO_KERNELTYPE_ARB, "Kernel arbitrary", "4"}, | ||
72 | {0, NULL, NULL}, | 75 | {0, NULL, NULL}, |
73 | }; | 76 | }; |
74 | 77 | ||
@@ -135,6 +138,11 @@ gst_dsp66_video_kernel_class_init (GstDsp66VideoKernelClass * klass) | |||
135 | "luminance", DEFAULT_LUM_ONLY, | 138 | "luminance", DEFAULT_LUM_ONLY, |
136 | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); | 139 | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); |
137 | 140 | ||
141 | g_object_class_install_property (gobject_class, PROP_ARBKERNEL, | ||
142 | g_param_spec_string ("arbkernel", "User defined kernel", | ||
143 | "The name of the kernel invoked via OpenCL.", | ||
144 | NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); | ||
145 | |||
138 | gst_element_class_add_pad_template (gstelement_class, | 146 | gst_element_class_add_pad_template (gstelement_class, |
139 | gst_static_pad_template_get (&dsp66_video_kernel_sink_factory)); | 147 | gst_static_pad_template_get (&dsp66_video_kernel_sink_factory)); |
140 | gst_element_class_add_pad_template (gstelement_class, | 148 | gst_element_class_add_pad_template (gstelement_class, |
@@ -154,17 +162,19 @@ gst_dsp66_video_kernel_init (GstDsp66VideoKernel * kernel) | |||
154 | kernel->filtersize = DEFAULT_FILTERSIZE; | 162 | kernel->filtersize = DEFAULT_FILTERSIZE; |
155 | kernel->kerneltype = DEFAULT_KERNELTYPE; | 163 | kernel->kerneltype = DEFAULT_KERNELTYPE; |
156 | kernel->lum_only = DEFAULT_LUM_ONLY; | 164 | kernel->lum_only = DEFAULT_LUM_ONLY; |
165 | kernel->arbkernel = g_strdup (DEFAULT_ARBKERNEL); | ||
157 | } | 166 | } |
158 | 167 | ||
159 | extern int oclconv_kernel(int kernel_type, int kernel_size, unsigned char *src, unsigned char *dest, int width, int height, int sstride, int dstride); | 168 | extern int oclconv_kernel(int kernel_type, int kernel_size, char *arbkernel, |
169 | unsigned char *src, unsigned char *dest, int width, int height, int sstride, int dstride); | ||
160 | 170 | ||
161 | static int | 171 | static int |
162 | imgproc (gint kerneltype, gint filtersize, | 172 | imgproc (gint kerneltype, gint filtersize, gchar *arbkernel, |
163 | guint8 * dest, gint dstride, | 173 | guint8 * dest, gint dstride, |
164 | const guint8 * src, gint sstride, | 174 | const guint8 * src, gint sstride, |
165 | gint width, gint height) | 175 | gint width, gint height) |
166 | { | 176 | { |
167 | return oclconv_kernel(kerneltype, filtersize, (unsigned char *)src, (unsigned char *)dest, width, height, sstride, dstride); | 177 | return oclconv_kernel(kerneltype, filtersize, arbkernel, (unsigned char *)src, (unsigned char *)dest, width, height, sstride, dstride); |
168 | } | 178 | } |
169 | 179 | ||
170 | static GstFlowReturn | 180 | static GstFlowReturn |
@@ -188,14 +198,14 @@ gst_dsp66_video_kernel_transform_frame (GstVideoFilter * filter, | |||
188 | gst_video_frame_copy_plane (out_frame, in_frame, 1); | 198 | gst_video_frame_copy_plane (out_frame, in_frame, 1); |
189 | gst_video_frame_copy_plane (out_frame, in_frame, 2); | 199 | gst_video_frame_copy_plane (out_frame, in_frame, 2); |
190 | } else { | 200 | } else { |
191 | imgproc (kernel->kerneltype, kernel->filtersize, | 201 | imgproc (kernel->kerneltype, kernel->filtersize, kernel->arbkernel, |
192 | GST_VIDEO_FRAME_PLANE_DATA (out_frame, 1), | 202 | GST_VIDEO_FRAME_PLANE_DATA (out_frame, 1), |
193 | GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 1), | 203 | GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 1), |
194 | GST_VIDEO_FRAME_PLANE_DATA (in_frame, 1), | 204 | GST_VIDEO_FRAME_PLANE_DATA (in_frame, 1), |
195 | GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, 1), | 205 | GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, 1), |
196 | GST_VIDEO_FRAME_WIDTH (in_frame) / 2, | 206 | GST_VIDEO_FRAME_WIDTH (in_frame) / 2, |
197 | GST_VIDEO_FRAME_HEIGHT (in_frame) / 2); | 207 | GST_VIDEO_FRAME_HEIGHT (in_frame) / 2); |
198 | imgproc (kernel->kerneltype, kernel->filtersize, | 208 | imgproc (kernel->kerneltype, kernel->filtersize, kernel->arbkernel, |
199 | GST_VIDEO_FRAME_PLANE_DATA (out_frame, 2), | 209 | GST_VIDEO_FRAME_PLANE_DATA (out_frame, 2), |
200 | GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 2), | 210 | GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 2), |
201 | GST_VIDEO_FRAME_PLANE_DATA (in_frame, 2), | 211 | GST_VIDEO_FRAME_PLANE_DATA (in_frame, 2), |
@@ -225,6 +235,14 @@ gst_dsp66_video_kernel_set_property (GObject * object, guint prop_id, | |||
225 | case PROP_KERNELTYPE: | 235 | case PROP_KERNELTYPE: |
226 | kernel->kerneltype = g_value_get_enum (value); | 236 | kernel->kerneltype = g_value_get_enum (value); |
227 | break; | 237 | break; |
238 | case PROP_ARBKERNEL: | ||
239 | if (!g_value_get_string (value)) { | ||
240 | GST_WARNING ("Arbitrary kernel string can not be NULL"); | ||
241 | break; | ||
242 | } | ||
243 | g_free (kernel->arbkernel); | ||
244 | kernel->arbkernel = g_value_dup_string (value); | ||
245 | break; | ||
228 | default: | 246 | default: |
229 | break; | 247 | break; |
230 | } | 248 | } |
diff --git a/src/gstdsp66videokernel.h b/src/gstdsp66videokernel.h index b78354b..017d809 100644 --- a/src/gstdsp66videokernel.h +++ b/src/gstdsp66videokernel.h | |||
@@ -53,7 +53,8 @@ typedef enum { | |||
53 | GST_DSP66_VIDEO_KERNELTYPE_MEDIAN = 0, | 53 | GST_DSP66_VIDEO_KERNELTYPE_MEDIAN = 0, |
54 | GST_DSP66_VIDEO_KERNELTYPE_SOBEL = 1, | 54 | GST_DSP66_VIDEO_KERNELTYPE_SOBEL = 1, |
55 | GST_DSP66_VIDEO_KERNELTYPE_CONV = 2, | 55 | GST_DSP66_VIDEO_KERNELTYPE_CONV = 2, |
56 | GST_DSP66_VIDEO_KERNELTYPE_CANNY = 3 | 56 | GST_DSP66_VIDEO_KERNELTYPE_CANNY = 3, |
57 | GST_DSP66_VIDEO_KERNELTYPE_ARB = 4 | ||
57 | } GstDsp66VideoKernelType; | 58 | } GstDsp66VideoKernelType; |
58 | 59 | ||
59 | struct _GstDsp66VideoKernel { | 60 | struct _GstDsp66VideoKernel { |
@@ -61,6 +62,7 @@ struct _GstDsp66VideoKernel { | |||
61 | GstDsp66VideoKernelFilterSize filtersize; | 62 | GstDsp66VideoKernelFilterSize filtersize; |
62 | GstDsp66VideoKernelType kerneltype; | 63 | GstDsp66VideoKernelType kerneltype; |
63 | gboolean lum_only; | 64 | gboolean lum_only; |
65 | gchar *arbkernel; | ||
64 | }; | 66 | }; |
65 | 67 | ||
66 | struct _GstDsp66VideoKernelClass { | 68 | struct _GstDsp66VideoKernelClass { |
diff --git a/src/kernels/oclconv/conv.cl b/src/kernels/oclconv/conv.cl index dab866e..815b5ff 100644 --- a/src/kernels/oclconv/conv.cl +++ b/src/kernels/oclconv/conv.cl | |||
@@ -27,7 +27,12 @@ | |||
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); } | 28 | #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); } |
29 | #define PIX_SWAP(a,b) { unsigned char temp=(a);(a)=(b);(b)=temp; } | 29 | #define PIX_SWAP(a,b) { unsigned char temp=(a);(a)=(b);(b)=temp; } |
30 | #define ARGS global uchar *pInput, global ushort *pBufGradX, \ | ||
31 | global ushort *pBufGradY, global ushort *pBufMag, \ | ||
32 | global uchar *pBufOut, global uchar *pScratch, \ | ||
33 | global uint *numItems, ushort width, ushort height | ||
30 | 34 | ||
35 | /* imglib library functions */ | ||
31 | void IMG_median_3x3_8 (const unsigned char *restrict in_data, int cols, unsigned char * restrict out_data); | 36 | void IMG_median_3x3_8 (const unsigned char *restrict in_data, int cols, unsigned char * restrict out_data); |
32 | void IMG_sobel_3x3_8 (const unsigned char *restrict in_data, unsigned char *restrict out_data, int rows, int cols); | 37 | void IMG_sobel_3x3_8 (const unsigned char *restrict in_data, unsigned char *restrict out_data, int rows, int cols); |
33 | void IMG_conv_3x3_i8_c8s (const unsigned char *restrict in_data, unsigned char *restrict out_data, int cols, const char *restrict mask, int shift); | 38 | void IMG_conv_3x3_i8_c8s (const unsigned char *restrict in_data, unsigned char *restrict out_data, int cols, const char *restrict mask, int shift); |
diff --git a/src/kernels/oclconv/oclconv.cpp b/src/kernels/oclconv/oclconv.cpp index 00ef898..ed6a17d 100644 --- a/src/kernels/oclconv/oclconv.cpp +++ b/src/kernels/oclconv/oclconv.cpp | |||
@@ -165,7 +165,7 @@ static int ocl_canny(unsigned char *data_in, unsigned char *data_out, unsigned s | |||
165 | #ifdef __cplusplus | 165 | #ifdef __cplusplus |
166 | extern "C" { | 166 | extern "C" { |
167 | #endif | 167 | #endif |
168 | int oclconv_kernel(int kernel_type, int filter_size, | 168 | int oclconv_kernel(int kernel_type, int filter_size, char *arbkernel, |
169 | unsigned char *data_in, unsigned char *data_out, | 169 | unsigned char *data_in, unsigned char *data_out, |
170 | int width, int height, int dstride, int sstride) | 170 | int width, int height, int dstride, int sstride) |
171 | { | 171 | { |
@@ -194,6 +194,9 @@ int oclconv_kernel(int kernel_type, int filter_size, | |||
194 | /* filter size is ignored */ | 194 | /* filter size is ignored */ |
195 | retval = ocl_canny (data_in, data_out, width, height); /* input and output stride assumed to be == width */ | 195 | retval = ocl_canny (data_in, data_out, width, height); /* input and output stride assumed to be == width */ |
196 | break; | 196 | break; |
197 | case 4: /* user defined kernel */ | ||
198 | retval = oclconv_imgproc (arbkernel, data_in, data_out, width, height, sstride, dstride); | ||
199 | break; | ||
197 | default: | 200 | default: |
198 | break; | 201 | break; |
199 | } | 202 | } |