gstreamer: Add bayer8 support to libcamerasrc element

Bayer8 support is useful on hardware such as Librem 5, as GStreamer
provides easy solution for debayering and display of the camera
data. Add necessary glue to libcamerasrc element.

Signed-off-by: Pavel Machek <pavel@ucw.cz>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Pavel Machek 2022-12-23 18:23:12 +01:00 committed by Laurent Pinchart
parent 21a82ed8a5
commit e83d94915d
2 changed files with 31 additions and 1 deletions

View file

@ -20,6 +20,12 @@ static struct {
/* Compressed */
{ GST_VIDEO_FORMAT_ENCODED, formats::MJPEG },
/* Bayer formats, gstreamer only supports 8-bit */
{ GST_VIDEO_FORMAT_ENCODED, formats::SBGGR8 },
{ GST_VIDEO_FORMAT_ENCODED, formats::SGBRG8 },
{ GST_VIDEO_FORMAT_ENCODED, formats::SGRBG8 },
{ GST_VIDEO_FORMAT_ENCODED, formats::SRGGB8 },
/* RGB16 */
{ GST_VIDEO_FORMAT_RGB16, formats::RGB565 },
@ -228,6 +234,22 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)
return PixelFormat{};
}
static const gchar *
bayer_format_to_string(int format)
{
switch (format) {
case formats::SBGGR8:
return "bggr";
case formats::SGBRG8:
return "gbrg";
case formats::SGRBG8:
return "grbg";
case formats::SRGGB8:
return "rggb";
}
return NULL;
}
static GstStructure *
bare_structure_from_format(const PixelFormat &format)
{
@ -243,6 +265,14 @@ bare_structure_from_format(const PixelFormat &format)
switch (format) {
case formats::MJPEG:
return gst_structure_new_empty("image/jpeg");
case formats::SBGGR8:
case formats::SGBRG8:
case formats::SGRBG8:
case formats::SRGGB8:
return gst_structure_new("video/x-bayer", "format", G_TYPE_STRING,
bayer_format_to_string(format), nullptr);
default:
return nullptr;
}

View file

@ -161,7 +161,7 @@ G_DEFINE_TYPE_WITH_CODE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT,
GST_DEBUG_CATEGORY_INIT(source_debug, "libcamerasrc", 0,
"libcamera Source"))
#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; image/jpeg")
#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; image/jpeg; video/x-bayer")
/* For the simple case, we have a src pad that is always present. */
GstStaticPadTemplate src_template = {