[{"id":31984,"web_url":"https://patchwork.libcamera.org/comment/31984/","msgid":"<bGPL-LPcL65LKSQgjqBvOnio33Z8gQ4-3GYRaPI0rThRVhHBHVYFZpv0ZI5TOiKmsIDV2MeCxLgGY26PVBenk6RS3g0wBziY0Qko7n6xZeU=@protonmail.com>","date":"2024-10-31T12:07:21","subject":"Re: [PATCH v2] gstreamer:Implement caps parsing for video/x-bayer","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"content":"Hi\n\n\n2024. október 31., csütörtök 10:11 keltezéssel, mailinglist1@johanneskirchmair.de <mailinglist1@johanneskirchmair.de> írta:\n\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> \n> Changes in v2:\n> - Coding style changes\n> - Removed printf that slipped in\n> ---\n>  src/gstreamer/gstlibcamera-utils.cpp | 85 ++++++++++++++--------------\n>  1 file changed, 44 insertions(+), 41 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index 79f71246..80631295 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -254,54 +254,54 @@ gst_format_to_pixel_format(GstVideoFormat gst_format)\n>  \treturn PixelFormat{};\n>  }\n> \n> +static struct {\n\nPlease make this `const`.\n\n\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> +\t\t\treturn bayer_formats[i].name;\n>  \t}\n\n  for (auto &f : bayer_formats)\n\nAnd then `ARRAY_SIZE()` is not needed. Same below.\n\n\n>  \treturn NULL;\n>  }\n> \n> +static PixelFormat\n> +bayer_format_from_string(const gchar *name)\n> +{\n> +\tfor (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\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> @@ -474,6 +474,9 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\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> --\n> 2.34.1\n> \n> \n\n\nRegards,\nBarnabás Pőcze","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 69D3FC31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 31 Oct 2024 12:07:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6D29D653A1;\n\tThu, 31 Oct 2024 13:07:27 +0100 (CET)","from mail-4322.protonmail.ch (mail-4322.protonmail.ch\n\t[185.70.43.22])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CF4A960360\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Oct 2024 13:07:25 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=protonmail.com header.i=@protonmail.com\n\theader.b=\"LPRv8EiY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1730376445; x=1730635645;\n\tbh=+romTRzoZ5sjh+Be+TSCUOAjtnL4NbZcp/WCmhK2GrI=;\n\th=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector;\n\tb=LPRv8EiYZTSfEM7yGodqrdjMv26CMU9JzVFwqFs5uE4sff8Jlz2b8atrAp+H8O8Nl\n\tfAWLzG84wbn3pkSmDp6tAY+8KzecC7Qw19bLQo7BbwyEXcxGZF+gL9EaBYs8S5uk4Q\n\t0SGp2ct7ySnpqhxlZOgwjHjouQPs5vG6rsMK78i3ViHF06g48qPm95ofj7qMtVLfM+\n\tci8j6QaVcTXYLARCMxawW/w2KCl/ugxQ/Lhuv7GT31XWyK7d2rApZn/Pma5MXfQPBN\n\tLI2ywI4QSLxfGqn40YDUogPwgQDq3KoPQnFFu1hqSrMQd+SSQV9zx2QzuGpoJ7bSUc\n\tKjTZEMdDwsBcA==","Date":"Thu, 31 Oct 2024 12:07:21 +0000","To":"mailinglist1@johanneskirchmair.de","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org, johannes.kirchmair@skidata.com,\n\tkieran.bingham@ideasonboard.com, nicolas.dufresne@collabora.com,\n\tpavel@ucw.cz","Subject":"Re: [PATCH v2] gstreamer:Implement caps parsing for video/x-bayer","Message-ID":"<bGPL-LPcL65LKSQgjqBvOnio33Z8gQ4-3GYRaPI0rThRVhHBHVYFZpv0ZI5TOiKmsIDV2MeCxLgGY26PVBenk6RS3g0wBziY0Qko7n6xZeU=@protonmail.com>","In-Reply-To":"<20241031091157.304305-1-mailinglist1@johanneskirchmair.de>","References":"<20241031091157.304305-1-mailinglist1@johanneskirchmair.de>","Feedback-ID":"20568564:user:proton","X-Pm-Message-ID":"699957797e7a87395da6337c77de5d6577c17909","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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":31986,"web_url":"https://patchwork.libcamera.org/comment/31986/","msgid":"<8148c50fe65a6edb897f66ada22e7dab943ffcb1.camel@collabora.com>","date":"2024-10-31T13:38:28","subject":"Re: [PATCH v2] 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\nLe jeudi 31 octobre 2024 à 10:11 +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> use cameras providing e.g SGRBG8 streams via gst-launch.\n\nI didn't have enough time to review V1 (timezone), please have a look at my V1\nreview and provide a V3.\n\nregards,\nNicolas\n\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> Changes in v2:\n> - Coding style changes\n> - Removed printf that slipped in\n> ---\n>  src/gstreamer/gstlibcamera-utils.cpp | 85 ++++++++++++++--------------\n>  1 file changed, 44 insertions(+), 41 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index 79f71246..80631295 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -254,54 +254,54 @@ 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> +\t\t\treturn bayer_formats[i].name;\n>  \t}\n>  \treturn NULL;\n>  }\n>  \n> +static PixelFormat\n> +bayer_format_from_string(const gchar *name)\n> +{\n> +\tfor (unsigned int i = 0; i < ARRAY_SIZE(bayer_formats); i++) {\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> @@ -474,6 +474,9 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\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 {","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 51305C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 31 Oct 2024 13:38:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6925B653A1;\n\tThu, 31 Oct 2024 14:38:32 +0100 (CET)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4336560360\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Oct 2024 14:38:31 +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 166B817E3615;\n\tThu, 31 Oct 2024 14:38:29 +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=\"k5me20yC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1730381910;\n\tbh=R3BVoVso73BufrC4ehdXqkrSFXWTasqZY2+bLT7ajJ4=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=k5me20yC6fzZRKdYueFnhp7a+jesjvtJAp5kNXnDusmdSrAMXBVo9Zk6uS4xjKlR5\n\tYqbh1+8mknVP9LaYxniyIybWOvjlFV7SgdAgMPS4OFHiD0w+RU76xquo+OGb1E1kQX\n\t+5nPtojzOo9AJKCNkU0iz9GgYpsQGbNOs+UsRWN4c8KAoikndygmYj3ltqbKovTrVC\n\tys2iCRq/ZLX4aJWkxh7XmTcYt366ypL91zc0oSoxyeaDkT/KuxsqgjYjhn7IFMW0/N\n\tg9qfbooCi680XRNvD3nUS/6EUDs1D62m9o8/x7pYMSFRG02V6inq+38SayCsAPmQEB\n\tyNlh5dJwTtGxg==","Message-ID":"<8148c50fe65a6edb897f66ada22e7dab943ffcb1.camel@collabora.com>","Subject":"Re: [PATCH v2] 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, kieran.bingham@ideasonboard.com, \n\tpavel@ucw.cz","Date":"Thu, 31 Oct 2024 09:38:28 -0400","In-Reply-To":"<20241031091157.304305-1-mailinglist1@johanneskirchmair.de>","References":"<20241031091157.304305-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>"}}]