[libcamera-devel] [PATCHv2] gstreamer: Add bayer8 support to libcamerasrc element

Nicolas Dufresne nicolas at ndufresne.ca
Sat Dec 24 14:29:49 CET 2022


Le sam. 24 déc. 2022, 05 h 12, Rafael Diniz <rafael at riseup.net> a écrit :

> Hi Pavel and all,
>
> Do you have a sample gst-lauch line which forces bayer format in order I
> can test this also in the PinePhone 1?
>

I can't test, but this should do:

gst-launch-1.0 libcamerasrc ! bayer2rgb ! glimagesink

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.

best wishes,
Nicolas


> Rafael
>
> On 12/23/22 20:23, Pavel Machek via libcamera-devel wrote:
> > 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 libcamerasrc element.
> >
> > Signed-off-by: Pavel Machek <pavel at ucw.cz>
> > Reviewed-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> >
> > --
> >
> > Thanks for the review!
> >
> > 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..a10cbd4f 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; image/jpeg;
> video/x-bayer")
> >
> >   /* For the simple case, we have a src pad that is always present. */
> >   GstStaticPadTemplate src_template = {
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20221224/26d14698/attachment.htm>


More information about the libcamera-devel mailing list