summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorPhilippe Renon <philippe_renon@yahoo.fr>2016-11-26 13:34:26 +0100
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2016-11-29 21:21:49 -0500
commitf6021e001603ed45e63236608c16770299a04435 (patch)
tree9868dfd5551cdb911aa211d2e33f92de63a6bba5 /gst-libs
parentcfc420bf4d36076479a22b045fd892e6587f1b22 (diff)
downloadgstreamer-plugins-bad-f6021e001603ed45e63236608c16770299a04435.tar.gz
opencv: account for sparse/padded formats when converting caps to cv image type
https://bugzilla.gnome.org/show_bug.cgi?id=774576
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/opencv/gstopencvutils.cpp77
-rw-r--r--gst-libs/gst/opencv/gstopencvutils.h5
2 files changed, 55 insertions, 27 deletions
diff --git a/gst-libs/gst/opencv/gstopencvutils.cpp b/gst-libs/gst/opencv/gstopencvutils.cpp
index e070c707b..92771e531 100644
--- a/gst-libs/gst/opencv/gstopencvutils.cpp
+++ b/gst-libs/gst/opencv/gstopencvutils.cpp
@@ -26,17 +26,19 @@
#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;
+ gchar *caps_str;
if (!gst_video_info_from_caps (&info, caps)) {
- GST_ERROR ("Failed to get the videoinfo from caps");
+ caps_str = gst_caps_to_string (caps);
+ GST_ERROR ("Failed to get video info from caps %s", caps_str);
g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
- "No width/heighti/depth/channels in caps");
+ "Failed to get video info from caps %s", caps_str);
+ g_free (caps_str);
return FALSE;
}
@@ -48,35 +50,58 @@ gboolean
gst_opencv_iplimage_params_from_video_info (GstVideoInfo * info, gint * width,
gint * height, gint * ipldepth, gint * channels, GError ** err)
{
- gint depth = 0;
- guint i;
+ GstVideoFormat format;
+ int cv_type;
- *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 {
- g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
- "Unsupported video format %s",
- gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info)));
+ format = GST_VIDEO_INFO_FORMAT (info);
+ if (!gst_opencv_cv_image_type_from_video_format (format, &cv_type, err)) {
return FALSE;
}
- for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (info); i++)
- depth += GST_VIDEO_INFO_COMP_DEPTH (info, i);
+ *width = GST_VIDEO_INFO_WIDTH (info);
+ *height = GST_VIDEO_INFO_HEIGHT (info);
+
+ *ipldepth = cvIplDepth (cv_type);
+ *channels = CV_MAT_CN (cv_type);
- 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;
+}
+
+gboolean
+gst_opencv_cv_image_type_from_video_format (GstVideoFormat format,
+ int * cv_type, GError ** err)
+{
+ const gchar *format_str;
+
+ switch (format) {
+ case GST_VIDEO_FORMAT_GRAY8:
+ *cv_type = CV_8UC1;
+ break;
+ case GST_VIDEO_FORMAT_RGB:
+ case GST_VIDEO_FORMAT_BGR:
+ *cv_type = CV_8UC3;
+ break;
+ case GST_VIDEO_FORMAT_RGBx:
+ case GST_VIDEO_FORMAT_xRGB:
+ case GST_VIDEO_FORMAT_BGRx:
+ case GST_VIDEO_FORMAT_xBGR:
+ case GST_VIDEO_FORMAT_RGBA:
+ case GST_VIDEO_FORMAT_ARGB:
+ case GST_VIDEO_FORMAT_BGRA:
+ case GST_VIDEO_FORMAT_ABGR:
+ *cv_type = CV_8UC4;
+ break;
+ case GST_VIDEO_FORMAT_GRAY16_LE:
+ case GST_VIDEO_FORMAT_GRAY16_BE:
+ *cv_type = CV_16UC1;
+ break;
+ default:
+ format_str = gst_video_format_to_string (format);
+ g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
+ "Unsupported video format %s", format_str);
+ return FALSE;
}
+
return TRUE;
}
diff --git a/gst-libs/gst/opencv/gstopencvutils.h b/gst-libs/gst/opencv/gstopencvutils.h
index 4cd32d8b8..47d1c0686 100644
--- a/gst-libs/gst/opencv/gstopencvutils.h
+++ b/gst-libs/gst/opencv/gstopencvutils.h
@@ -29,7 +29,6 @@
#include <gst/gst.h>
#include <gst/video/video.h>
-
G_BEGIN_DECLS
gboolean gst_opencv_parse_iplimage_params_from_caps
@@ -40,7 +39,11 @@ gboolean gst_opencv_iplimage_params_from_video_info
(GstVideoInfo * info, gint * width, gint * height, gint * depth,
gint * channels, GError ** err);
+gboolean gst_opencv_cv_image_type_from_video_format (GstVideoFormat format,
+ int * cv_type, GError ** err);
+
GstCaps * gst_opencv_caps_from_cv_image_type (int cv_type);
+
G_END_DECLS
#endif /* __GST_OPENCV_UTILS__ */