<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le sam. 24 déc. 2022, 05 h 12, Rafael Diniz <<a href="mailto:rafael@riseup.net">rafael@riseup.net</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Pavel and all,<br>
<br>
Do you have a sample gst-lauch line which forces bayer format in order I <br>
can test this also in the PinePhone 1?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I can't test, but this should do:</div><div dir="auto"><br></div><div dir="auto">gst-launch-1.0 libcamerasrc ! bayer2rgb ! glimagesink</div><div dir="auto"><br></div><div dir="auto">The bayer2rgb template caps will serve as a filter, like a jpeg decoder would force jpeg. But if needed, video/x-bayer is the filter you need.</div><div dir="auto"><br></div><div dir="auto">best wishes,</div><div dir="auto">Nicolas</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Rafael<br>
<br>
On 12/23/22 20:23, Pavel Machek via libcamera-devel wrote:<br>
> Bayer8 support is useful on hardware such as Librem 5, as GStreamer<br>
> provides easy solution for debayering and display of the camera<br>
> data. Add neccessary glue to libcamerasrc element.<br>
> <br>
> Signed-off-by: Pavel Machek <<a href="mailto:pavel@ucw.cz" target="_blank" rel="noreferrer">pavel@ucw.cz</a>><br>
> Reviewed-by: Nicolas Dufresne <<a href="mailto:nicolas.dufresne@collabora.com" target="_blank" rel="noreferrer">nicolas.dufresne@collabora.com</a>><br>
> <br>
> --<br>
> <br>
> Thanks for the review!<br>
> <br>
> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp<br>
> index 36b9564c..b2cc7661 100644<br>
> --- a/src/gstreamer/gstlibcamera-utils.cpp<br>
> +++ b/src/gstreamer/gstlibcamera-utils.cpp<br>
> @@ -20,6 +20,12 @@ static struct {<br>
> /* Compressed */<br>
> { GST_VIDEO_FORMAT_ENCODED, formats::MJPEG },<br>
> <br>
> + /* Bayer formats, gstreamer only supports 8-bit */<br>
> + { GST_VIDEO_FORMAT_ENCODED, formats::SGRBG8 },<br>
> + { GST_VIDEO_FORMAT_ENCODED, formats::SGBRG8 },<br>
> + { GST_VIDEO_FORMAT_ENCODED, formats::SRGGB8 },<br>
> + { GST_VIDEO_FORMAT_ENCODED, formats::SBGGR8 },<br>
> +<br>
> /* RGB16 */<br>
> { GST_VIDEO_FORMAT_RGB16, formats::RGB565 },<br>
> <br>
> @@ -228,6 +234,22 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)<br>
> return PixelFormat{};<br>
> }<br>
> <br>
> +static const gchar *<br>
> +bayer_format_to_string(int format)<br>
> +{<br>
> + switch (format) {<br>
> + case formats::SGRBG8:<br>
> + return "grbg";<br>
> + case formats::SGBRG8:<br>
> + return "gbrg";<br>
> + case formats::SRGGB8:<br>
> + return "rggb";<br>
> + case formats::SBGGR8:<br>
> + return "bggr";<br>
> + }<br>
> + return NULL;<br>
> +}<br>
> +<br>
> static GstStructure *<br>
> bare_structure_from_format(const PixelFormat &format)<br>
> {<br>
> @@ -243,6 +265,12 @@ bare_structure_from_format(const PixelFormat &format)<br>
> switch (format) {<br>
> case formats::MJPEG:<br>
> return gst_structure_new_empty("image/jpeg");<br>
> + case formats::SGRBG8:<br>
> + case formats::SGBRG8:<br>
> + case formats::SRGGB8:<br>
> + case formats::SBGGR8:<br>
> + return gst_structure_new("video/x-bayer", "format", G_TYPE_STRING,<br>
> + bayer_format_to_string(format), nullptr);<br>
> default:<br>
> return nullptr;<br>
> }<br>
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp<br>
> index 8d97d7c2..a10cbd4f 100644<br>
> --- a/src/gstreamer/gstlibcamerasrc.cpp<br>
> +++ b/src/gstreamer/gstlibcamerasrc.cpp<br>
> @@ -161,7 +161,7 @@ G_DEFINE_TYPE_WITH_CODE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT,<br>
> GST_DEBUG_CATEGORY_INIT(source_debug, "libcamerasrc", 0,<br>
> "libcamera Source"))<br>
> <br>
> -#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; image/jpeg")<br>
> +#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; image/jpeg; video/x-bayer")<br>
> <br>
> /* For the simple case, we have a src pad that is always present. */<br>
> GstStaticPadTemplate src_template = {<br>
> <br>
</blockquote></div></div></div>