Add arbkernel type (user defined - as an example pointing to Sobel3x3)
authorDjordje Senicic <d-senicic1@ti.com>
Wed, 23 Mar 2016 11:26:53 +0000 (07:26 -0400)
committerDjordje Senicic <d-senicic1@ti.com>
Wed, 23 Mar 2016 11:26:53 +0000 (07:26 -0400)
src/gstdsp66videokernel.c
src/gstdsp66videokernel.h
src/kernels/oclconv/conv.cl
src/kernels/oclconv/oclconv.cpp

index 8174710084dabad2c4b53e0bfa2876600eba1c97..2d7bf5de020d51913081124803a2ba7624031b16 100644 (file)
@@ -47,12 +47,14 @@ enum
 #define DEFAULT_FILTERSIZE   5
 #define DEFAULT_LUM_ONLY     TRUE
 #define DEFAULT_KERNELTYPE   GST_DSP66_VIDEO_KERNELTYPE_MEDIAN
+#define DEFAULT_ARBKERNEL    "Sobel3x3"
 enum
 {
   PROP_0,
   PROP_FILTERSIZE,
   PROP_LUM_ONLY,
-  PROP_KERNELTYPE
+  PROP_KERNELTYPE,
+  PROP_ARBKERNEL
 };
 
 #define GST_TYPE_VIDEO_KERNEL_FILTERSIZE (gst_dsp66_video_kernel_filtersize_get_type())
@@ -69,6 +71,7 @@ static const GEnumValue dsp66_video_kerneltype[] = {
   {GST_DSP66_VIDEO_KERNELTYPE_SOBEL, "Kernel sobel", "1"},
   {GST_DSP66_VIDEO_KERNELTYPE_CONV,  "Kernel conv",  "2"},
   {GST_DSP66_VIDEO_KERNELTYPE_CANNY, "Kernel canny", "3"},
+  {GST_DSP66_VIDEO_KERNELTYPE_ARB, "Kernel arbitrary", "4"},
   {0, NULL, NULL},
 };
 
@@ -135,6 +138,11 @@ gst_dsp66_video_kernel_class_init (GstDsp66VideoKernelClass * klass)
           "luminance", DEFAULT_LUM_ONLY,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  g_object_class_install_property (gobject_class, PROP_ARBKERNEL,
+      g_param_spec_string ("arbkernel", "User defined kernel",
+          "The name of the kernel invoked via OpenCL.",
+          NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&dsp66_video_kernel_sink_factory));
   gst_element_class_add_pad_template (gstelement_class,
@@ -154,17 +162,19 @@ gst_dsp66_video_kernel_init (GstDsp66VideoKernel * kernel)
   kernel->filtersize = DEFAULT_FILTERSIZE;
   kernel->kerneltype = DEFAULT_KERNELTYPE;
   kernel->lum_only   = DEFAULT_LUM_ONLY;
+  kernel->arbkernel  = g_strdup (DEFAULT_ARBKERNEL);
 }
 
-extern int oclconv_kernel(int kernel_type, int kernel_size, unsigned char *src, unsigned char *dest, int width, int height, int sstride, int dstride); 
+extern int oclconv_kernel(int kernel_type, int kernel_size, char *arbkernel, 
+                          unsigned char *src, unsigned char *dest, int width, int height, int sstride, int dstride); 
 
 static int 
