[libcamera-devel] libcamerasrc on librem 5: bayer support missing

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Dec 21 13:53:36 CET 2022


Quoting Pavel Machek via libcamera-devel (2022-12-20 22:13:26)
> Hi!
> 
> > > This gets me going. I don't know how to pass details of bayer format,
> > > so help would be welcome there.
> > 
> > 
> >       video/x-bayer
> >                  format: { (string)bggr, (string)grbg, (string)gbrg, (string)rggb }
> > 
> > 
> > So in you case, create caps that looks like video/x-bayer, format=grbg, width=X,
> > height=Y. Stride must match the Width * 4, cause there is no custom stride
> > support yet.
> 
> Thanks for the hints. Should I add support for other bayer8 formats
> and submit it for merge?

If you can get it working and tested - yes please?!

> 
> Best regards,
>                                                                         Pavel
> 
> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> index 36b9564c..7f45f4e7 100644
> --- a/src/gstreamer/gstlibcamera-utils.cpp
> +++ b/src/gstreamer/gstlibcamera-utils.cpp
> @@ -55,6 +55,10 @@ static struct {
>         { GST_VIDEO_FORMAT_YUY2, formats::YUYV },
>         { GST_VIDEO_FORMAT_YVYU, formats::YVYU },
>  
> +       /* Lie about bayer */
> +       { GST_VIDEO_FORMAT_ENCODED, formats::SGRBG8 },
> +
> +
>         /* \todo NV42 is used in libcamera but is not mapped in GStreamer yet. */
>  };
>  
> @@ -228,11 +232,23 @@ 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";

I expect this string needs to mention that it's 8 bit. There could be
10bit, 12bit, 14bit, 16bit variations of this ...


> +       }
> +       return NULL;
> +}
> +
>  static GstStructure *
>  bare_structure_from_format(const PixelFormat &format)
>  {
>         GstVideoFormat gst_format = pixel_format_to_gst_format(format);
>  
> +       printf("bare_structure_from_format: XXX\n");
> +
>         if (gst_format == GST_VIDEO_FORMAT_UNKNOWN)
>                 return nullptr;
>  
> @@ -243,6 +259,9 @@ bare_structure_from_format(const PixelFormat &format)
>         switch (format) {
>         case formats::MJPEG:
>                 return gst_structure_new_empty("image/jpeg");
> +       case formats::SGRBG8:
> +               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")

If this is a prioritised list, I expect x-bayer should be after jpeg?
But I'm not sure if it is...

And I wonder if the caps should be determined from the camera device anyway?

>  
>  /* For the simple case, we have a src pad that is always present. */
>  GstStaticPadTemplate src_template = {
> 
> -- 
> People of Russia, stop Putin before his war on Ukraine escalates.


More information about the libcamera-devel mailing list