[v2] gstreamer:Implement caps parsing for video/x-bayer
diff mbox series

Message ID 20241031091157.304305-1-mailinglist1@johanneskirchmair.de
State New
Headers show
Series
  • [v2] gstreamer:Implement caps parsing for video/x-bayer
Related show

Commit Message

mailinglist1@johanneskirchmair.de Oct. 31, 2024, 9:11 a.m. UTC
From: Johannes Kirchmair <johannes.kirchmair@skidata.com>

The parsing of video/x-bayer sources from string makes is possible to
use cameras providing e.g SGRBG8 streams via gst-launch.

Like:
gst-launch-1.0 libcamerasrc camera-name=<cam> ! video/x-bayer,format=grbg

Without this change the gstreamer plugin complains about "Unsupported
media type: video/x-bayer".

Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>

Changes in v2:
- Coding style changes
- Removed printf that slipped in
---
 src/gstreamer/gstlibcamera-utils.cpp | 85 ++++++++++++++--------------
 1 file changed, 44 insertions(+), 41 deletions(-)

Comments

Barnabás Pőcze Oct. 31, 2024, 12:07 p.m. UTC | #1
Hi


2024. október 31., csütörtök 10:11 keltezéssel, mailinglist1@johanneskirchmair.de <mailinglist1@johanneskirchmair.de> írta:

> From: Johannes Kirchmair <johannes.kirchmair@skidata.com>
> 
> The parsing of video/x-bayer sources from string makes is possible to
> use cameras providing e.g SGRBG8 streams via gst-launch.
> 
> Like:
> gst-launch-1.0 libcamerasrc camera-name=<cam> ! video/x-bayer,format=grbg
> 
> Without this change the gstreamer plugin complains about "Unsupported
> media type: video/x-bayer".
> 
> Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>
> 
> Changes in v2:
> - Coding style changes
> - Removed printf that slipped in
> ---
>  src/gstreamer/gstlibcamera-utils.cpp | 85 ++++++++++++++--------------
>  1 file changed, 44 insertions(+), 41 deletions(-)
> 
> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> index 79f71246..80631295 100644
> --- a/src/gstreamer/gstlibcamera-utils.cpp
> +++ b/src/gstreamer/gstlibcamera-utils.cpp
> @@ -254,54 +254,54 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)
>  	return PixelFormat{};
>  }
> 
> +static struct {

Please make this `const`.


> +	PixelFormat format;
> +	const gchar *name;
> +} bayer_formats[]{
> +	{ formats::SBGGR8, "bggr" },
> +	{ formats::SGBRG8, "gbrg" },
> +	{ formats::SGRBG8, "grbg" },
> +	{ formats::SRGGB8, "rggb" },
> +	{ formats::SBGGR10, "bggr10le" },
> +	{ formats::SGBRG10, "gbrg10le" },
> +	{ formats::SGRBG10, "grbg10le" },
> +	{ formats::SRGGB10, "rggb10le" },
> +	{ formats::SBGGR12, "bggr12le" },
> +	{ formats::SGBRG12, "gbrg12le" },
> +	{ formats::SGRBG12, "grbg12le" },
> +	{ formats::SRGGB12, "rggb12le" },
> +	{ formats::SBGGR14, "bggr14le" },
> +	{ formats::SGBRG14, "gbrg14le" },
> +	{ formats::SGRBG14, "grbg14le" },
> +	{ formats::SRGGB14, "rggb14le" },
> +	{ formats::SBGGR16, "bggr16le" },
> +	{ formats::SGBRG16, "gbrg16le" },
> +	{ formats::SGRBG16, "grbg16le" },
> +	{ formats::SRGGB16, "rggb16le" },
> +};
> +
> +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
> +
>  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";
> -	case formats::SBGGR10:
> -		return "bggr10le";
> -	case formats::SGBRG10:
> -		return "gbrg10le";
> -	case formats::SGRBG10:
> -		return "grbg10le";
> -	case formats::SRGGB10:
> -		return "rggb10le";
> -	case formats::SBGGR12:
> -		return "bggr12le";
> -	case formats::SGBRG12:
> -		return "gbrg12le";
> -	case formats::SGRBG12:
> -		return "grbg12le";
> -	case formats::SRGGB12:
> -		return "rggb12le";
> -	case formats::SBGGR14:
> -		return "bggr14le";
> -	case formats::SGBRG14:
> -		return "gbrg14le";
> -	case formats::SGRBG14:
> -		return "grbg14le";
> -	case formats::SRGGB14:
> -		return "rggb14le";
> -	case formats::SBGGR16:
> -		return "bggr16le";
> -	case formats::SGBRG16:
> -		return "gbrg16le";
> -	case formats::SGRBG16:
> -		return "grbg16le";
> -	case formats::SRGGB16:
> -		return "rggb16le";
> +	for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {
> +		if ((uint32_t)bayer_formats[i].format == (uint32_t)format)
> +			return bayer_formats[i].name;
>  	}

  for (auto &f : bayer_formats)

