[libcamera-devel] Add bayer8 support to gstlibcamera
diff mbox series

Message ID Y6NFu/O6VDG+WYdN@duo.ucw.cz
State Superseded
Headers show
Series
  • [libcamera-devel] Add bayer8 support to gstlibcamera
Related show

Commit Message

Pavel Machek Dec. 21, 2022, 5:43 p.m. UTC
Bayer8 support is useful on hardware such as Librem 5, as gstreamer
provides easy solution for debayering and display of the camera
data. Add neccessary glue to gstlibcamera.

Signed-off-by: Pavel Machek <pavel@ucw.cz>

Comments

Nicolas Dufresne Dec. 23, 2022, 3:51 p.m. UTC | #1
Lets make proper review ;-P

nit: On the tile, I'd prefix with "gstreamer: ...", as this has been the most
common tiled in patches, make search really easy.

Le mercredi 21 décembre 2022 à 18:43 +0100, Pavel Machek a écrit :
> Bayer8 support is useful on hardware such as Librem 5, as gstreamer

nit: s/gstreamer/GStreamer

> provides easy solution for debayering and display of the camera
> data. Add neccessary glue to gstlibcamera.

nit: s/gstlibcamera/libcamerasrc element/

> 
> Signed-off-by: Pavel Machek <pavel@ucw.cz>
> 
> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> index 36b9564c..b2cc7661 100644
> --- a/src/gstreamer/gstlibcamera-utils.cpp
> +++ b/src/gstreamer/gstlibcamera-utils.cpp
> @@ -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::SGRBG8 },
> +	{ GST_VIDEO_FORMAT_ENCODED, formats::SGBRG8 },
> +	{ GST_VIDEO_FORMAT_ENCODED, formats::SRGGB8 },
> +	{ GST_VIDEO_FORMAT_ENCODED, formats::SBGGR8 },
> +
>  	/* 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::SGRBG8:
> +		return "grbg";
> +	case formats::SGBRG8:
> +		return "gbrg";
> +	case formats::SRGGB8:
> +		return "rggb";
> +	case formats::SBGGR8:
> +		return "bggr";
> +	}
> +	return NULL;
> +}
> +
>  static GstStructure *
>  bare_structure_from_format(const PixelFormat &format)
>  {
> @@ -243,6 +265,12 @@ bare_structure_from_format(const PixelFormat &format)
>  	switch (format) {
>  	case formats::MJPEG:
>  		return gst_structure_new_empty("image/jpeg");
> +	case formats::SGRBG8:
> +	case formats::SGBRG8:
> +	case formats::SRGGB8:
> +	case formats::SBGGR8:
> +		return gst_structure_new("video/x-bayer", "format", G_TYPE_STRING,
> +					 bayer_format_to_string(format), nullptr);
>  	default:
>  		return nullptr;
>  	}
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> index 8d97d7c2..2ceeeb99 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -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; video/x-bayer; image/jpeg")

As discussed previously, let go for:

+#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; image/jpeg; video/x-bayer;")

With these very minor changes:

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

>  
>  /* For the simple case, we have a src pad that is always present. */
>  GstStaticPadTemplate src_template = {
> 
>

Patch
diff mbox series

diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
index 36b9564c..b2cc7661 100644
--- a/src/gstreamer/gstlibcamera-utils.cpp
+++ b/src/gstreamer/gstlibcamera-utils.cpp
@@ -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::SGRBG8 },
+	{ GST_VIDEO_FORMAT_ENCODED, formats::SGBRG8 },
+	{ GST_VIDEO_FORMAT_ENCODED, formats::SRGGB8 },
+	{ GST_VIDEO_FORMAT_ENCODED, formats::SBGGR8 },
+
 	/* 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::SGRBG8:
+		return "grbg";
+	case formats::SGBRG8:
+		return "gbrg";
+	case formats::SRGGB8:
+		return "rggb";
+	case formats::SBGGR8:
+		return "bggr";
+	}
+	return NULL;
+}
+
 static GstStructure *
 bare_structure_from_format(const PixelFormat &format)
 {
@@ -243,6 +265,12 @@  bare_structure_from_format(const PixelFormat &format)
 	switch (format) {
 	case formats::MJPEG:
 		return gst_structure_new_empty("image/jpeg");
+	case formats::SGRBG8:
+	case formats::SGBRG8:
+	case formats::SRGGB8:
+	case formats::SBGGR8:
+		return gst_structure_new("video/x-bayer", "format", G_TYPE_STRING,
+					 bayer_format_to_string(format), nullptr);
 	default:
 		return nullptr;
 	}
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 8d97d7c2..2ceeeb99 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -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; video/x-bayer; image/jpeg")
 
 /* For the simple case, we have a src pad that is always present. */
 GstStaticPadTemplate src_template = {