summaryrefslogtreecommitdiff
path: root/subprojects
diff options
context:
space:
mode:
authorMichael Grzeschik <m.grzeschik@pengutronix.de>2023-12-10 23:31:32 +0100
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2024-09-24 20:07:40 +0000
commit4670e1c809b9a1f56e90b9fd5de27a77b7d49482 (patch)
treead494fa59a377235952481d706367176374c802f /subprojects
parent5801e171601b9a5c2697d9f5e5140426971182ed (diff)
uvcsink: make gst_v4l2uvc_fourcc_to_bare_struct work with more raw formats
The uvcsink was limited to only transfer YUY2 and MJPEG. For the uncompressed formats there is no technical reason not to support them. Since gst_video_format_to_string is already supporting more fourcc than only YUY2 we use the default path in gst_v4l2uvc_fourcc_to_bare_struct to create structures for more formats and bail out if the returned format is not from the uncompressed type. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6037>
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/gst-plugins-bad/sys/uvcgadget/gstuvcsink.c159
1 files changed, 146 insertions, 13 deletions
diff --git a/subprojects/gst-plugins-bad/sys/uvcgadget/gstuvcsink.c b/subprojects/gst-plugins-bad/sys/uvcgadget/gstuvcsink.c
index e5b88fd2ec..94fa95d03e 100644
--- a/subprojects/gst-plugins-bad/sys/uvcgadget/gstuvcsink.c
+++ b/subprojects/gst-plugins-bad/sys/uvcgadget/gstuvcsink.c
@@ -95,30 +95,152 @@ gst_uvc_sink_get_property (GObject * object, guint prop_id,
}
}
+static GstVideoFormat
+gst_v4l2_object_v4l2fourcc_to_video_format (guint32 fourcc)
+{
+ GstVideoFormat format;
+
+ switch (fourcc) {
+ case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
+ format = GST_VIDEO_FORMAT_GRAY8;
+ break;
+ case V4L2_PIX_FMT_Y16:
+ format = GST_VIDEO_FORMAT_GRAY16_LE;
+ break;
+ case V4L2_PIX_FMT_Y16_BE:
+ format = GST_VIDEO_FORMAT_GRAY16_BE;
+ break;
+ case V4L2_PIX_FMT_XRGB555:
+ case V4L2_PIX_FMT_RGB555:
+ format = GST_VIDEO_FORMAT_RGB15;
+ break;
+ case V4L2_PIX_FMT_XRGB555X:
+ case V4L2_PIX_FMT_RGB555X:
+ format = GST_VIDEO_FORMAT_BGR15;
+ break;
+ case V4L2_PIX_FMT_RGB565:
+ format = GST_VIDEO_FORMAT_RGB16;
+ break;
+ case V4L2_PIX_FMT_RGB24:
+ format = GST_VIDEO_FORMAT_RGB;
+ break;
+ case V4L2_PIX_FMT_BGR24:
+ format = GST_VIDEO_FORMAT_BGR;
+ break;
+ case V4L2_PIX_FMT_XRGB32:
+ case V4L2_PIX_FMT_RGB32:
+ format = GST_VIDEO_FORMAT_xRGB;
+ break;
+ case V4L2_PIX_FMT_RGBX32:
+ format = GST_VIDEO_FORMAT_RGBx;
+ break;
+ case V4L2_PIX_FMT_XBGR32:
+ case V4L2_PIX_FMT_BGR32:
+ format = GST_VIDEO_FORMAT_BGRx;
+ break;
+ case V4L2_PIX_FMT_BGRX32:
+ format = GST_VIDEO_FORMAT_xBGR;
+ break;
+ case V4L2_PIX_FMT_ABGR32:
+ format = GST_VIDEO_FORMAT_BGRA;
+ break;
+ case V4L2_PIX_FMT_BGRA32:
+ format = GST_VIDEO_FORMAT_ABGR;
+ break;
+ case V4L2_PIX_FMT_RGBA32:
+ format = GST_VIDEO_FORMAT_RGBA;
+ break;
+ case V4L2_PIX_FMT_ARGB32:
+ format = GST_VIDEO_FORMAT_ARGB;
+ break;
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV12M:
+ format = GST_VIDEO_FORMAT_NV12;
+ break;
+ case V4L2_PIX_FMT_NV12MT:
+ format = GST_VIDEO_FORMAT_NV12_64Z32;
+ break;
+ case V4L2_PIX_FMT_MM21:
+ format = GST_VIDEO_FORMAT_NV12_16L32S;
+ break;
+ case V4L2_PIX_FMT_NV12M_8L128:
+ format = GST_VIDEO_FORMAT_NV12_8L128;
+ break;
+ case V4L2_PIX_FMT_NV12M_10BE_8L128:
+ format = GST_VIDEO_FORMAT_NV12_10BE_8L128;
+ break;
+ case V4L2_PIX_FMT_NV21:
+ case V4L2_PIX_FMT_NV21M:
+ format = GST_VIDEO_FORMAT_NV21;
+ break;
+ case V4L2_PIX_FMT_YVU410:
+ format = GST_VIDEO_FORMAT_YVU9;
+ break;
+ case V4L2_PIX_FMT_YUV410:
+ format = GST_VIDEO_FORMAT_YUV9;
+ break;
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YUV420M:
+ format = GST_VIDEO_FORMAT_I420;
+ break;
+ case V4L2_PIX_FMT_YUYV:
+ format = GST_VIDEO_FORMAT_YUY2;
+ break;
+ case V4L2_PIX_FMT_YVU420:
+ case V4L2_PIX_FMT_YVU420M:
+ format = GST_VIDEO_FORMAT_YV12;
+ break;
+ case V4L2_PIX_FMT_UYVY:
+ format = GST_VIDEO_FORMAT_UYVY;
+ break;
+ case V4L2_PIX_FMT_YUV411P:
+ format = GST_VIDEO_FORMAT_Y41B;
+ break;
+ case V4L2_PIX_FMT_YUV422P:
+ format = GST_VIDEO_FORMAT_Y42B;
+ break;
+ case V4L2_PIX_FMT_YVYU:
+ format = GST_VIDEO_FORMAT_YVYU;
+ break;
+ case V4L2_PIX_FMT_NV16:
+ case V4L2_PIX_FMT_NV16M:
+ format = GST_VIDEO_FORMAT_NV16;
+ break;
+ case V4L2_PIX_FMT_NV61:
+ case V4L2_PIX_FMT_NV61M:
+ format = GST_VIDEO_FORMAT_NV61;
+ break;
+ case V4L2_PIX_FMT_NV24:
+ format = GST_VIDEO_FORMAT_NV24;
+ break;
+ default:
+ format = GST_VIDEO_FORMAT_UNKNOWN;
+ break;
+ }
+
+ return format;
+}
+
static GstStructure *
gst_v4l2uvc_fourcc_to_bare_struct (guint32 fourcc)
{
GstStructure *structure = NULL;
+ GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN;
- /* Since MJPEG and YUY2 are currently the only one supported
- * we limit the function to parse only these fourccs
- */
switch (fourcc) {
case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */
case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */
structure = gst_structure_new_empty ("image/jpeg");
break;
- case V4L2_PIX_FMT_YUYV:{
- GstVideoFormat format = GST_VIDEO_FORMAT_YUY2;
- if (format != GST_VIDEO_FORMAT_UNKNOWN)
- structure = gst_structure_new ("video/x-raw",
- "format", G_TYPE_STRING, gst_video_format_to_string (format), NULL);
- break;
- }
- break;
default:
- GST_DEBUG ("Unsupported fourcc 0x%08x %" GST_FOURCC_FORMAT,
- fourcc, GST_FOURCC_ARGS (fourcc));
+ format = gst_v4l2_object_v4l2fourcc_to_video_format (fourcc);
+ if (format == GST_VIDEO_FORMAT_UNKNOWN) {
+ GST_DEBUG ("Unsupported fourcc 0x%08x %" GST_FOURCC_FORMAT,
+ fourcc, GST_FOURCC_ARGS (fourcc));
+ break;
+ }
+ structure = gst_structure_new ("video/x-raw",
+ "format", G_TYPE_STRING, gst_video_format_to_string (format), NULL);
break;
}
@@ -155,6 +277,8 @@ gst_uvc_sink_get_configured_caps (GstUvcSink * self)
}
s = gst_v4l2uvc_fourcc_to_bare_struct (format.pixelformat);
+ if (!s)
+ return NULL;
memset (&size, 0, sizeof (struct v4l2_frmsizeenum));
size.index = self->cur.bFrameIndex - 1;
@@ -631,6 +755,15 @@ gst_uvc_sink_task (gpointer data)
* from the probed caps that match the configured caps.
*/
configured_caps = gst_uvc_sink_get_configured_caps (self);
+ if (!configured_caps) {
+ GST_ELEMENT_ERROR (self, RESOURCE, WRITE,
+ ("gst_uvc_sink_get_configured_caps failed"),
+ ("gst_uvc_sink_get_configured_caps on current format failed"));
+ gst_uvc_sink_unwatch (self);
+ gst_element_set_state (GST_ELEMENT (self), GST_STATE_NULL);
+ return;
+ }
+
gst_clear_caps (&self->cur_caps);
self->cur_caps =
gst_caps_intersect_full (self->probed_caps, configured_caps,