And then `ARRAY_SIZE()` is not needed. Same below.


>  	return NULL;
>  }
> 
> +static PixelFormat
> +bayer_format_from_string(const gchar *name)
> +{
> +	for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {
> +		if (strcmp(bayer_formats[i].name, name) == 0)
> +			return bayer_formats[i].format;
> +	}
> +	return PixelFormat{};
> +}
> +
>  static GstStructure *
>  bare_structure_from_format(const PixelFormat &format)
>  {
> @@ -474,6 +474,9 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,
>  		const gchar *format = gst_structure_get_string(s, "format");
>  		gst_format = gst_video_format_from_string(format);
>  		stream_cfg.pixelFormat = gst_format_to_pixel_format(gst_format);
> +	} else if (gst_structure_has_name(s, "video/x-bayer")) {
> +		const gchar *format = gst_structure_get_string(s, "format");
> +		stream_cfg.pixelFormat = bayer_format_from_string(format);
>  	} else if (gst_structure_has_name(s, "image/jpeg")) {
>  		stream_cfg.pixelFormat = formats::MJPEG;
>  	} else {
> --
> 2.34.1
> 
> 


Regards,
Barnabás Pőcze
Nicolas Dufresne Oct. 31, 2024, 1:38 p.m. UTC | #2
Hi,

Le jeudi 31 octobre 2024 à 10:11 +0100, mailinglist1@johanneskirchmair.de a
écrit :
> From: Johannes Kirchmair <johannes.kirchmair@skidata.com>
> 
> The parsing of video/x-bayer sources from string makes is possible to
> use cameras providing e.g SGRBG8 streams via gst-launch.

I didn't have enough time to review V1 (timezone), please have a look at my V1
review and provide a V3.

regards,
Nicolas

> 
> Like:
> gst-launch-1.0 libcamerasrc camera-name=<cam> ! video/x-bayer,format=grbg
> 
> Without this change the gstreamer plugin complains about "Unsupported
> media type: video/x-bayer".
> 
> Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>
> 
> Changes in v2:
> - Coding style changes
> - Removed printf that slipped in
> ---
>  src/gstreamer/gstlibcamera-utils.cpp | 85 ++++++++++++++--------------
>  1 file changed, 44 insertions(+), 41 deletions(-)
> 
> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> index 79f71246..80631295 100644
> --- a/src/gstreamer/gstlibcamera-utils.cpp
> +++ b/src/gstreamer/gstlibcamera-utils.cpp
> @@ -254,54 +254,54 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)
>  	return PixelFormat{};
>  }
>  
> +static struct {
> +	PixelFormat format;
> +	const gchar *name;
> +} bayer_formats[]{
> +	{ formats::SBGGR8, "bggr" },
> +	{ formats::SGBRG8, "gbrg" },
> +	{ formats::SGRBG8, "grbg" },
> +	{ formats::SRGGB8, "rggb" },
> +	{ formats::SBGGR10, "bggr10le" },
> +	{ formats::SGBRG10, "gbrg10le" },
> +	{ formats::SGRBG10, "grbg10le" },
> +	{ formats::SRGGB10, "rggb10le" },
> +	{ formats::SBGGR12, "bggr12le" },
> +	{ formats::SGBRG12, "gbrg12le" },
> +	{ formats::SGRBG12, "grbg12le" },
> +	{ formats::SRGGB12, "rggb12le" },
> +	{ formats::SBGGR14, "bggr14le" },
> +	{ formats::SGBRG14, "gbrg14le" },
> +	{ formats::SGRBG14, "grbg14le" },
> +	{ formats::SRGGB14, "rggb14le" },
> +	{ formats::SBGGR16, "bggr16le" },
> +	{ formats::SGBRG16, "gbrg16le" },
> +	{ formats::SGRBG16, "grbg16le" },
> +	{ formats::SRGGB16, "rggb16le" },
> +};
> +
> +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
> +
>  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";
> -	case formats::SBGGR10:
> -		return "bggr10le";
> -	case formats::SGBRG10:
> -		return "gbrg10le";
> -	case formats::SGRBG10:
> -		return "grbg10le";
> -	case formats::SRGGB10:
> -		return "rggb10le";
> -	case formats::SBGGR12:
> -		return "bggr12le";
> -	case formats::SGBRG12:
> -		return "gbrg12le";
> -	case formats::SGRBG12:
> -		return "grbg12le";
> -	case formats::SRGGB12:
> -		return "rggb12le";
> -	case formats::SBGGR14:
> -		return "bggr14le";
> -	case formats::SGBRG14:
> -		return "gbrg14le";
> -	case formats::SGRBG14:
> -		return "grbg14le";
> -	case formats::SRGGB14:
> -		return "rggb14le";
> -	case formats::SBGGR16:
> -		return "bggr16le";
> -	case formats::SGBRG16:
> -		return "gbrg16le";
> -	case formats::SGRBG16:
> -		return "grbg16le";
> -	case formats::SRGGB16:
> -		return "rggb16le";
> +	for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {
> +		if ((uint32_t)bayer_formats[i].format == (uint32_t)format)
> +			return bayer_formats[i].name;
>  	}
>  	return NULL;
>  }
>  
> +static PixelFormat
> +bayer_format_from_string(const gchar *name)
> +{
> +	for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {
> +		if (strcmp(bayer_formats[i].name, name) == 0)
> +			return bayer_formats[i].format;
> +	}
> +	return PixelFormat{};
> +}
> +
>  static GstStructure *
>  bare_structure_from_format(const PixelFormat &format)
>  {
> @@ -474,6 +474,9 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,
>  		const gchar *format = gst_structure_get_string(s, "format");
>  		gst_format = gst_video_format_from_string(format);
>  		stream_cfg.pixelFormat = gst_format_to_pixel_format(gst_format);
> +	} else if (gst_structure_has_name(s, "video/x-bayer")) {
> +		const gchar *format = gst_structure_get_string(s, "format");
> +		stream_cfg.pixelFormat = bayer_format_from_string(format);
>  	} else if (gst_structure_has_name(s, "image/jpeg")) {
>  		stream_cfg.pixelFormat = formats::MJPEG;
>  	} else {

Patch
diff mbox series

diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
index 79f71246..80631295 100644
--- a/src/gstreamer/gstlibcamera-utils.cpp
+++ b/src/gstreamer/gstlibcamera-utils.cpp
@@ -254,54 +254,54 @@  gst_format_to_pixel_format(GstVideoFormat gst_format)
 	return PixelFormat{};
 }
 