-imgproc (gint kerneltype, gint filtersize, 
+imgproc (gint kerneltype, gint filtersize, gchar *arbkernel, 
     guint8 * dest, gint dstride, 
     const guint8 * src, gint sstride,
     gint width, gint height)
 {
-  return oclconv_kernel(kerneltype, filtersize, (unsigned char *)src, (unsigned char *)dest, width, height, sstride, dstride);
+  return oclconv_kernel(kerneltype, filtersize, arbkernel, (unsigned char *)src, (unsigned char *)dest, width, height, sstride, dstride);
 }
 
 static GstFlowReturn
@@ -188,14 +198,14 @@ gst_dsp66_video_kernel_transform_frame (GstVideoFilter * filter,
       gst_video_frame_copy_plane (out_frame, in_frame, 1);
       gst_video_frame_copy_plane (out_frame, in_frame, 2);
     } else {
-      imgproc (kernel->kerneltype, kernel->filtersize,
+      imgproc (kernel->kerneltype, kernel->filtersize, kernel->arbkernel,
           GST_VIDEO_FRAME_PLANE_DATA (out_frame, 1),
           GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 1),
           GST_VIDEO_FRAME_PLANE_DATA (in_frame, 1),
           GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, 1),
           GST_VIDEO_FRAME_WIDTH (in_frame) / 2,
           GST_VIDEO_FRAME_HEIGHT (in_frame) / 2);
-      imgproc (kernel->kerneltype, kernel->filtersize,
+      imgproc (kernel->kerneltype, kernel->filtersize, kernel->arbkernel,
           GST_VIDEO_FRAME_PLANE_DATA (out_frame, 2),
           GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, 2),
           GST_VIDEO_FRAME_PLANE_DATA (in_frame, 2),
@@ -225,6 +235,14 @@ gst_dsp66_video_kernel_set_property (GObject * object, guint prop_id,
     case PROP_KERNELTYPE:
       kernel->kerneltype = g_value_get_enum (value);
       break;
+    case PROP_ARBKERNEL:
+      if (!g_value_get_string (value)) {
+        GST_WARNING ("Arbitrary kernel string can not be NULL");
+        break;
+      }
+      g_free (kernel->arbkernel);
+      kernel->arbkernel = g_value_dup_string (value);
+      break;
     default:
       break;
   }
index b78354bf926072a8d43eee4c264613e81560bffb..017d8095c7554ffe126245f4a59a0130fe70d77d 100644 (file)
@@ -53,7 +53,8 @@ typedef enum {
   GST_DSP66_VIDEO_KERNELTYPE_MEDIAN = 0,
   GST_DSP66_VIDEO_KERNELTYPE_SOBEL  = 1,
   GST_DSP66_VIDEO_KERNELTYPE_CONV   = 2,
-  GST_DSP66_VIDEO_KERNELTYPE_CANNY  = 3
+  GST_DSP66_VIDEO_KERNELTYPE_CANNY  = 3,
+  GST_DSP66_VIDEO_KERNELTYPE_ARB    = 4
 } GstDsp66VideoKernelType;
 
 struct _GstDsp66VideoKernel {
@@ -61,6 +62,7 @@ struct _GstDsp66VideoKernel {
   GstDsp66VideoKernelFilterSize filtersize;
   GstDsp66VideoKernelType kerneltype;
   gboolean lum_only;
+  gchar *arbkernel;
 };
 
 struct _GstDsp66VideoKernelClass {
index dab866e713dd2808d67e354d0888014a90b672f4..815b5ff0e21af96c9d418bfbc14f596b46a0f3fe 100644 (file)
  *****************************************************************************/
 #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }
 #define PIX_SWAP(a,b) { unsigned char temp=(a);(a)=(b);(b)=temp; }
+#define ARGS global uchar  *pInput,    global ushort *pBufGradX, \
+             global ushort *pBufGradY, global ushort *pBufMag,   \
+             global uchar  *pBufOut,   global uchar  *pScratch,  \
+             global uint   *numItems,  ushort width, ushort height
 
+/* imglib library functions */
 void IMG_median_3x3_8 (const unsigned char *restrict in_data, int cols, unsigned char * restrict out_data);
 void IMG_sobel_3x3_8  (const unsigned char *restrict in_data, unsigned char *restrict out_data, int rows, int cols);
 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);
index 00ef898646608cb49cec7c263b2b39a19f0c829f..ed6a17d94a8d31841982d7843df30b11b00562cf 100644 (file)
@@ -165,7 +165,7 @@ static int ocl_canny(unsigned char *data_in, unsigned char *data_out, unsigned s
 #ifdef __cplusplus
 extern "C" {
 #endif
-int oclconv_kernel(int kernel_type, int filter_size, 
+int oclconv_kernel(int kernel_type, int filter_size, char *arbkernel,
                    unsigned char *data_in, unsigned char *data_out, 
                    int width, int height, int dstride, int sstride)
 {
@@ -194,6 +194,9 @@ int oclconv_kernel(int kernel_type, int filter_size,
       /* filter size is ignored */
       retval = ocl_canny (data_in, data_out, width, height); /* input and output stride assumed to be == width */
       break;
+    case 4: /* user defined kernel */
+      retval = oclconv_imgproc (arbkernel, data_in, data_out, width, height, sstride, dstride);
+      break;
     default:
       break;
   }