[{"id":31975,"web_url":"https://patchwork.libcamera.org/comment/31975/","msgid":"<173036403908.2721096.3018107445838073374@ping.linuxembedded.co.uk>","date":"2024-10-31T08:40:39","subject":"Re: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Johannes,\n\nQuoting mailinglist1@johanneskirchmair.de (2024-10-31 08:16:45)\n> From: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> \n> The parsing of video/x-bayer sources from string makes is possible to\n> use cameras providing e.g SGRBG8 streams via gst-launch.\n> \n> Like:\n> gst-launch-1.0 libcamerasrc camera-name=<cam> ! video/x-bayer,format=grbg\n> \n> Without this change the gstreamer plugin complains about \"Unsupported\n> media type: video/x-bayer\".\n> \n> Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n\nThanks, this sounds like a good improvement!\n\n\n> ---\n>  src/gstreamer/gstlibcamera-utils.cpp | 90 ++++++++++++++--------------\n>  1 file changed, 46 insertions(+), 44 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index 79f71246..472367f2 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -254,54 +254,53 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)\n>         return PixelFormat{};\n>  }\n>  \n> +static struct {\n> +       PixelFormat format;\n> +       const gchar *name;\n> +} bayer_formats[]{\n> +       { formats::SBGGR8, \"bggr\" },\n> +       { formats::SGBRG8, \"gbrg\" },\n> +       { formats::SGRBG8, \"grbg\" },\n> +       { formats::SRGGB8, \"rggb\" },\n> +       { formats::SBGGR10, \"bggr10le\" },\n> +       { formats::SGBRG10, \"gbrg10le\" },\n> +       { formats::SGRBG10, \"grbg10le\" },\n> +       { formats::SRGGB10, \"rggb10le\" },\n> +       { formats::SBGGR12, \"bggr12le\" },\n> +       { formats::SGBRG12, \"gbrg12le\" },\n> +       { formats::SGRBG12, \"grbg12le\" },\n> +       { formats::SRGGB12, \"rggb12le\" },\n> +       { formats::SBGGR14, \"bggr14le\" },\n> +       { formats::SGBRG14, \"gbrg14le\" },\n> +       { formats::SGRBG14, \"grbg14le\" },\n> +       { formats::SRGGB14, \"rggb14le\" },\n> +       { formats::SBGGR16, \"bggr16le\" },\n> +       { formats::SGBRG16, \"gbrg16le\" },\n> +       { formats::SGRBG16, \"grbg16le\" },\n> +       { formats::SRGGB16, \"rggb16le\" },\n> +};\n\nI see we already have format_map[] defining a large part of this table.\n\nBut aside from additions to bayer2rgb and rgb2bayer, I don't see\nanything defining a specific GST_VIDEO_ type for bayer formats so it\nseems like this might be the cleanest way to handle this for now...\n\nHave you tested that this interacts correctly with the bayer2rgb\nelement?\n\n> +\n> +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))\n> +\n>  static const gchar *\n>  bayer_format_to_string(int format)\n>  {\n> -       switch (format) {\n> -       case formats::SBGGR8:\n> -               return \"bggr\";\n> -       case formats::SGBRG8:\n> -               return \"gbrg\";\n> -       case formats::SGRBG8:\n> -               return \"grbg\";\n> -       case formats::SRGGB8:\n> -               return \"rggb\";\n> -       case formats::SBGGR10:\n> -               return \"bggr10le\";\n> -       case formats::SGBRG10:\n> -               return \"gbrg10le\";\n> -       case formats::SGRBG10:\n> -               return \"grbg10le\";\n> -       case formats::SRGGB10:\n> -               return \"rggb10le\";\n> -       case formats::SBGGR12:\n> -               return \"bggr12le\";\n> -       case formats::SGBRG12:\n> -               return \"gbrg12le\";\n> -       case formats::SGRBG12:\n> -               return \"grbg12le\";\n> -       case formats::SRGGB12:\n> -               return \"rggb12le\";\n> -       case formats::SBGGR14:\n> -               return \"bggr14le\";\n> -       case formats::SGBRG14:\n> -               return \"gbrg14le\";\n> -       case formats::SGRBG14:\n> -               return \"grbg14le\";\n> -       case formats::SRGGB14:\n> -               return \"rggb14le\";\n> -       case formats::SBGGR16:\n> -               return \"bggr16le\";\n> -       case formats::SGBRG16:\n> -               return \"gbrg16le\";\n> -       case formats::SGRBG16:\n> -               return \"grbg16le\";\n> -       case formats::SRGGB16:\n> -               return \"rggb16le\";\n> +       for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> +               if ((uint32_t)bayer_formats[i].format == (uint32_t)format)\n> +                       return bayer_formats[i].name;\n>         }\n>         return NULL;\n>  }\n>  \n> +static PixelFormat bayer_format_from_string(const gchar *name)\n\nLooking at the existing coding style throughout this file, i think this\nshould be:\n\nstatic PixelFormat\nbayer_format_from_string(const gchar *name)\n\n...\n\n\n> +{\n> +       for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> +               if (strcmp(bayer_formats[i].name, name) == 0)\n> +                       return bayer_formats[i].format;\n> +       }\n> +       return PixelFormat{};\n> +}\n> +\n>  static GstStructure *\n>  bare_structure_from_format(const PixelFormat &format)\n>  {\n> @@ -407,9 +406,8 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n>         return caps;\n>  }\n>  \n> -void\n> -gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n> -                                        GstCaps *caps)\n> +void gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n> +                                             GstCaps *caps)\n\nAnd this shouldn't be changed.\n\n\n>  {\n>         GstVideoFormat gst_format = pixel_format_to_gst_format(stream_cfg.pixelFormat);\n>         guint i;\n> @@ -469,11 +467,15 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n>                 gst_structure_fixate_field_string(s, \"format\", format);\n>         }\n>  \n> +       printf(\"in the function!!!!!!\");\n\nAnd I think we need to remove this too ...\n\n--\nRegards\n\nKieran\n\n\n>         /* Then configure the stream with the result. */\n>         if (gst_structure_has_name(s, \"video/x-raw\")) {\n>                 const gchar *format = gst_structure_get_string(s, \"format\");\n>                 gst_format = gst_video_format_from_string(format);\n>                 stream_cfg.pixelFormat = gst_format_to_pixel_format(gst_format);\n> +       } else if (gst_structure_has_name(s, \"video/x-bayer\")) {\n> +               const gchar *format = gst_structure_get_string(s, \"format\");\n> +               stream_cfg.pixelFormat = bayer_format_from_string(format);\n>         } else if (gst_structure_has_name(s, \"image/jpeg\")) {\n>                 stream_cfg.pixelFormat = formats::MJPEG;\n>         } else {\n> -- \n> 2.34.1\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 730DFC3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 31 Oct 2024 08:40:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 81943653A8;\n\tThu, 31 Oct 2024 09:40:43 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A9A50618BF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Oct 2024 09:40:42 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BD18E9EC;\n\tThu, 31 Oct 2024 09:40:38 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Ny033akb\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1730364038;\n\tbh=a8mAzh2E7zNnPtiI7LIfCFbq2gHCXA0wtd9IdKeCzDk=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Ny033akbMJAvuTVY971Bf5okGeTIX93L3e8wENVHxRLR3HnY+lm1ArgzgP2ro4duN\n\thQGDxnqvU22n8TzYIXn4JjxTfMuL1BFtP5uXfe+013pV5KVGdz8iXJEsVeL7ouCTPB\n\t7zwbjsjA9q8C4XGNsFIZokGQcykVpln8q5ytiFdI=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20241031081645.302543-1-mailinglist1@johanneskirchmair.de>","References":"<20241031081645.302543-1-mailinglist1@johanneskirchmair.de>","Subject":"Re: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"johannes.kirchmair@skidata.com, nicolas.dufresne@collabora.com,\n\tpavel@ucw.cz","To":"libcamera-devel@lists.libcamera.org, mailinglist1@johanneskirchmair.de","Date":"Thu, 31 Oct 2024 08:40:39 +0000","Message-ID":"<173036403908.2721096.3018107445838073374@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":31977,"web_url":"https://patchwork.libcamera.org/comment/31977/","msgid":"<GVAP278MB04566EB4737BA306B3C6A3088C552@GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM>","date":"2024-10-31T09:06:14","subject":"AW: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","submitter":{"id":213,"url":"https://patchwork.libcamera.org/api/people/213/","name":"Johannes Kirchmair - SKIDATA","email":"johannes.kirchmair@skidata.com"},"content":"Hi Kieran,\n\n> -----Ursprüngliche Nachricht-----\n> Von: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Gesendet: Donnerstag, 31. Oktober 2024 09:41\n> An: libcamera-devel@lists.libcamera.org; mailinglist1@johanneskirchmair.de\n> Cc: Johannes Kirchmair - SKIDATA <johannes.kirchmair@skidata.com>;\n> nicolas.dufresne@collabora.com; pavel@ucw.cz\n> Betreff: Re: [PATCH] gstreamer:Implement caps parsing for video/x-bayer\n> \n> [Sie erhalten nicht häufig E-Mails von kieran.bingham@ideasonboard.com.\n> Weitere Informationen, warum dies wichtig ist, finden Sie unter\n> https://aka.ms/LearnAboutSenderIdentification ]\n> \n> Caution: This is an external email, please take care when clicking links or\n> opening attachments\n> \n> Hi Johannes,\n> \n> Quoting mailinglist1@johanneskirchmair.de (2024-10-31 08:16:45)\n> > From: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> >\n> > The parsing of video/x-bayer sources from string makes is possible to\n> > use cameras providing e.g SGRBG8 streams via gst-launch.\n> >\n> > Like:\n> > gst-launch-1.0 libcamerasrc camera-name=<cam> !\n> > video/x-bayer,format=grbg\n> >\n> > Without this change the gstreamer plugin complains about \"Unsupported\n> > media type: video/x-bayer\".\n> >\n> > Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> \n> Thanks, this sounds like a good improvement!\n> \n> \n> > ---\n> >  src/gstreamer/gstlibcamera-utils.cpp | 90\n> > ++++++++++++++--------------\n> >  1 file changed, 46 insertions(+), 44 deletions(-)\n> >\n> > diff --git a/src/gstreamer/gstlibcamera-utils.cpp\n> > b/src/gstreamer/gstlibcamera-utils.cpp\n> > index 79f71246..472367f2 100644\n> > --- a/src/gstreamer/gstlibcamera-utils.cpp\n> > +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> > @@ -254,54 +254,53 @@ gst_format_to_pixel_format(GstVideoFormat\n> gst_format)\n> >         return PixelFormat{};\n> >  }\n> >\n> > +static struct {\n> > +       PixelFormat format;\n> > +       const gchar *name;\n> > +} bayer_formats[]{\n> > +       { formats::SBGGR8, \"bggr\" },\n> > +       { formats::SGBRG8, \"gbrg\" },\n> > +       { formats::SGRBG8, \"grbg\" },\n> > +       { formats::SRGGB8, \"rggb\" },\n> > +       { formats::SBGGR10, \"bggr10le\" },\n> > +       { formats::SGBRG10, \"gbrg10le\" },\n> > +       { formats::SGRBG10, \"grbg10le\" },\n> > +       { formats::SRGGB10, \"rggb10le\" },\n> > +       { formats::SBGGR12, \"bggr12le\" },\n> > +       { formats::SGBRG12, \"gbrg12le\" },\n> > +       { formats::SGRBG12, \"grbg12le\" },\n> > +       { formats::SRGGB12, \"rggb12le\" },\n> > +       { formats::SBGGR14, \"bggr14le\" },\n> > +       { formats::SGBRG14, \"gbrg14le\" },\n> > +       { formats::SGRBG14, \"grbg14le\" },\n> > +       { formats::SRGGB14, \"rggb14le\" },\n> > +       { formats::SBGGR16, \"bggr16le\" },\n> > +       { formats::SGBRG16, \"gbrg16le\" },\n> > +       { formats::SGRBG16, \"grbg16le\" },\n> > +       { formats::SRGGB16, \"rggb16le\" }, };\n> \n> I see we already have format_map[] defining a large part of this table.\n> \n> But aside from additions to bayer2rgb and rgb2bayer, I don't see anything\n> defining a specific GST_VIDEO_ type for bayer formats so it seems like this\n> might be the cleanest way to handle this for now...\n> \n> Have you tested that this interacts correctly with the bayer2rgb element?\nYes, I tested it with the bayer2rgb element but had video/x-bayer in between for some stream settings.\n\n> \n> > +\n> > +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))\n> > +\n> >  static const gchar *\n> >  bayer_format_to_string(int format)\n> >  {\n> > -       switch (format) {\n> > -       case formats::SBGGR8:\n> > -               return \"bggr\";\n> > -       case formats::SGBRG8:\n> > -               return \"gbrg\";\n> > -       case formats::SGRBG8:\n> > -               return \"grbg\";\n> > -       case formats::SRGGB8:\n> > -               return \"rggb\";\n> > -       case formats::SBGGR10:\n> > -               return \"bggr10le\";\n> > -       case formats::SGBRG10:\n> > -               return \"gbrg10le\";\n> > -       case formats::SGRBG10:\n> > -               return \"grbg10le\";\n> > -       case formats::SRGGB10:\n> > -               return \"rggb10le\";\n> > -       case formats::SBGGR12:\n> > -               return \"bggr12le\";\n> > -       case formats::SGBRG12:\n> > -               return \"gbrg12le\";\n> > -       case formats::SGRBG12:\n> > -               return \"grbg12le\";\n> > -       case formats::SRGGB12:\n> > -               return \"rggb12le\";\n> > -       case formats::SBGGR14:\n> > -               return \"bggr14le\";\n> > -       case formats::SGBRG14:\n> > -               return \"gbrg14le\";\n> > -       case formats::SGRBG14:\n> > -               return \"grbg14le\";\n> > -       case formats::SRGGB14:\n> > -               return \"rggb14le\";\n> > -       case formats::SBGGR16:\n> > -               return \"bggr16le\";\n> > -       case formats::SGBRG16:\n> > -               return \"gbrg16le\";\n> > -       case formats::SGRBG16:\n> > -               return \"grbg16le\";\n> > -       case formats::SRGGB16:\n> > -               return \"rggb16le\";\n> > +       for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> > +               if ((uint32_t)bayer_formats[i].format == (uint32_t)format)\n> > +                       return bayer_formats[i].name;\n> >         }\n> >         return NULL;\n> >  }\n> >\n> > +static PixelFormat bayer_format_from_string(const gchar *name)\n> \n> Looking at the existing coding style throughout this file, i think this should be:\n> \n> static PixelFormat\n> bayer_format_from_string(const gchar *name)\n> \n> ...\n> \n> \n> > +{\n> > +       for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> > +               if (strcmp(bayer_formats[i].name, name) == 0)\n> > +                       return bayer_formats[i].format;\n> > +       }\n> > +       return PixelFormat{};\n> > +}\n> > +\n> >  static GstStructure *\n> >  bare_structure_from_format(const PixelFormat &format)  { @@ -407,9\n> > +406,8 @@ gst_libcamera_stream_configuration_to_caps(const\n> StreamConfiguration &stream_cfg\n> >         return caps;\n> >  }\n> >\n> > -void\n> > -gst_libcamera_configure_stream_from_caps(StreamConfiguration\n> &stream_cfg,\n> > -                                        GstCaps *caps)\n> > +void gst_libcamera_configure_stream_from_caps(StreamConfiguration\n> &stream_cfg,\n> > +                                             GstCaps *caps)\n> \n> And this shouldn't be changed.\n> \n> \n> >  {\n> >         GstVideoFormat gst_format =\n> pixel_format_to_gst_format(stream_cfg.pixelFormat);\n> >         guint i;\n> > @@ -469,11 +467,15 @@\n> gst_libcamera_configure_stream_from_caps(StreamConfiguration\n> &stream_cfg,\n> >                 gst_structure_fixate_field_string(s, \"format\", format);\n> >         }\n> >\n> > +       printf(\"in the function!!!!!!\");\n> \n> And I think we need to remove this too ...\nUps :-/\n\nI will send v2 soon.\nRegards Johannes\n> \n> --\n> Regards\n> \n> Kieran\n> \n> \n> >         /* Then configure the stream with the result. */\n> >         if (gst_structure_has_name(s, \"video/x-raw\")) {\n> >                 const gchar *format = gst_structure_get_string(s, \"format\");\n> >                 gst_format = gst_video_format_from_string(format);\n> >                 stream_cfg.pixelFormat =\n> > gst_format_to_pixel_format(gst_format);\n> > +       } else if (gst_structure_has_name(s, \"video/x-bayer\")) {\n> > +               const gchar *format = gst_structure_get_string(s, \"format\");\n> > +               stream_cfg.pixelFormat =\n> > + bayer_format_from_string(format);\n> >         } else if (gst_structure_has_name(s, \"image/jpeg\")) {\n> >                 stream_cfg.pixelFormat = formats::MJPEG;\n> >         } else {\n> > --\n> > 2.34.1\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 43AA4C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 31 Oct 2024 09:14:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C23C3653A6;\n\tThu, 31 Oct 2024 10:14:36 +0100 (CET)","from ZRZP278CU001.outbound.protection.outlook.com\n\t(mail-switzerlandnorthazlp170110002.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f403:c213::2])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 60818618BF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Oct 2024 10:06:17 +0100 (CET)","from GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM (2603:10a6:710:39::5)\n\tby\n\tGV0P278MB1125.CHEP278.PROD.OUTLOOK.COM (2603:10a6:710:4d::8) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.8093.32; Thu, 31 Oct 2024 09:06:14 +0000","from GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM\n\t([fe80::f5f4:4769:5e87:a09c]) by\n\tGVAP278MB0456.CHEP278.PROD.OUTLOOK.COM\n\t([fe80::f5f4:4769:5e87:a09c%7]) with mapi id 15.20.8114.020;\n\tThu, 31 Oct 2024 09:06:14 +0000"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=skidata.com header.i=@skidata.com\n\theader.b=\"j8i6ThxQ\"; dkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=skidata.com;"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n\tb=v/OxAuM2CRtFrHJ1me6vA1ymbF68UbOHk/dbgvBjrEgApKMWf/TEbQHolybRNEhpMD/7wE2HfeKGQdhlqp7favxyVR41eF7OBiITSSg+Q8dqNlAosQcggrvjr75OcQz5zAv4wuZj7gC6M6wqPfCRXS7s4JKs0KoRG/6GT0QB8sSoYkGO9xWZDhTVzBH6dL/uZc/OjflWCaEAK9IjX2myqwjGKaBdfcsoBYMhM7/caxDjuF0Ou269F2h8oegTCxdK2psy2sghnGUe/xuKuh71jA6p43sqXX/dFOppeLrb7hbOske3ujohHjcNC5PVjw3gx3fIRMm8HLaj3wn9ygu2Hw==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n\ts=arcselector10001;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n\tbh=Xvu/WBdYlOjzDYHvzYmjIK6zH9uKK8MJQEUf8ou51+Q=;\n\tb=btG/GysBXNFT5QcQxs3wYsfT8PX0B+fG96PRg2M1UmGzyDzG+vK/vYnTXnfzI5/9nuHK8etUr3qk9sfyPyJfAUaVposN6E8rTcwO9542ta/H1wttmny2Ws45IahvAeQdkSabFo+QL1vmrv3nPJ58adsYZge1NmihKyHIfuu3h2KB7Wglog/dKohH2K+9FqQouZINI4yZcRLMKc4SsYbfMGiZAuxGMZlIdHezspy6EzzPXkA7+MFcGKPG+OuxxsWuvkKCQmzLmBzyqgzN2wSsjSughWtsuZUV57G3ObJJeQRzpvE9sGZr5KsD7oiuwBLN8GnrIBKLGCpwGBR7+Qh3/Q==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n\tsmtp.mailfrom=skidata.com;\n\tdmarc=pass action=none header.from=skidata.com; \n\tdkim=pass header.d=skidata.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=skidata.com;\n\ts=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=Xvu/WBdYlOjzDYHvzYmjIK6zH9uKK8MJQEUf8ou51+Q=;\n\tb=j8i6ThxQnOaecQ+Jox093Rh7rW+gKPFbFtEl55OPJ0nuSeumUJxJFRjHWIph3JRZge0q0m2h1OYWKUROo1Qwd5XkSc/5pjJl64kT0GdgSBC4g9KGR7W3ytGUxVcp+6tO+XbimiiSBLj3me38CqTyRTkr7bQsDfvo47ZCgzkcMM9rVII6YZy486Ib8rZcq5NGuPiexTkKt4I4F4D5VzBg281xMGHL6z/gkEGiE207KklEDJ8WkEZYwVVjEpFyVc4qQPLTUpi6lZC+RYeaO5Cpbd7v98BR8Y2M8TqxS32AHvs3o+JftZhSz9vH+MTsZuwkyE29ZutRvVWB0myjrZsU7A==","From":"Johannes Kirchmair - SKIDATA <johannes.kirchmair@skidata.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\t\"libcamera-devel@lists.libcamera.org\"\n\t<libcamera-devel@lists.libcamera.org>, \n\t\"mailinglist1@johanneskirchmair.de\" <mailinglist1@johanneskirchmair.de>","CC":"\"nicolas.dufresne@collabora.com\" <nicolas.dufresne@collabora.com>,\n\t\"pavel@ucw.cz\" <pavel@ucw.cz>","Subject":"AW: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","Thread-Topic":"[PATCH] gstreamer:Implement caps parsing for video/x-bayer","Thread-Index":"AQHbK21CsZYo68wn4US5zEDjLAVJhbKgikWAgAADwsA=","Date":"Thu, 31 Oct 2024 09:06:14 +0000","Message-ID":"<GVAP278MB04566EB4737BA306B3C6A3088C552@GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM>","References":"<20241031081645.302543-1-mailinglist1@johanneskirchmair.de>\n\t<173036403908.2721096.3018107445838073374@ping.linuxembedded.co.uk>","In-Reply-To":"<173036403908.2721096.3018107445838073374@ping.linuxembedded.co.uk>","Accept-Language":"de-DE, en-US","Content-Language":"de-DE","X-MS-Has-Attach":"","X-MS-TNEF-Correlator":"","x-bromium-msgid":"f9c599cb-fccd-474b-bedb-8f2dd76ede65","authentication-results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=skidata.com header.i=@skidata.com\n\theader.b=\"j8i6ThxQ\"; dkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=skidata.com;"],"x-ms-publictraffictype":"Email","x-ms-traffictypediagnostic":"GVAP278MB0456:EE_|GV0P278MB1125:EE_","x-ms-office365-filtering-correlation-id":"13ef6c2e-c599-4a26-c4cf-08dcf98b4592","x-ms-exchange-senderadcheck":"1","x-ms-exchange-antispam-relay":"0","x-microsoft-antispam":"BCL:0;\n\tARA:13230040|1800799024|376014|366016|38070700018; ","x-microsoft-antispam-message-info":"=?iso-8859-1?q?wv6EsacSnradGmlFnddPI+G?=\n\t=?iso-8859-1?q?tnANqmZpoM9wODA4GHSLafERN6tyNdMYdIHGAV1gCJDBfFCxdg9?=\n\t=?iso-8859-1?q?8z0v4tO3YR7YQtT1U693WVMWT4WvE67i5N2k9IB/xGbLWug6e6n?=\n\t=?iso-8859-1?q?RbjL4G4q//vJC8eI76OUd8aDfbkmUhph60gTE++ld9xrLpPSBIm?=\n\t=?iso-8859-1?q?e8CSpKJV+KWd4rYw+WuwcYQrdn671lY75br2z3R1V5GXY+7igVs?=\n\t=?iso-8859-1?q?pn9yIU49VbxykC4BGk28l0iByIhOh5qIce92GhCLZJpKZfJxSuG?=\n\t=?iso-8859-1?q?/A5LBKu2ph/nppMCksj9MyIvMpbowhzHNpkfwx3a/iMZXe5F4DQ?=\n\t=?iso-8859-1?q?YvFh1hM/1caubrvqF/MsQdgysZZuFXXajEi4Dt6m6I7u4HeYsu8?=\n\t=?iso-8859-1?q?oQzYDIRlJvzIZOo5Ts710+vvN90Y+R3ynbMT8fC5ySiQZ2OHHoA?=\n\t=?iso-8859-1?q?4UINJ4A2Rh8DUozjgA6z62v5SszH8LTmvtKA5gJ6LrDREIzqDce?=\n\t=?iso-8859-1?q?vBjSolPEShjW27kQwrXJJwiTXomS7AEQU4N9qBtpwxROJuCnwbC?=\n\t=?iso-8859-1?q?HDNu2vNtMc5dI6RjmQndX7oJW2AJHUY6HrPaRROGvleJMh1wbJo?=\n\t=?iso-8859-1?q?xMuqSBOoSrb2dhmp2c82xsHGZettnLPxjwdfAThO7qRRszZLL74?=\n\t=?iso-8859-1?q?8u52POvoWT5KAUOLr6k0UPvpuq13e+sWcX1uQf+3aIk7CYmQ9K9?=\n\t=?iso-8859-1?q?sDNjjKXHu9XNfI/6XdLOhG6ppZK+XxTQUnZfdQxarsn6VmYpChp?=\n\t=?iso-8859-1?q?38kYnkGQFGdSdh7ixFaOhf2ZkBI2yxbUAGD8fX6a/Oo6OZznXBr?=\n\t=?iso-8859-1?q?YdbZ2TFcZUkbF6spCe4u/YHU4JT8QeBpoN5RZO2vnwsvSAuI8og?=\n\t=?iso-8859-1?q?2fWUnEKFiCvlAGA9gUR9eHKSMRGlwQL0UMTAGVjb8KheuruipQw?=\n\t=?iso-8859-1?q?MGhORWRq6kjE9cQgYyrBdUbrKGVC28GHCnfcfOlCZ4jcplnkfLg?=\n\t=?iso-8859-1?q?scRbEcmGDJ68aM4Xca91n3UnjNhjU0xxHppkWmCFgiBoBct7Gql?=\n\t=?iso-8859-1?q?/dr9IfPhEmP0bxzuPrxgJJyaxKsrav2Vvk9gOS9ePYRH6SIZ32l?=\n\t=?iso-8859-1?q?TBR46BmKb05SZCoibxxOhuqx+HYrhH9vEnZHX01TQ99TDS/lvBA?=\n\t=?iso-8859-1?q?lYCGiK0IIhuU0Gqd8oQJarOkd2cqhWI9KtCo5U0FyRKj6Y9vy7f?=\n\t=?iso-8859-1?q?C+iqq9T85G48iEAE8NKEv46EmL5LtilOc4bruJbpgo1J+Hy9Z0K?=\n\t=?iso-8859-1?q?IwINJyloJcGVIRTFlrSUtx61Cv2xF9gjrSYy+/cIpLNAD9D6PYm?=\n\t=?iso-8859-1?q?6NhIgIdiIdUdNdJL/FKYyd2aP4u4tM+RgWR6rzn7H9JRysvJw0N?=\n\t=?iso-8859-1?q?f4Tn929C2Kq57FycWbwJAWxh2UqASqM+/xC/fc4KBWvdhwcIA1b?=\n\t=?iso-8859-1?q?dxITN2VQcI2M5KZiVUNzN8jwaAeVUkIb05R/qU=3D?=","x-forefront-antispam-report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n\tIPV:NLI; SFV:NSPM; H:GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM; PTR:;\n\tCAT:NONE; \n\tSFS:(13230040)(1800799024)(376014)(366016)(38070700018); DIR:OUT;\n\tSFP:1101; ","x-ms-exchange-antispam-messagedata-chunkcount":"1","x-ms-exchange-antispam-messagedata-0":"=?iso-8859-1?q?/5qsZB0Udg4zm5h/eykZ?=\n\t=?iso-8859-1?q?CkHjkhtvzSMBeohffp1nLJHFAg1vyePkTycl5/R3r7EWONsOH9m?=\n\t=?iso-8859-1?q?IhlpAIiocNqBux5L3VHHERMOswDWhKu/jCcNDsDYHoFA4lcpqB0?=\n\t=?iso-8859-1?q?2VBRFbXnnBmQjJl6reGvJrvuUtl5ldPwKfnHlEKvlIC03XNIql5?=\n\t=?iso-8859-1?q?JklnxyjDC5YY9VtnDz3YVvduqvFsXChMelx7so6zpiPPUdbV29N?=\n\t=?iso-8859-1?q?pUDnV8o1+X55ddytlrFgveA71M0QzJjxqChvgC7OxbVT6taLsn8?=\n\t=?iso-8859-1?q?IOSHm/RyAfyV7rne9Y/GqZk6TZlo86SSbwO9969z1KwGL/23EIl?=\n\t=?iso-8859-1?q?DXhE2D6Rb3A4xdMzvI9tUAUrSFEL/RtoqLfgAyxOmkShJ7D0F+8?=\n\t=?iso-8859-1?q?TYsVbo/Y1jdfOLIiZK5JmkCQrSaUtRS/NnEUx7jMm63iSF0ROUL?=\n\t=?iso-8859-1?q?M6HPlp7sEkNkrB0E9lK3f1dRYLNHfcKIkGMnp+gsXgkF2X1aTLO?=\n\t=?iso-8859-1?q?57Cil9QuaEFIz/EJ67AL08dsWN6mlwCNPFQkloJTSHOoywz0vZK?=\n\t=?iso-8859-1?q?2tadFBmjQakRmrAoJQXCscYQl079ByhJyaOCmZZ2iGYPKZasII1?=\n\t=?iso-8859-1?q?I5Prh2Py3EifP0MHeJmDCSgzFqjjCqbir7z0niL208zJ2iBLi9D?=\n\t=?iso-8859-1?q?2nwNBZIQVC2NjFgrLcRygSMPTVnUu8ww7YrsjZ3tWgaz0jCk1se?=\n\t=?iso-8859-1?q?pJG8I37EETCeArHO0wPSMEPY00TrfH96/Jyh+lFtcs2XGgQPIr1?=\n\t=?iso-8859-1?q?PNFYtDzqcq0WH9HEhW5t8Ed+UUBEAbFqqr/Tx2o8Te/1W9es7qn?=\n\t=?iso-8859-1?q?SyAubGLFtp2mUq2ZXBPI3tbaXjo2j58/42BOr178x2P6k1xoWxL?=\n\t=?iso-8859-1?q?S+CvE7VKqNtoG4/STAE70kaWRdMOV41/6uKRINTyTdTUJcEr6c4?=\n\t=?iso-8859-1?q?95F4gCqUbrh0rHVMW/18ESP+zBleg6t3h9gjEr0Ra9+uGW8P+rU?=\n\t=?iso-8859-1?q?zrV5mC+ZB+DG+iZq9l1K4his7941Rca2LqTDZh2xFECIkCafQRr?=\n\t=?iso-8859-1?q?Y/19fWxpK8iLcHqrS7IGCOYPgj2duwBccjxT2q5BtG0ercQELfe?=\n\t=?iso-8859-1?q?8I3/VkV1ffq7WdEX0VWDX3+H3jjIEh5Lte9p4KTQSEH+uwNE1XB?=\n\t=?iso-8859-1?q?xF2DA2eiAtwLBddpoz8snB4GVR527rPe4pxmm85qv5Kqhfp7E+/?=\n\t=?iso-8859-1?q?MLgNx6ihaK4WAxB8/lrc2bakTaOfotyHHJuy3SOtbXN2lLHeVKF?=\n\t=?iso-8859-1?q?VLbWpEN44zbYUD28N8KTS8K77oXf/ogkxUem47M9D3i/Xsd2YrN?=\n\t=?iso-8859-1?q?4+cpltXBNZ+RDc8nf36qBKQRpFcKKsgNM7luD5Cce7kKzbcHjUW?=\n\t=?iso-8859-1?q?4ghPtmvGRcErhdqrfNw98Wn/XmpXaD8PweJuxP4U2fuFGM+n9Ot?=\n\t=?iso-8859-1?q?1fye4MOExFn8GrdxTQ9F5vUa4ZpGNKDa9vINpIuZxpg6BX3dio9?=\n\t=?iso-8859-1?q?UO7SR/Kn4SmQiZLBH5zUwclH3sDSrqp/nYt6NyWrAkg0D7GFvK7?=\n\t=?iso-8859-1?q?lIt9kaEuu1k2gMUF1HS/QYZxYHA3qyHWTsj9eEAWk9162DdHjHU?=\n\t=?iso-8859-1?q?EpZGS8fb9r/qoAduiTtZfqkC1JCYIKMC6MackKhIzv7YkGRNfUX?=\n\t=?iso-8859-1?q?d5/tLwgATs/Grw7oBIcz6Fcddhy7EIbYdl+Sn9Q9zhKBY+UfcWh?=\n\t=?iso-8859-1?q?SLomZszgp8CC9y/K+ZE6Q=3D=3D?=","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","MIME-Version":"1.0","X-OriginatorOrg":"skidata.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-AuthSource":"GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM","X-MS-Exchange-CrossTenant-Network-Message-Id":"13ef6c2e-c599-4a26-c4cf-08dcf98b4592","X-MS-Exchange-CrossTenant-originalarrivaltime":"31 Oct 2024 09:06:14.2655\n\t(UTC)","X-MS-Exchange-CrossTenant-fromentityheader":"Hosted","X-MS-Exchange-CrossTenant-id":"e5733095-4425-4f08-b6ba-487b9a46a425","X-MS-Exchange-CrossTenant-mailboxtype":"HOSTED","X-MS-Exchange-CrossTenant-userprincipalname":"KpsXeHWGRLy76RbqegCRz/M5VN2UIwqfc8IRHNwTtE3fnvd0mewiDjFyJRk/cZ3V7XcpRbbuir3YW86kxxZzFNDlG+cB26uEBJbtC6qiCHY=","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"GV0P278MB1125","X-Mailman-Approved-At":"Thu, 31 Oct 2024 10:14:34 +0100","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":31985,"web_url":"https://patchwork.libcamera.org/comment/31985/","msgid":"<1d1e564e7efb8e44288a3b0f4097025b06397e30.camel@collabora.com>","date":"2024-10-31T13:34:32","subject":"Re: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Hi,\n\ncomment on the subject, you are missing a space after \":\". Instead of saying\n\"caps parsing\", I'd prefer to call this caps negotiation.\n\nmore comments below...\n\nLe jeudi 31 octobre 2024 à 09:16 +0100, mailinglist1@johanneskirchmair.de a\nécrit :\n> From: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> \n> The parsing of video/x-bayer sources from string makes is possible to\n\n                                                   makes *it* ?\n\n> use cameras providing e.g SGRBG8 streams via gst-launch.\n> \n> Like:\n> gst-launch-1.0 libcamerasrc camera-name=<cam> ! video/x-bayer,format=grbg\n> \n> Without this change the gstreamer plugin complains about \"Unsupported\n> media type: video/x-bayer\".\n> \n> Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> ---\n>  src/gstreamer/gstlibcamera-utils.cpp | 90 ++++++++++++++--------------\n>  1 file changed, 46 insertions(+), 44 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index 79f71246..472367f2 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -254,54 +254,53 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)\n>  \treturn PixelFormat{};\n>  }\n>  \n> +static struct {\n> +\tPixelFormat format;\n> +\tconst gchar *name;\n> +} bayer_formats[]{\n> +\t{ formats::SBGGR8, \"bggr\" },\n> +\t{ formats::SGBRG8, \"gbrg\" },\n> +\t{ formats::SGRBG8, \"grbg\" },\n> +\t{ formats::SRGGB8, \"rggb\" },\n> +\t{ formats::SBGGR10, \"bggr10le\" },\n> +\t{ formats::SGBRG10, \"gbrg10le\" },\n> +\t{ formats::SGRBG10, \"grbg10le\" },\n> +\t{ formats::SRGGB10, \"rggb10le\" },\n> +\t{ formats::SBGGR12, \"bggr12le\" },\n> +\t{ formats::SGBRG12, \"gbrg12le\" },\n> +\t{ formats::SGRBG12, \"grbg12le\" },\n> +\t{ formats::SRGGB12, \"rggb12le\" },\n> +\t{ formats::SBGGR14, \"bggr14le\" },\n> +\t{ formats::SGBRG14, \"gbrg14le\" },\n> +\t{ formats::SGRBG14, \"grbg14le\" },\n> +\t{ formats::SRGGB14, \"rggb14le\" },\n> +\t{ formats::SBGGR16, \"bggr16le\" },\n> +\t{ formats::SGBRG16, \"gbrg16le\" },\n> +\t{ formats::SGRBG16, \"grbg16le\" },\n> +\t{ formats::SRGGB16, \"rggb16le\" },\n> +};\n> +\n> +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))\n> +\n>  static const gchar *\n>  bayer_format_to_string(int format)\n>  {\n> -\tswitch (format) {\n> -\tcase formats::SBGGR8:\n> -\t\treturn \"bggr\";\n> -\tcase formats::SGBRG8:\n> -\t\treturn \"gbrg\";\n> -\tcase formats::SGRBG8:\n> -\t\treturn \"grbg\";\n> -\tcase formats::SRGGB8:\n> -\t\treturn \"rggb\";\n> -\tcase formats::SBGGR10:\n> -\t\treturn \"bggr10le\";\n> -\tcase formats::SGBRG10:\n> -\t\treturn \"gbrg10le\";\n> -\tcase formats::SGRBG10:\n> -\t\treturn \"grbg10le\";\n> -\tcase formats::SRGGB10:\n> -\t\treturn \"rggb10le\";\n> -\tcase formats::SBGGR12:\n> -\t\treturn \"bggr12le\";\n> -\tcase formats::SGBRG12:\n> -\t\treturn \"gbrg12le\";\n> -\tcase formats::SGRBG12:\n> -\t\treturn \"grbg12le\";\n> -\tcase formats::SRGGB12:\n> -\t\treturn \"rggb12le\";\n> -\tcase formats::SBGGR14:\n> -\t\treturn \"bggr14le\";\n> -\tcase formats::SGBRG14:\n> -\t\treturn \"gbrg14le\";\n> -\tcase formats::SGRBG14:\n> -\t\treturn \"grbg14le\";\n> -\tcase formats::SRGGB14:\n> -\t\treturn \"rggb14le\";\n> -\tcase formats::SBGGR16:\n> -\t\treturn \"bggr16le\";\n> -\tcase formats::SGBRG16:\n> -\t\treturn \"gbrg16le\";\n> -\tcase formats::SGRBG16:\n> -\t\treturn \"grbg16le\";\n> -\tcase formats::SRGGB16:\n> -\t\treturn \"rggb16le\";\n> +\tfor (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> +\t\tif ((uint32_t)bayer_formats[i].format == (uint32_t)format)\n\nI'm curious why the choice of uint32 cast from enum and int, instead of typing\nthe format argument as PixelFormat ?\n\n> +\t\t\treturn bayer_formats[i].name;\n\nc++17 have this nice feature that let you do:\n\n\tfor (const auto &format : bayer_formats) {\n\t\t....\n\t}\n\nYou can then drop ARRAY_SIZE. You map want to stay concistent with the\nformat_map naming and call this bayer_map.\n\n>  \t}\n>  \treturn NULL;\n\nUse nullptr, this one was missed during original review.\n\n>  }\n>  \n> +static PixelFormat bayer_format_from_string(const gchar *name)\n> +{\n> +\tfor (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n\nSame.\n\n> +\t\tif (strcmp(bayer_formats[i].name, name) == 0)\n> +\t\t\treturn bayer_formats[i].format;\n> +\t}\n> +\treturn PixelFormat{};\n> +}\n> +\n>  static GstStructure *\n>  bare_structure_from_format(const PixelFormat &format)\n>  {\n> @@ -407,9 +406,8 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n>  \treturn caps;\n>  }\n>  \n> -void\n> -gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n> -\t\t\t\t\t GstCaps *caps)\n> +void gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n> +\t\t\t\t\t      GstCaps *caps)\n\nWe have chosen to follow GStreamer coding style for this one, please refrain\nfrom creating a mix and match through this file.\n\n>  {\n>  \tGstVideoFormat gst_format = pixel_format_to_gst_format(stream_cfg.pixelFormat);\n>  \tguint i;\n> @@ -469,11 +467,15 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n>  \t\tgst_structure_fixate_field_string(s, \"format\", format);\n>  \t}\n>  \n> +\tprintf(\"in the function!!!!!!\");\n\nPlease cleanup your temporary debug traces before submitting patches.\n\n>  \t/* Then configure the stream with the result. */\n>  \tif (gst_structure_has_name(s, \"video/x-raw\")) {\n>  \t\tconst gchar *format = gst_structure_get_string(s, \"format\");\n>  \t\tgst_format = gst_video_format_from_string(format);\n>  \t\tstream_cfg.pixelFormat = gst_format_to_pixel_format(gst_format);\n> +\t} else if (gst_structure_has_name(s, \"video/x-bayer\")) {\n> +\t\tconst gchar *format = gst_structure_get_string(s, \"format\");\n> +\t\tstream_cfg.pixelFormat = bayer_format_from_string(format);\n>  \t} else if (gst_structure_has_name(s, \"image/jpeg\")) {\n>  \t\tstream_cfg.pixelFormat = formats::MJPEG;\n>  \t} else {\n\nYour patch otherwise looks right to me, we clearly missed this while adding\nBayer support. Please send a V2 with the above fixes.\n\nregards\nNicolas","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D3539C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 31 Oct 2024 13:34:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CAF60653A1;\n\tThu, 31 Oct 2024 14:34:37 +0100 (CET)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A1D4E60360\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Oct 2024 14:34:35 +0100 (CET)","from nicolas-tpx395.lan (unknown [IPv6:2606:6d00:15:862e::580])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (4096 bits)\n\tserver-digest SHA256)\n\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby bali.collaboradmins.com (Postfix) with ESMTPSA id 92AF517E3613;\n\tThu, 31 Oct 2024 14:34:34 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=collabora.com header.i=@collabora.com\n\theader.b=\"ZyONtqGE\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1730381675;\n\tbh=hwPXW9/g7pjIpsqyE8znMHUBk7PqrnL9KC+h/hV/SRc=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=ZyONtqGEiN55Q5a0g+8ei3TgsnjVb4gRfNjXUeuLo2YhjhihOkA2H0KHUgnKy8R4P\n\tHK8uE4ffz4/JaX403Axo69hsQDoGzaiya/Zdy83ztK6kbII3ccTpcyvzQbWYvJw+IY\n\tXqrsTl7h6eXpMWHn4qrkdH83g14yHODesUuzoL8Ljc+Cai26aMakJVWGQKtR44rpvF\n\thDsoDiyLLVnmISUMuetEDm8m7JvKyawYeeLncw22JCzYCGZvKJis794ZQ80heGg0hU\n\tm2hMCaM2ce8yXuzxYOuiB3OLSdQPQu10VLB/zh0NCh66wPdhlp5NeKZGZ+8EOcmRYf\n\tZ1zk9W9yHxSFg==","Message-ID":"<1d1e564e7efb8e44288a3b0f4097025b06397e30.camel@collabora.com>","Subject":"Re: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"mailinglist1@johanneskirchmair.de, libcamera-devel@lists.libcamera.org","Cc":"johannes.kirchmair@skidata.com, pavel@ucw.cz","Date":"Thu, 31 Oct 2024 09:34:32 -0400","In-Reply-To":"<20241031081645.302543-1-mailinglist1@johanneskirchmair.de>","References":"<20241031081645.302543-1-mailinglist1@johanneskirchmair.de>","Organization":"Collabora","Content-Type":"text/plain; charset=\"UTF-8\"","User-Agent":"Evolution 3.52.4 (3.52.4-1.fc40) ","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":31989,"web_url":"https://patchwork.libcamera.org/comment/31989/","msgid":"<GVAP278MB045675D948CB7B1EBAC1DC2B8C552@GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM>","date":"2024-10-31T14:02:18","subject":"AW: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","submitter":{"id":213,"url":"https://patchwork.libcamera.org/api/people/213/","name":"Johannes Kirchmair - SKIDATA","email":"johannes.kirchmair@skidata.com"},"content":"Hi,\n\n> -----Ursprüngliche Nachricht-----\n> Von: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> Gesendet: Donnerstag, 31. Oktober 2024 14:35\n> An: mailinglist1@johanneskirchmair.de; libcamera-devel@lists.libcamera.org\n> Cc: Johannes Kirchmair - SKIDATA <johannes.kirchmair@skidata.com>;\n> pavel@ucw.cz\n> Betreff: Re: [PATCH] gstreamer:Implement caps parsing for video/x-bayer\n> \n> Caution: This is an external email, please take care when clicking links or\n> opening attachments\n> \n> Hi,\n> \n> comment on the subject, you are missing a space after \":\". Instead of saying\n> \"caps parsing\", I'd prefer to call this caps negotiation.\n> \n> more comments below...\n> \n> Le jeudi 31 octobre 2024 à 09:16 +0100, mailinglist1@johanneskirchmair.de a\n> écrit :\n> > From: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> >\n> > The parsing of video/x-bayer sources from string makes is possible to\n> \n>                                                    makes *it* ?\n> \n> > use cameras providing e.g SGRBG8 streams via gst-launch.\n> >\n> > Like:\n> > gst-launch-1.0 libcamerasrc camera-name=<cam> !\n> > video/x-bayer,format=grbg\n> >\n> > Without this change the gstreamer plugin complains about \"Unsupported\n> > media type: video/x-bayer\".\n> >\n> > Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>\n> > ---\n> >  src/gstreamer/gstlibcamera-utils.cpp | 90\n> > ++++++++++++++--------------\n> >  1 file changed, 46 insertions(+), 44 deletions(-)\n> >\n> > diff --git a/src/gstreamer/gstlibcamera-utils.cpp\n> > b/src/gstreamer/gstlibcamera-utils.cpp\n> > index 79f71246..472367f2 100644\n> > --- a/src/gstreamer/gstlibcamera-utils.cpp\n> > +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> > @@ -254,54 +254,53 @@ gst_format_to_pixel_format(GstVideoFormat\n> gst_format)\n> >       return PixelFormat{};\n> >  }\n> >\n> > +static struct {\n> > +     PixelFormat format;\n> > +     const gchar *name;\n> > +} bayer_formats[]{\n> > +     { formats::SBGGR8, \"bggr\" },\n> > +     { formats::SGBRG8, \"gbrg\" },\n> > +     { formats::SGRBG8, \"grbg\" },\n> > +     { formats::SRGGB8, \"rggb\" },\n> > +     { formats::SBGGR10, \"bggr10le\" },\n> > +     { formats::SGBRG10, \"gbrg10le\" },\n> > +     { formats::SGRBG10, \"grbg10le\" },\n> > +     { formats::SRGGB10, \"rggb10le\" },\n> > +     { formats::SBGGR12, \"bggr12le\" },\n> > +     { formats::SGBRG12, \"gbrg12le\" },\n> > +     { formats::SGRBG12, \"grbg12le\" },\n> > +     { formats::SRGGB12, \"rggb12le\" },\n> > +     { formats::SBGGR14, \"bggr14le\" },\n> > +     { formats::SGBRG14, \"gbrg14le\" },\n> > +     { formats::SGRBG14, \"grbg14le\" },\n> > +     { formats::SRGGB14, \"rggb14le\" },\n> > +     { formats::SBGGR16, \"bggr16le\" },\n> > +     { formats::SGBRG16, \"gbrg16le\" },\n> > +     { formats::SGRBG16, \"grbg16le\" },\n> > +     { formats::SRGGB16, \"rggb16le\" }, };\n> > +\n> > +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))\n> > +\n> >  static const gchar *\n> >  bayer_format_to_string(int format)\n> >  {\n> > -     switch (format) {\n> > -     case formats::SBGGR8:\n> > -             return \"bggr\";\n> > -     case formats::SGBRG8:\n> > -             return \"gbrg\";\n> > -     case formats::SGRBG8:\n> > -             return \"grbg\";\n> > -     case formats::SRGGB8:\n> > -             return \"rggb\";\n> > -     case formats::SBGGR10:\n> > -             return \"bggr10le\";\n> > -     case formats::SGBRG10:\n> > -             return \"gbrg10le\";\n> > -     case formats::SGRBG10:\n> > -             return \"grbg10le\";\n> > -     case formats::SRGGB10:\n> > -             return \"rggb10le\";\n> > -     case formats::SBGGR12:\n> > -             return \"bggr12le\";\n> > -     case formats::SGBRG12:\n> > -             return \"gbrg12le\";\n> > -     case formats::SGRBG12:\n> > -             return \"grbg12le\";\n> > -     case formats::SRGGB12:\n> > -             return \"rggb12le\";\n> > -     case formats::SBGGR14:\n> > -             return \"bggr14le\";\n> > -     case formats::SGBRG14:\n> > -             return \"gbrg14le\";\n> > -     case formats::SGRBG14:\n> > -             return \"grbg14le\";\n> > -     case formats::SRGGB14:\n> > -             return \"rggb14le\";\n> > -     case formats::SBGGR16:\n> > -             return \"bggr16le\";\n> > -     case formats::SGBRG16:\n> > -             return \"gbrg16le\";\n> > -     case formats::SGRBG16:\n> > -             return \"grbg16le\";\n> > -     case formats::SRGGB16:\n> > -             return \"rggb16le\";\n> > +     for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> > +             if ((uint32_t)bayer_formats[i].format ==\n> > + (uint32_t)format)\n> \n> I'm curious why the choice of uint32 cast from enum and int, instead of typing\n> the format argument as PixelFormat ?\nMy knowledge of the formats is not very good and thought the format argument was int for a good reason.\nDidn’t want to break something :-D\nI had a look at pixel_format.h:29.\nIt provides a uint32_t() operator, that’s why I preferred the uint32_t.\n\nBut if you say it would be better to have the argument being PixelFormat as well, I will change it happily.\n\n> \n> > +                     return bayer_formats[i].name;\n> \n> c++17 have this nice feature that let you do:\n> \n>         for (const auto &format : bayer_formats) {\n>                 ....\n>         }\nDidn't really do c++ since 2010 so this is, more or less, my best guess on proper c++ :-D\nFor that reason, I am happy to have a proper review of it.\n\nWill submit v3 soon.\n\nBest regards\nJohannes\n\n> \n> You can then drop ARRAY_SIZE. You map want to stay concistent with the\n> format_map naming and call this bayer_map.\n> \n> >       }\n> >       return NULL;\n> \n> Use nullptr, this one was missed during original review.\n> \n> >  }\n> >\n> > +static PixelFormat bayer_format_from_string(const gchar *name) {\n> > +     for (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\n> \n> Same.\n> \n> > +             if (strcmp(bayer_formats[i].name, name) == 0)\n> > +                     return bayer_formats[i].format;\n> > +     }\n> > +     return PixelFormat{};\n> > +}\n> > +\n> >  static GstStructure *\n> >  bare_structure_from_format(const PixelFormat &format)  { @@ -407,9\n> > +406,8 @@ gst_libcamera_stream_configuration_to_caps(const\n> StreamConfiguration &stream_cfg\n> >       return caps;\n> >  }\n> >\n> > -void\n> > -gst_libcamera_configure_stream_from_caps(StreamConfiguration\n> &stream_cfg,\n> > -                                      GstCaps *caps)\n> > +void gst_libcamera_configure_stream_from_caps(StreamConfiguration\n> &stream_cfg,\n> > +                                           GstCaps *caps)\n> \n> We have chosen to follow GStreamer coding style for this one, please refrain\n> from creating a mix and match through this file.\n> \n> >  {\n> >       GstVideoFormat gst_format =\n> pixel_format_to_gst_format(stream_cfg.pixelFormat);\n> >       guint i;\n> > @@ -469,11 +467,15 @@\n> gst_libcamera_configure_stream_from_caps(StreamConfiguration\n> &stream_cfg,\n> >               gst_structure_fixate_field_string(s, \"format\", format);\n> >       }\n> >\n> > +     printf(\"in the function!!!!!!\");\n> \n> Please cleanup your temporary debug traces before submitting patches.\n> \n> >       /* Then configure the stream with the result. */\n> >       if (gst_structure_has_name(s, \"video/x-raw\")) {\n> >               const gchar *format = gst_structure_get_string(s, \"format\");\n> >               gst_format = gst_video_format_from_string(format);\n> >               stream_cfg.pixelFormat =\n> > gst_format_to_pixel_format(gst_format);\n> > +     } else if (gst_structure_has_name(s, \"video/x-bayer\")) {\n> > +             const gchar *format = gst_structure_get_string(s, \"format\");\n> > +             stream_cfg.pixelFormat =\n> > + bayer_format_from_string(format);\n> >       } else if (gst_structure_has_name(s, \"image/jpeg\")) {\n> >               stream_cfg.pixelFormat = formats::MJPEG;\n> >       } else {\n> \n> Your patch otherwise looks right to me, we clearly missed this while adding\n> Bayer support. Please send a V2 with the above fixes.\n> \n> regards\n> Nicolas","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 0EEAEC31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 31 Oct 2024 14:02:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D67D8653A1;\n\tThu, 31 Oct 2024 15:02:22 +0100 (CET)","from ZRZP278CU001.outbound.protection.outlook.com\n\t(mail-switzerlandnorthazlp170110002.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f403:c213::2])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5B98E60360\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Oct 2024 15:02:20 +0100 (CET)","from GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM (2603:10a6:710:39::5)\n\tby\n\tZR0P278MB1732.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:a1::10) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.8114.20; Thu, 31 Oct 2024 14:02:18 +0000","from GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM\n\t([fe80::f5f4:4769:5e87:a09c]) by\n\tGVAP278MB0456.CHEP278.PROD.OUTLOOK.COM\n\t([fe80::f5f4:4769:5e87:a09c%7]) with mapi id 15.20.8114.020;\n\tThu, 31 Oct 2024 14:02:18 +0000"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=skidata.com header.i=@skidata.com\n\theader.b=\"UgXJ96np\"; dkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=skidata.com;"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n\tb=f2yoEmDbq9QTCl/9EzXNGaf6hRTViUWSJfpEJZTsv9JdFI+q48GVk6/KUs/NEA4JJejon3918sTYCWTD67SD2uDcRlexwtmx0mjoP/BQpqUBQdxFuIRtJZHZRrH9EXd1ZdLWpJsOHSTnWSmvPL4Q63kUeuHzrVl5ldy+JMp8sr6xQ0KbO2aw6SVHie/8sIfLpHX5wEtMi2qJteLm47k1CeSMFL9pJs8FWjI44r/pSUEXnJgmaWrFoNrNSwdShWdJ39uPD+JxRWYe1B5Ulduq9zmWIufmr394cToixNznhgJ4UWwDak7l5xaOXbx3HXeKMoCaBdr9eceQqpwww8Psjg==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n\ts=arcselector10001;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n\tbh=1vtcVsQUdYOD5pkSnIoLKZ0OeFnJ8OHHQtbgyKQkv5Q=;\n\tb=wLc/KwTr8X7uYnf87McTOPuLbJGzxM0305+AJYuPKID7T9DFa0JFM08RrLgt26kyvEm5krU3rXt0t8FEr2qOzNLDcThQOQ2HNpClWy532yFCEcOk3TWDD3g+BwG2zbvRy/ny1k0EH0NJoASID/OW1PfYPZ8EaHuKVQ5vzsXlvdX4MdRzddlMjnk2ofgLNrrNl+l9hkm1yc8BGXMFetFd1HZC00+9TGHWhyS9pOWIuxgpjq+AZBTFL/95Z+6PI+/e4Nl8SVcqQ9CT9QnM5IiP/fr0a9LG719x1a7AIa9u95bfy4L4fUenIC6s5q8s8IWiIJRr21ppQNxS2EX2iHSong==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n\tsmtp.mailfrom=skidata.com;\n\tdmarc=pass action=none header.from=skidata.com; \n\tdkim=pass header.d=skidata.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=skidata.com;\n\ts=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=1vtcVsQUdYOD5pkSnIoLKZ0OeFnJ8OHHQtbgyKQkv5Q=;\n\tb=UgXJ96npCQPThACb44iMXrvS69z9B2cL06MMDr8MfAw2ctpLTXXtGMBk5obYF+khidjMZbD2do3dleCc2m7T1Jl9+IuGS0dmTvHKA6PGV/j5CpT0hPOynrhBvkXgHgEdQ7nZobLCdGf9Zyzl9CgubxlrUKzEmaRlsSHohyFgIWqyUEyJfmxInwzuNH7ETEfLZRo9SCfEi9GR0QLGdvCZEG1MooIGzgyYfCpgAFxxUt3TSife5GpP10NyzaOYVU5gBNvafX1EtMlO7TPS6PvYQQzSN+DTcBSuOF8XU11tqwSW+mioIT8FMyFluYjKs13NrPIZc+nlmwDf3kPQAh5npQ==","From":"Johannes Kirchmair - SKIDATA <johannes.kirchmair@skidata.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>,\n\t\"mailinglist1@johanneskirchmair.de\" <mailinglist1@johanneskirchmair.de>, \n\t\"libcamera-devel@lists.libcamera.org\"\n\t<libcamera-devel@lists.libcamera.org>","CC":"\"pavel@ucw.cz\" <pavel@ucw.cz>","Subject":"AW: [PATCH] gstreamer:Implement caps parsing for video/x-bayer","Thread-Topic":"[PATCH] gstreamer:Implement caps parsing for video/x-bayer","Thread-Index":"AQHbK21CsZYo68wn4US5zEDjLAVJhbKg3GEAgAACWOA=","Date":"Thu, 31 Oct 2024 14:02:18 +0000","Message-ID":"<GVAP278MB045675D948CB7B1EBAC1DC2B8C552@GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM>","References":"<20241031081645.302543-1-mailinglist1@johanneskirchmair.de>\n\t<1d1e564e7efb8e44288a3b0f4097025b06397e30.camel@collabora.com>","In-Reply-To":"<1d1e564e7efb8e44288a3b0f4097025b06397e30.camel@collabora.com>","Accept-Language":"de-DE, en-US","Content-Language":"de-DE","X-MS-Has-Attach":"","X-MS-TNEF-Correlator":"","x-bromium-msgid":"8d5e89b0-27b2-4629-a8b4-e948f6a68f84","authentication-results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=skidata.com header.i=@skidata.com\n\theader.b=\"UgXJ96np\"; dkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=skidata.com;"],"x-ms-publictraffictype":"Email","x-ms-traffictypediagnostic":"GVAP278MB0456:EE_|ZR0P278MB1732:EE_","x-ms-office365-filtering-correlation-id":"3da86a36-b72f-42d6-e663-08dcf9b4a1db","x-ms-exchange-senderadcheck":"1","x-ms-exchange-antispam-relay":"0","x-microsoft-antispam":"BCL:0;\n\tARA:13230040|376014|1800799024|366016|38070700018; ","x-microsoft-antispam-message-info":"=?utf-8?q?Uiu7yCeatMfSw1avOdB54B1Ni+Ud?=\n\t=?utf-8?q?wy8PEDAtxezugMjK/j2V6H+NriRpFtfjgOe/gxLrtjHEivN3I68uzbDL?=\n\t=?utf-8?q?zowhaRatQQ/A6iHO3uqbv58k+oWOOivqV8gcm0fwybYnbutAWABdNmZm?=\n\t=?utf-8?q?vw8SztOipGiUpeJVHiMoz8WQ2/72J0p0udKOG9qtf4VBcBayURkcqixp?=\n\t=?utf-8?q?sBTV/MnM+kqhSHjvFovgbeh2YOlfCKRn+xodLjOnOmxt9JJTeU+iMd6u?=\n\t=?utf-8?q?D2uLPv9poSHATWynN1VA2hDev3uXUy5jNtp70z4xy7VWHPW6NDnCvixW?=\n\t=?utf-8?q?UYzNpgjivhs+d21A3cAovEf8MI+kxyeNrQfWLqfAfJrqj7SqUaTCnvl+?=\n\t=?utf-8?q?1HdZ9uUWLnRoU+vBI+9NGM8Ff7f//LK0FGYtxsYrvRWTfFloWUTlcBRE?=\n\t=?utf-8?q?B1uaz834c04BBj7mCFWDholhWUTCYeucDolkNvav/5q7Lhft5T9ZE3W5?=\n\t=?utf-8?q?1PG1C/5q2IG7+wQfeD17y9WbNk7KOcj8kI93kru4m69jtW8SkJ9BpXoq?=\n\t=?utf-8?q?A6RUG/4Me+ZFCqWobsE6eHTpWfq64VHp8ag1lHmC8smnZOFqHc/ryDwl?=\n\t=?utf-8?q?kLbn81EIG/vZgOQN2l3WcXEjQVm6pr6wLfevKYNy8b4gIp5+i6PCrDbv?=\n\t=?utf-8?q?KLp+z838r0zImj6NCR4yUhp6lVFcy1OncSj3HA4GwqOPhkVW2pYJHMxb?=\n\t=?utf-8?q?e28Fjv269zSf+NizoG2FVhfZ0iVrOWsaJLolNJPVtHW1dawk+iD3Vg3F?=\n\t=?utf-8?q?KKDuKqLcIUbPAmImJlx4JFsxehBmnrN5H7bTst63z6DFOa9a+UiumDw1?=\n\t=?utf-8?q?aKkFThJU+XwkaXOguWXUyc3XLdkIMXjcnssMYmdDAVBQCEw6pHEjplJi?=\n\t=?utf-8?q?BwI2RRKuSC0ct2uNteeBVq9RUPY6pRb1wKiskHK1pFwjq/qjCgCTy7rF?=\n\t=?utf-8?q?svAkyJcWxWqhBXRKv5DMslQEuJYyhG/bZe3LeqcxUu9r6JvkZc4ea99V?=\n\t=?utf-8?q?r70EJHq/KoHL3ocnj6RoBvNbYn40QLrFnQsmt8xRQEb5rbGIbcUD1Xuq?=\n\t=?utf-8?q?QfNibDZYZinCIPVvqZ12h+uk8ih8HOD5ixvBMyc68Vm5HOGsvYXTuSPO?=\n\t=?utf-8?q?ATzQvC8bOKgJtJiMhbtWNS9Xy2G7fcvj089GkxIdUbxFTk2csJqbrdDC?=\n\t=?utf-8?q?nk/mfFbpusRc8BzP3aSFh9iJJfEZ02detrRSigTMDv3erHgv0c5Rdz85?=\n\t=?utf-8?q?VDXmbQCYpl32z0CTTDHwDW2Bje8GEdp/Lp7x+mePSGU32/XmRpT166sQ?=\n\t=?utf-8?q?Lcql0N2vlMxJeLXhB+OpZkuwyuSDa8YKe8130YDap+2anoVEPmU7O3kV?=\n\t=?utf-8?q?gjlPiVHoE+jc2qt0jxX3Oi3dhdslDv0NE/yRyK/MPhhOLzRuORyPDSbt?=\n\t=?utf-8?q?gRlGWmdOiVks720=3D?=","x-forefront-antispam-report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n\tIPV:NLI; SFV:NSPM; H:GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM; PTR:;\n\tCAT:NONE; \n\tSFS:(13230040)(376014)(1800799024)(366016)(38070700018); DIR:OUT;\n\tSFP:1101; ","x-ms-exchange-antispam-messagedata-chunkcount":"1","x-ms-exchange-antispam-messagedata-0":"=?utf-8?q?UgiYpmE/e74VmyRRqsUfv/8oB?=\n\t=?utf-8?q?wgOiojZ9gFWFOqu1y5jMgteYzWV/RyP7iTvNz6Y8tn2kCmO3gyjC4gg6?=\n\t=?utf-8?q?SNcFqaMd8ZuOvJ0WmfUioJXJeQVrZLuxadfN7Q+6YSGONdqzt3wwsr9F?=\n\t=?utf-8?q?axGwwTgAJM27vAerdx0Q4rCXEMySvm4gPJV2l1GfAEY9xCsv0lyVcgBt?=\n\t=?utf-8?q?LQ+6n2/qyrB82R10JMYWjYy7hKvai/ba2M6fFtEY0s06KNJRRqTpYVVp?=\n\t=?utf-8?q?ANuc/FexwhlrvTCHLChx9muomLgyxlOjnG2rv7Yp8zbEdpkt70WfEfV2?=\n\t=?utf-8?q?md9Z2dS4Bl1Zo1i27+G+3Wk5EY2r1YXh4T/JatiV/JTS4M0rGOOXqfbU?=\n\t=?utf-8?q?x45t+d7owzeyIoQrh8knVsdXyFptymVA6Y7KetGfY45Wx8KOwCZ0+xD1?=\n\t=?utf-8?q?QPyVOSDHN6pAhghm69NrASeI697/si29MQvvwva2LR8MA7KsJRRHvH9V?=\n\t=?utf-8?q?LrmLDfZVr3sow5BgAD1VlqMMlaEDNjHEAjXbXSJNFx7yETwTQUl0dniM?=\n\t=?utf-8?q?xfQK4WmQrurl7Rww004Whxhd12BQpYyoGTaNFel/jI00TXL8fJG+zK44?=\n\t=?utf-8?q?qQ+JxNny8K9pS0d+VgZwFeikJbqDbEonvtjVaearnbBomN9HNQX/AB+L?=\n\t=?utf-8?q?9SmNmhkIUsSV+4os6/pRYocSRcYUK3CppeYRqSwiE23tvXxwPtdTLiKk?=\n\t=?utf-8?q?G2gSnLm2Z696YkypOn9bEWL+my+FPGfJJZu763QDDVT9RvWiM5+M5QWL?=\n\t=?utf-8?q?WOh/5I8vCfXpmvqQjxtLjPmcpTi+4HiI7pNGaWxMeP6S6DVP7dBTJWYK?=\n\t=?utf-8?q?KvOFb9wScvgjdbcMc1VOTOQRpXhwu8wl+Hy/Z17a3jwcqQh7j+H6GuRZ?=\n\t=?utf-8?q?kG5+sRemQNO/FAmx9s1+YbMb0b0PYZnIeutoufute7w+7p8FxgUz9hzN?=\n\t=?utf-8?q?+ZyMW+7kbPNHc1q7Co/V0Z8zNKrdHLO6cFleP9GkiPyk0etcub9SCI9g?=\n\t=?utf-8?q?Me33ECxmTdL6ha3fco/ojwMGgSazsJPDzL+9h4EDFGO95rpoOYRumTwC?=\n\t=?utf-8?q?td6f5rWAlgGlRnXjweSrXL/cF7sRxTskeWIKUDWREXBo/aYtkl+rbiqu?=\n\t=?utf-8?q?H/nx1h3V3XZtqm7XeXdt8co1JWYCT2IlCN4pZEY68z3M66Kzptq2etxd?=\n\t=?utf-8?q?mb5KPfPA6MNF9j+1HZW0Kf4HxJEkvdqFZbNAQipQGkKBXBlWGzf3n/Rl?=\n\t=?utf-8?q?V2x+Uh/g+KwQwebddHcXJ4tAyRI0Y6vky1EzXrizBOnPk15LuRSokij1?=\n\t=?utf-8?q?hUhKxxtdOk6/bTq7OygpKIP2qw7saHIG5S2FT9ytqk8N9qE540lzYCHi?=\n\t=?utf-8?q?yMrEKTNL239UnbKZMOBK9omSDKipOeWUgf0xmsa9xP2g4X4GAOyYGMb3?=\n\t=?utf-8?q?+qhqz0n8+dbmZdVKBuFo59VxbE2gdxNN5zPmWgz9TRUg15UnOevZY9cn?=\n\t=?utf-8?q?NK3Zm1PFfol+bggt31l5UcGUufMGnjmAOcQVbWOix1imDHLx2n+WfPAa?=\n\t=?utf-8?q?HnXPW9HbEdP9QK/9eOKWkfi3+lzRe31MsbhT88VGvPqej0DN7wtAZchq?=\n\t=?utf-8?q?f/VxnxH9RLZbx93nGOcJZvif10dgvJUnYoscw6HzZLDXsOLOq5Hwrw9j?=\n\t=?utf-8?q?DuEbwu8n8So5RbnZSgm6zJDc/iMLA=3D=3D?=","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","MIME-Version":"1.0","X-OriginatorOrg":"skidata.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-AuthSource":"GVAP278MB0456.CHEP278.PROD.OUTLOOK.COM","X-MS-Exchange-CrossTenant-Network-Message-Id":"3da86a36-b72f-42d6-e663-08dcf9b4a1db","X-MS-Exchange-CrossTenant-originalarrivaltime":"31 Oct 2024 14:02:18.4377\n\t(UTC)","X-MS-Exchange-CrossTenant-fromentityheader":"Hosted","X-MS-Exchange-CrossTenant-id":"e5733095-4425-4f08-b6ba-487b9a46a425","X-MS-Exchange-CrossTenant-mailboxtype":"HOSTED","X-MS-Exchange-CrossTenant-userprincipalname":"bGjSRZRTk79W3vA8Non1smrND/F0NB/jvPg7g8JqchVrF2IN+Bxa5bY+r7C3IfPJG5Oz50Lci+EnkYuZtrhrsVxrBYgHhUrGH0ZBoJNqPok=","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"ZR0P278MB1732","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]