summaryrefslogtreecommitdiff
path: root/gst-libs/gst/opencv
diff options
context:
space:
mode:
authorPhilippe Renon <philippe_renon@yahoo.fr>2016-11-10 18:42:29 +0100
committerLuis de Bethencourt <luisbg@osg.samsung.com>2016-11-14 18:25:57 +0000
commit5594c7e53eb95f93cbecac33b83609e70d7a3ce5 (patch)
tree19c865c4dd8d1771b3090e1c9649aca4adef5c9a /gst-libs/gst/opencv
parent2121e99dc84f1b4f4f1c9191e907903a1a8bf6cb (diff)
downloadgstreamer-plugins-bad-5594c7e53eb95f93cbecac33b83609e70d7a3ce5.tar.gz
opencv: move base opencv filter class and utilities to gst-libs
https://bugzilla.gnome.org/show_bug.cgi?id=774223
Diffstat (limited to 'gst-libs/gst/opencv')
-rw-r--r--gst-libs/gst/opencv/Makefile.am21
-rw-r--r--gst-libs/gst/opencv/gstopencvutils.cpp106
-rw-r--r--gst-libs/gst/opencv/gstopencvutils.h42
-rw-r--r--gst-libs/gst/opencv/gstopencvvideofilter.cpp317
-rw-r--r--gst-libs/gst/opencv/gstopencvvideofilter.h106
5 files changed, 592 insertions, 0 deletions
diff --git a/gst-libs/gst/opencv/Makefile.am b/gst-libs/gst/opencv/Makefile.am
new file mode 100644
index 000000000..9d18a5fc5
--- /dev/null
+++ b/gst-libs/gst/opencv/Makefile.am
@@ -0,0 +1,21 @@
+lib_LTLIBRARIES = libgstopencv-@GST_API_VERSION@.la
+
+libgstopencv_@GST_API_VERSION@_la_SOURCES = \
+ gstopencvutils.cpp \
+ gstopencvvideofilter.cpp
+
+libgstopencv_@GST_API_VERSION@_la_CXXFLAGS = \
+ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) \
+ $(OPENCV_CFLAGS)
+
+libgstopencv_@GST_API_VERSION@_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \
+ $(OPENCV_LIBS) -lgstvideo-$(GST_API_VERSION)
+
+libgstopencv_@GST_API_VERSION@_la_LDFLAGS = \
+ $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+libgstopencv_@GST_API_VERSION@includedir = \
+ $(includedir)/gstreamer-@GST_API_VERSION@/gst/opencv
+libgstopencv_@GST_API_VERSION@include_HEADERS = \
+ gstopencvutils.h \
+ gstopencvvideofilter.h
diff --git a/gst-libs/gst/opencv/gstopencvutils.cpp b/gst-libs/gst/opencv/gstopencvutils.cpp
new file mode 100644
index 000000000..640486be1
--- /dev/null
+++ b/gst-libs/gst/opencv/gstopencvutils.cpp
@@ -0,0 +1,106 @@
+/* GStreamer
+ * Copyright (C) <2010> Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * gstopencvutils.c: miscellaneous utility functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstopencvutils.h"
+#include <opencv2/core/core_c.h>
+
+
+gboolean
+gst_opencv_parse_iplimage_params_from_caps (GstCaps * caps, gint * width,
+ gint * height, gint * ipldepth, gint * channels, GError ** err)
+{
+ GstVideoInfo info;
+ gint depth = 0;
+ guint i;
+ gchar *caps_str;
+
+ if (!gst_video_info_from_caps (&info, caps)) {
+ GST_ERROR ("Failed to get the videoinfo from caps");
+ g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
+ "No width/heighti/depth/channels in caps");
+ return FALSE;
+ }
+
+ *width = GST_VIDEO_INFO_WIDTH (&info);
+ *height = GST_VIDEO_INFO_HEIGHT (&info);
+ if (GST_VIDEO_INFO_IS_RGB (&info))
+ *channels = 3;
+ else if (GST_VIDEO_INFO_IS_GRAY (&info))
+ *channels = 1;
+ else {
+ caps_str = gst_caps_to_string (caps);
+ g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
+ "Unsupported caps %s", caps_str);
+ g_free (caps_str);
+ return FALSE;
+ }
+
+ for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (&info); i++)
+ depth += GST_VIDEO_INFO_COMP_DEPTH (&info, i);
+
+ if (depth / *channels == 8) {
+ /* TODO signdness? */
+ *ipldepth = IPL_DEPTH_8U;
+ } else if (depth / *channels == 16) {
+ *ipldepth = IPL_DEPTH_16U;
+ } else {
+ g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
+ "Unsupported depth/channels %d/%d", depth, *channels);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+GstCaps *
+gst_opencv_caps_from_cv_image_type (int cv_type)
+{
+ GstCaps *c = gst_caps_new_empty ();
+ switch (cv_type) {
+ case CV_8UC1:
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY8")));
+ break;
+ case CV_8UC3:
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGB")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR")));
+ break;
+ case CV_8UC4:
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGBx")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("xRGB")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRx")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("xBGR")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGBA")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("ARGB")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRA")));
+ gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("ABGR")));
+ break;
+ case CV_16UC1:
+ gst_caps_append (c,
+ gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY16_LE")));
+ gst_caps_append (c,
+ gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY16_BE")));
+ break;
+ }
+ return c;
+}
diff --git a/gst-libs/gst/opencv/gstopencvutils.h b/gst-libs/gst/opencv/gstopencvutils.h
new file mode 100644
index 000000000..13dfd9e07
--- /dev/null
+++ b/gst-libs/gst/opencv/gstopencvutils.h
@@ -0,0 +1,42 @@
+/* GStreamer
+ * Copyright (C) <2010> Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * gstopencvutils.h: miscellaneous utility functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_OPENCV_UTILS__
+#define __GST_OPENCV_UTILS__
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+
+G_BEGIN_DECLS
+
+gboolean gst_opencv_parse_iplimage_params_from_caps
+ (GstCaps * caps, gint * width, gint * height, gint * depth,
+ gint * channels, GError ** err);
+
+GstCaps * gst_opencv_caps_from_cv_image_type (int cv_type);
+G_END_DECLS
+
+#endif /* __GST_OPENCV_UTILS__ */
diff --git a/gst-libs/gst/opencv/gstopencvvideofilter.cpp b/gst-libs/gst/opencv/gstopencvvideofilter.cpp
new file mode 100644
index 000000000..4b8e53670
--- /dev/null
+++ b/gst-libs/gst/opencv/gstopencvvideofilter.cpp
@@ -0,0 +1,317 @@
+/*
+ * GStreamer
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* TODO opencv can do scaling for some cases */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gstopencvvideofilter.h"
+#include "gstopencvutils.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_opencv_video_filter_debug);
+#define GST_CAT_DEFAULT gst_opencv_video_filter_debug
+
+/* Filter signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0
+};
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_opencv_video_filter_class_init (GstOpencvVideoFilterClass *
+ klass);
+static void gst_opencv_video_filter_init (GstOpencvVideoFilter * trans,
+ GstOpencvVideoFilterClass * klass);
+
+static gboolean gst_opencv_video_filter_set_caps (GstBaseTransform * trans,
+ GstCaps * incaps, GstCaps * outcaps);
+static GstFlowReturn gst_opencv_video_filter_transform_ip (GstBaseTransform *
+ trans, GstBuffer * buf);
+static GstFlowReturn gst_opencv_video_filter_transform (GstBaseTransform *
+ trans, GstBuffer * inbuf, GstBuffer * outbuf);
+
+static void gst_opencv_video_filter_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_opencv_video_filter_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+GType
+gst_opencv_video_filter_get_type (void)
+{
+ static volatile gsize opencv_base_transform_type = 0;
+
+ if (g_once_init_enter (&opencv_base_transform_type)) {
+ GType _type;
+ static const GTypeInfo opencv_base_transform_info = {
+ sizeof (GstOpencvVideoFilterClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_opencv_video_filter_class_init,
+ NULL,
+ NULL,
+ sizeof (GstOpencvVideoFilter),
+ 0,
+ (GInstanceInitFunc) gst_opencv_video_filter_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_VIDEO_FILTER,
+ "GstOpencvVideoFilter", &opencv_base_transform_info,
+ G_TYPE_FLAG_ABSTRACT);
+ g_once_init_leave (&opencv_base_transform_type, _type);
+ }
+ return opencv_base_transform_type;
+}
+
+/* Clean up */
+static void
+gst_opencv_video_filter_finalize (GObject * obj)
+{
+ GstOpencvVideoFilter *transform = GST_OPENCV_VIDEO_FILTER (obj);
+
+ if (transform->cvImage)
+ cvReleaseImage (&transform->cvImage);
+ if (transform->out_cvImage)
+ cvReleaseImage (&transform->out_cvImage);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_opencv_video_filter_class_init (GstOpencvVideoFilterClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstBaseTransformClass *basetrans_class;
+
+ gobject_class = (GObjectClass *) klass;
+ basetrans_class = (GstBaseTransformClass *) klass;
+ parent_class = (GstElementClass *) g_type_class_peek_parent (klass);
+
+ GST_DEBUG_CATEGORY_INIT (gst_opencv_video_filter_debug,
+ "opencvbasetransform", 0, "opencvbasetransform element");
+
+ gobject_class->finalize =
+ GST_DEBUG_FUNCPTR (gst_opencv_video_filter_finalize);
+ gobject_class->set_property = gst_opencv_video_filter_set_property;
+ gobject_class->get_property = gst_opencv_video_filter_get_property;
+
+ basetrans_class->transform = gst_opencv_video_filter_transform;
+ basetrans_class->transform_ip = gst_opencv_video_filter_transform_ip;
+ basetrans_class->set_caps = gst_opencv_video_filter_set_caps;
+}
+
+static void
+gst_opencv_video_filter_init (GstOpencvVideoFilter * transform,
+ GstOpencvVideoFilterClass * klass)
+{
+}
+
+static GstFlowReturn
+gst_opencv_video_filter_transform (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer * outbuf)
+{
+ GstOpencvVideoFilter *transform;
+ GstOpencvVideoFilterClass *fclass;
+ GstMapInfo in_info;
+ GstMapInfo out_info;
+ GstFlowReturn ret;
+
+ transform = GST_OPENCV_VIDEO_FILTER (trans);
+ fclass = GST_OPENCV_VIDEO_FILTER_GET_CLASS (transform);
+
+ g_return_val_if_fail (fclass->cv_trans_func != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (transform->cvImage != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (transform->out_cvImage != NULL, GST_FLOW_ERROR);
+
+ if (!gst_buffer_map (inbuf, &in_info, GST_MAP_READ))
+ goto inbuf_map_failed;
+
+ if (!gst_buffer_map (outbuf, &out_info, GST_MAP_WRITE))
+ goto outbuf_map_failed;
+
+ transform->cvImage->imageData = (char *) in_info.data;
+ transform->out_cvImage->imageData = (char *) out_info.data;
+
+ ret = fclass->cv_trans_func (transform, inbuf, transform->cvImage, outbuf,
+ transform->out_cvImage);
+
+ gst_buffer_unmap (inbuf, &in_info);
+ gst_buffer_unmap (outbuf, &out_info);
+
+ return ret;
+
+inbuf_map_failed:
+ GST_ELEMENT_ERROR (transform, RESOURCE, READ,
+ ("Failed to map buffer for reading"), (NULL));
+ return GST_FLOW_ERROR;
+
+outbuf_map_failed:
+ GST_ELEMENT_ERROR (transform, RESOURCE, WRITE,
+ ("Failed to map buffer for writing"), (NULL));
+ gst_buffer_unmap (inbuf, &in_info);
+ return GST_FLOW_ERROR;
+}
+
+static GstFlowReturn
+gst_opencv_video_filter_transform_ip (GstBaseTransform * trans,
+ GstBuffer * buffer)
+{
+ GstOpencvVideoFilter *transform;
+ GstOpencvVideoFilterClass *fclass;
+ GstMapInfo info;
+ GstFlowReturn ret;
+
+ transform = GST_OPENCV_VIDEO_FILTER (trans);
+ fclass = GST_OPENCV_VIDEO_FILTER_GET_CLASS (transform);
+
+ g_return_val_if_fail (fclass->cv_trans_ip_func != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (transform->cvImage != NULL, GST_FLOW_ERROR);
+
+ if (!gst_buffer_map (buffer, &info, (GstMapFlags) (GST_MAP_READWRITE)))
+ goto map_failed;
+
+ transform->cvImage->imageData = (char *) info.data;
+
+ ret = fclass->cv_trans_ip_func (transform, buffer, transform->cvImage);
+
+ gst_buffer_unmap (buffer, &info);
+
+ return ret;
+
+map_failed:
+ GST_ELEMENT_ERROR (transform, RESOURCE, WRITE,
+ ("Failed to map buffer for reading and writing"), (NULL));
+ return GST_FLOW_ERROR;
+}
+
+static gboolean
+gst_opencv_video_filter_set_caps (GstBaseTransform * trans, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ GstOpencvVideoFilter *transform = GST_OPENCV_VIDEO_FILTER (trans);
+ GstOpencvVideoFilterClass *klass =
+ GST_OPENCV_VIDEO_FILTER_GET_CLASS (transform);
+ gint in_width, in_height;
+ gint in_depth, in_channels;
+ gint out_width, out_height;
+ gint out_depth, out_channels;
+ GError *in_err = NULL;
+ GError *out_err = NULL;
+
+ if (!gst_opencv_parse_iplimage_params_from_caps (incaps, &in_width,
+ &in_height, &in_depth, &in_channels, &in_err)) {
+ GST_WARNING_OBJECT (transform, "Failed to parse input caps: %s",
+ in_err->message);
+ g_error_free (in_err);
+ return FALSE;
+ }
+
+ if (!gst_opencv_parse_iplimage_params_from_caps (outcaps, &out_width,
+ &out_height, &out_depth, &out_channels, &out_err)) {
+ GST_WARNING_OBJECT (transform, "Failed to parse output caps: %s",
+ out_err->message);
+ g_error_free (out_err);
+ return FALSE;
+ }
+
+ if (klass->cv_set_caps) {
+ if (!klass->cv_set_caps (transform, in_width, in_height, in_depth,
+ in_channels, out_width, out_height, out_depth, out_channels))
+ return FALSE;
+ }
+
+ if (transform->cvImage) {
+ cvReleaseImage (&transform->cvImage);
+ }
+ if (transform->out_cvImage) {
+ cvReleaseImage (&transform->out_cvImage);
+ }
+
+ transform->cvImage =
+ cvCreateImageHeader (cvSize (in_width, in_height), in_depth, in_channels);
+ transform->out_cvImage =
+ cvCreateImageHeader (cvSize (out_width, out_height), out_depth,
+ out_channels);
+
+ gst_base_transform_set_in_place (GST_BASE_TRANSFORM (transform),
+ transform->in_place);
+ return TRUE;
+}
+
+static void
+gst_opencv_video_filter_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_opencv_video_filter_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+void
+gst_opencv_video_filter_set_in_place (GstOpencvVideoFilter * transform,
+ gboolean ip)
+{
+ transform->in_place = ip;
+ gst_base_transform_set_in_place (GST_BASE_TRANSFORM (transform), ip);
+}
diff --git a/gst-libs/gst/opencv/gstopencvvideofilter.h b/gst-libs/gst/opencv/gstopencvvideofilter.h
new file mode 100644
index 000000000..7fbafe932
--- /dev/null
+++ b/gst-libs/gst/opencv/gstopencvvideofilter.h
@@ -0,0 +1,106 @@
+/*
+ * GStreamer
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_OPENCV_VIDEO_FILTER_H__
+#define __GST_OPENCV_VIDEO_FILTER_H__
+
+#include <gst/gst.h>
+#include <gst/video/gstvideofilter.h>
+#include <opencv2/core/core_c.h>
+
+G_BEGIN_DECLS
+/* #defines don't like whitespacey bits */
+#define GST_TYPE_OPENCV_VIDEO_FILTER \
+ (gst_opencv_video_filter_get_type())
+#define GST_OPENCV_VIDEO_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OPENCV_VIDEO_FILTER,GstOpencvVideoFilter))
+#define GST_OPENCV_VIDEO_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OPENCV_VIDEO_FILTER,GstOpencvVideoFilterClass))
+#define GST_IS_OPENCV_VIDEO_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OPENCV_VIDEO_FILTER))
+#define GST_IS_OPENCV_VIDEO_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OPENCV_VIDEO_FILTER))
+#define GST_OPENCV_VIDEO_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_OPENCV_VIDEO_FILTER,GstOpencvVideoFilterClass))
+#define GST_OPENCV_VIDEO_FILTER_CAST(obj) ((GstOpencvVideoFilter *) (obj))
+
+typedef struct _GstOpencvVideoFilter GstOpencvVideoFilter;
+typedef struct _GstOpencvVideoFilterClass GstOpencvVideoFilterClass;
+
+typedef GstFlowReturn (*GstOpencvVideoFilterTransformIPFunc)
+ (GstOpencvVideoFilter * transform, GstBuffer * buffer, IplImage * img);
+typedef GstFlowReturn (*GstOpencvVideoFilterTransformFunc)
+ (GstOpencvVideoFilter * transform, GstBuffer * buffer, IplImage * img,
+ GstBuffer * outbuf, IplImage * outimg);
+
+typedef gboolean (*GstOpencvVideoFilterSetCaps)
+ (GstOpencvVideoFilter * transform, gint in_width, gint in_height,
+ gint in_depth, gint in_channels, gint out_width, gint out_height,
+ gint out_depth, gint out_channels);
+
+struct _GstOpencvVideoFilter
+{
+ GstVideoFilter trans;
+
+ gboolean in_place;
+
+ IplImage *cvImage;
+ IplImage *out_cvImage;
+};
+
+struct _GstOpencvVideoFilterClass
+{
+ GstVideoFilterClass parent_class;
+
+ GstOpencvVideoFilterTransformFunc cv_trans_func;
+ GstOpencvVideoFilterTransformIPFunc cv_trans_ip_func;
+
+ GstOpencvVideoFilterSetCaps cv_set_caps;
+};
+
+GType gst_opencv_video_filter_get_type (void);
+
+void gst_opencv_video_filter_set_in_place (GstOpencvVideoFilter * transform,
+ gboolean ip);
+
+G_END_DECLS
+#endif /* __GST_OPENCV_VIDEO_FILTER_H__ */