+static struct {
+	PixelFormat format;
+	const gchar *name;
+} bayer_formats[]{
+	{ formats::SBGGR8, "bggr" },
+	{ formats::SGBRG8, "gbrg" },
+	{ formats::SGRBG8, "grbg" },
+	{ formats::SRGGB8, "rggb" },
+	{ formats::SBGGR10, "bggr10le" },
+	{ formats::SGBRG10, "gbrg10le" },
+	{ formats::SGRBG10, "grbg10le" },
+	{ formats::SRGGB10, "rggb10le" },
+	{ formats::SBGGR12, "bggr12le" },
+	{ formats::SGBRG12, "gbrg12le" },
+	{ formats::SGRBG12, "grbg12le" },
+	{ formats::SRGGB12, "rggb12le" },
+	{ formats::SBGGR14, "bggr14le" },
+	{ formats::SGBRG14, "gbrg14le" },
+	{ formats::SGRBG14, "grbg14le" },
+	{ formats::SRGGB14, "rggb14le" },
+	{ formats::SBGGR16, "bggr16le" },
+	{ formats::SGBRG16, "gbrg16le" },
+	{ formats::SGRBG16, "grbg16le" },
+	{ formats::SRGGB16, "rggb16le" },
+};
+
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+
 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";
-	case formats::SBGGR10:
-		return "bggr10le";
-	case formats::SGBRG10:
-		return "gbrg10le";
-	case formats::SGRBG10:
-		return "grbg10le";
-	case formats::SRGGB10:
-		return "rggb10le";
-	case formats::SBGGR12:
-		return "bggr12le";
-	case formats::SGBRG12:
-		return "gbrg12le";
-	case formats::SGRBG12:
-		return "grbg12le";
-	case formats::SRGGB12:
-		return "rggb12le";
-	case formats::SBGGR14:
-		return "bggr14le";
-	case formats::SGBRG14:
-		return "gbrg14le";
-	case formats::SGRBG14:
-		return "grbg14le";
-	case formats::SRGGB14:
-		return "rggb14le";
-	case formats::SBGGR16:
-		return "bggr16le";
-	case formats::SGBRG16:
-		return "gbrg16le";
-	case formats::SGRBG16:
-		return "grbg16le";
-	case formats::SRGGB16:
-		return "rggb16le";
+	for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {
+		if ((uint32_t)bayer_formats[i].format == (uint32_t)format)
+			return bayer_formats[i].name;
 	}
 	return NULL;
 }
 
+static PixelFormat
+bayer_format_from_string(const gchar *name)
+{
+	for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {
+		if (strcmp(bayer_formats[i].name, name) == 0)
+			return bayer_formats[i].format;
+	}
+	return PixelFormat{};
+}
+
 static GstStructure *
 bare_structure_from_format(const PixelFormat &format)
 {
@@ -474,6 +474,9 @@  gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,
 		const gchar *format = gst_structure_get_string(s, "format");
 		gst_format = gst_video_format_from_string(format);
 		stream_cfg.pixelFormat = gst_format_to_pixel_format(gst_format);
+	} else if (gst_structure_has_name(s, "video/x-bayer")) {
+		const gchar *format = gst_structure_get_string(s, "format");
+		stream_cfg.pixelFormat = bayer_format_from_string(format);
 	} else if (gst_structure_has_name(s, "image/jpeg")) {
 		stream_cfg.pixelFormat = formats::MJPEG;
 	} else {