[{"id":24751,"web_url":"https://patchwork.libcamera.org/comment/24751/","msgid":"<533bd640-f4cd-3c4f-798b-806e55c6c4d8@ideasonboard.com>","date":"2022-08-23T23:29:28","subject":"Re: [libcamera-devel] [PATCH 4/6] test: Add a ColorSpace test","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent,\n\nThank you for the patch.\n\nOn 8/23/22 11:13 PM, Laurent Pinchart via libcamera-devel wrote:\n> Add a test for the ColorSpace class that exercises the toString() and\n> fromString() functions.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nSatisfactory number/types of cases covered in the test hence\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n> ---\n>   test/color-space.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++\n>   test/meson.build     |   1 +\n>   2 files changed, 106 insertions(+)\n>   create mode 100644 test/color-space.cpp\n>\n> diff --git a/test/color-space.cpp b/test/color-space.cpp\n> new file mode 100644\n> index 000000000000..7d45b2179bca\n> --- /dev/null\n> +++ b/test/color-space.cpp\n> @@ -0,0 +1,105 @@\n> +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> +/*\n> + * Copyright (C) 2022, Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> + *\n> + * libcamera ColorSpace test\n> + */\n> +\n> +#include <array>\n> +#include <iostream>\n> +\n> +#include <libcamera/color_space.h>\n> +\n> +#include \"test.h\"\n> +\n> +using namespace libcamera;\n> +using namespace std;\n> +\n> +class ColorSpaceTest : public Test\n> +{\n> +protected:\n> +\tint run()\n> +\t{\n> +\t\tif (ColorSpace::toString(std::nullopt) != \"Unset\") {\n> +\t\t\tstd::cerr << \"Conversion from nullopt to string failed\" << std::endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\tconst std::array<std::pair<ColorSpace, std::string>, 10> colorSpaces = { {\n> +\t\t\t{ ColorSpace::Raw, \"RAW\" },\n> +\t\t\t{ ColorSpace::Srgb, \"sRGB\" },\n> +\t\t\t{ ColorSpace::Sycc, \"sYCC\" },\n> +\t\t\t{ ColorSpace::Smpte170m, \"SMPTE170M\" },\n> +\t\t\t{ ColorSpace::Rec709, \"Rec709\" },\n> +\t\t\t{ ColorSpace::Rec2020, \"Rec2020\" },\n> +\t\t\t{\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Raw,\n> +\t\t\t\t\tColorSpace::TransferFunction::Linear,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::None,\n> +\t\t\t\t\tColorSpace::Range::Limited\n> +\t\t\t\t},\n> +\t\t\t\t\"RAW/Linear/None/Limited\"\n> +\t\t\t}, {\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Smpte170m,\n> +\t\t\t\t\tColorSpace::TransferFunction::Srgb,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::Rec601,\n> +\t\t\t\t\tColorSpace::Range::Full\n> +\t\t\t\t},\n> +\t\t\t\t\"SMPTE170M/sRGB/Rec601/Full\"\n> +\t\t\t}, {\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Rec709,\n> +\t\t\t\t\tColorSpace::TransferFunction::Rec709,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::Rec709,\n> +\t\t\t\t\tColorSpace::Range::Full\n> +\t\t\t\t},\n> +\t\t\t\t\"Rec709/Rec709/Rec709/Full\"\n> +\t\t\t}, {\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Rec2020,\n> +\t\t\t\t\tColorSpace::TransferFunction::Linear,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::Rec2020,\n> +\t\t\t\t\tColorSpace::Range::Limited\n> +\t\t\t\t},\n> +\t\t\t\t\"Rec2020/Linear/Rec2020/Limited\"\n> +\t\t\t},\n> +\t\t} };\n> +\n> +\t\tfor (const auto &[colorSpace, name] : colorSpaces) {\n> +\t\t\tif (colorSpace.toString() != name) {\n> +\t\t\t\tstd::cerr\n> +\t\t\t\t\t<< \"Conversion from ColorSpace to string failed: \"\n> +\t\t\t\t\t<< \"expected \" << name\n> +\t\t\t\t\t<< \", got \" << colorSpace.toString()\n> +\t\t\t\t\t<< std::endl;\n> +\t\t\t\treturn TestFail;\n> +\t\t\t}\n> +\n> +\t\t\tif (ColorSpace::fromString(name) != colorSpace) {\n> +\t\t\t\tstd::cerr\n> +\t\t\t\t\t<< \"Conversion from string \"\n> +\t\t\t\t\t<< name << \" to ColorSpace failed\"\n> +\t\t\t\t\t<< std::endl;\n> +\t\t\t\treturn TestFail;\n> +\t\t\t}\n> +\t\t}\n> +\n> +\t\tif (ColorSpace::fromString(\"Invalid\")) {\n> +\t\t\tstd::cerr << \"Conversion from invalid name string to color space succeeded\"\n> +\t\t\t\t  << std::endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\tif (ColorSpace::fromString(\"Rec709/Rec709/Rec710/Limited\")) {\n> +\t\t\tstd::cerr << \"Conversion from invalid component string to color space succeeded\"\n> +\t\t\t\t  << std::endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\treturn TestPass;\n> +\t}\n> +};\n> +\n> +TEST_REGISTER(ColorSpaceTest)\n> diff --git a/test/meson.build b/test/meson.build\n> index d050bfa14cec..6cc778415dc8 100644\n> --- a/test/meson.build\n> +++ b/test/meson.build\n> @@ -26,6 +26,7 @@ subdir('v4l2_subdevice')\n>   subdir('v4l2_videodevice')\n>   \n>   public_tests = [\n> +    ['color-space',                     'color-space.cpp'],\n>       ['geometry',                        'geometry.cpp'],\n>       ['public-api',                      'public-api.cpp'],\n>       ['signal',                          'signal.cpp'],","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 57540C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 23 Aug 2022 23:29:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9FAFB61FBD;\n\tWed, 24 Aug 2022 01:29:34 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 748F661FA0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 24 Aug 2022 01:29:33 +0200 (CEST)","from [IPV6:2401:4900:1f3f:806e:6647:8e5c:f441:ca9a] (unknown\n\t[IPv6:2401:4900:1f3f:806e:6647:8e5c:f441:ca9a])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7EDD02B3;\n\tWed, 24 Aug 2022 01:29:32 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1661297374;\n\tbh=YQsZU99aONjZqClkBPm5o8bqLorMBLRnsZzAV+pnTrM=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=cl9CzykhfOiM/X7ZnDcJdKyEppmm9sjOQ28OnTtkBUJuDc9DESiTv3PVbJ6svFX5+\n\tL6ePTH1viFQ/R8GStmSN1IXLvSQxucbT2Utx6hbqqIUjI4fHDRRqP9SOK36Pl87Xu5\n\tRE4hFWFQbhjrio2rkvKtnbltUHwoIVtFt679ncXMEaMFxZk3buMTDFqcunU7ao5uuo\n\terrdpUFDD3PfxkxCPr8r3AfxVaUjTuJ4OxU+kHYbZk8BDJoEyAoDo0CkmMvO6IIhaq\n\tUBFy3E/yjLg1c8u05UC2IByzx1dr8o/8YixLlJf2PMagt+jIUJ9zGUH2nweTK2naKb\n\tFwsfL32o2b3AA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1661297373;\n\tbh=YQsZU99aONjZqClkBPm5o8bqLorMBLRnsZzAV+pnTrM=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=akKKe1Kk6B/v8xydmU7HkOGbMv12SEAMKdRxyTJTO/SPtsc9Gs4//9c/ICKUpG9ui\n\tjn/1bosjAdYEkO9/rA5MsosYNZq3eFMkesuSnS09ob9yGOsb1UIqdxv7b6iw7a8s8n\n\tZJMzbO8mBK2aH2+pL8R/S7hX8G2Y3G5GEvpEF4SA="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"akKKe1Kk\"; dkim-atps=neutral","Message-ID":"<533bd640-f4cd-3c4f-798b-806e55c6c4d8@ideasonboard.com>","Date":"Wed, 24 Aug 2022 04:59:28 +0530","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.12.0","Content-Language":"en-US","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220823174314.14881-1-laurent.pinchart@ideasonboard.com>\n\t<20220823174314.14881-5-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220823174314.14881-5-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 4/6] test: Add a ColorSpace test","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>","From":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24778,"web_url":"https://patchwork.libcamera.org/comment/24778/","msgid":"<20220825195237.GP109174@pyrite.rasen.tech>","date":"2022-08-25T19:52:37","subject":"Re: [libcamera-devel] [PATCH 4/6] test: Add a ColorSpace test","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"On Tue, Aug 23, 2022 at 08:43:12PM +0300, Laurent Pinchart via libcamera-devel wrote:\n> Add a test for the ColorSpace class that exercises the toString() and\n> fromString() functions.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  test/color-space.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++\n>  test/meson.build     |   1 +\n>  2 files changed, 106 insertions(+)\n>  create mode 100644 test/color-space.cpp\n> \n> diff --git a/test/color-space.cpp b/test/color-space.cpp\n> new file mode 100644\n> index 000000000000..7d45b2179bca\n> --- /dev/null\n> +++ b/test/color-space.cpp\n> @@ -0,0 +1,105 @@\n> +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> +/*\n> + * Copyright (C) 2022, Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> + *\n> + * libcamera ColorSpace test\n> + */\n> +\n> +#include <array>\n> +#include <iostream>\n> +\n> +#include <libcamera/color_space.h>\n> +\n> +#include \"test.h\"\n> +\n> +using namespace libcamera;\n> +using namespace std;\n> +\n> +class ColorSpaceTest : public Test\n> +{\n> +protected:\n> +\tint run()\n> +\t{\n> +\t\tif (ColorSpace::toString(std::nullopt) != \"Unset\") {\n> +\t\t\tstd::cerr << \"Conversion from nullopt to string failed\" << std::endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\tconst std::array<std::pair<ColorSpace, std::string>, 10> colorSpaces = { {\n> +\t\t\t{ ColorSpace::Raw, \"RAW\" },\n> +\t\t\t{ ColorSpace::Srgb, \"sRGB\" },\n> +\t\t\t{ ColorSpace::Sycc, \"sYCC\" },\n> +\t\t\t{ ColorSpace::Smpte170m, \"SMPTE170M\" },\n> +\t\t\t{ ColorSpace::Rec709, \"Rec709\" },\n> +\t\t\t{ ColorSpace::Rec2020, \"Rec2020\" },\n> +\t\t\t{\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Raw,\n> +\t\t\t\t\tColorSpace::TransferFunction::Linear,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::None,\n> +\t\t\t\t\tColorSpace::Range::Limited\n> +\t\t\t\t},\n> +\t\t\t\t\"RAW/Linear/None/Limited\"\n> +\t\t\t}, {\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Smpte170m,\n> +\t\t\t\t\tColorSpace::TransferFunction::Srgb,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::Rec601,\n> +\t\t\t\t\tColorSpace::Range::Full\n> +\t\t\t\t},\n> +\t\t\t\t\"SMPTE170M/sRGB/Rec601/Full\"\n> +\t\t\t}, {\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Rec709,\n> +\t\t\t\t\tColorSpace::TransferFunction::Rec709,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::Rec709,\n> +\t\t\t\t\tColorSpace::Range::Full\n> +\t\t\t\t},\n> +\t\t\t\t\"Rec709/Rec709/Rec709/Full\"\n> +\t\t\t}, {\n> +\t\t\t\tColorSpace{\n> +\t\t\t\t\tColorSpace::Primaries::Rec2020,\n> +\t\t\t\t\tColorSpace::TransferFunction::Linear,\n> +\t\t\t\t\tColorSpace::YcbcrEncoding::Rec2020,\n> +\t\t\t\t\tColorSpace::Range::Limited\n> +\t\t\t\t},\n> +\t\t\t\t\"Rec2020/Linear/Rec2020/Limited\"\n> +\t\t\t},\n> +\t\t} };\n> +\n> +\t\tfor (const auto &[colorSpace, name] : colorSpaces) {\n> +\t\t\tif (colorSpace.toString() != name) {\n> +\t\t\t\tstd::cerr\n> +\t\t\t\t\t<< \"Conversion from ColorSpace to string failed: \"\n> +\t\t\t\t\t<< \"expected \" << name\n> +\t\t\t\t\t<< \", got \" << colorSpace.toString()\n> +\t\t\t\t\t<< std::endl;\n> +\t\t\t\treturn TestFail;\n> +\t\t\t}\n> +\n> +\t\t\tif (ColorSpace::fromString(name) != colorSpace) {\n> +\t\t\t\tstd::cerr\n> +\t\t\t\t\t<< \"Conversion from string \"\n> +\t\t\t\t\t<< name << \" to ColorSpace failed\"\n> +\t\t\t\t\t<< std::endl;\n> +\t\t\t\treturn TestFail;\n> +\t\t\t}\n> +\t\t}\n> +\n> +\t\tif (ColorSpace::fromString(\"Invalid\")) {\n> +\t\t\tstd::cerr << \"Conversion from invalid name string to color space succeeded\"\n> +\t\t\t\t  << std::endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\tif (ColorSpace::fromString(\"Rec709/Rec709/Rec710/Limited\")) {\n> +\t\t\tstd::cerr << \"Conversion from invalid component string to color space succeeded\"\n> +\t\t\t\t  << std::endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\treturn TestPass;\n> +\t}\n> +};\n> +\n> +TEST_REGISTER(ColorSpaceTest)\n> diff --git a/test/meson.build b/test/meson.build\n> index d050bfa14cec..6cc778415dc8 100644\n> --- a/test/meson.build\n> +++ b/test/meson.build\n> @@ -26,6 +26,7 @@ subdir('v4l2_subdevice')\n>  subdir('v4l2_videodevice')\n>  \n>  public_tests = [\n> +    ['color-space',                     'color-space.cpp'],\n>      ['geometry',                        'geometry.cpp'],\n>      ['public-api',                      'public-api.cpp'],\n>      ['signal',                          'signal.cpp'],","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 3635FC3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 25 Aug 2022 19:52:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A54BC61FBA;\n\tThu, 25 Aug 2022 21:52:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0103361FA0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 25 Aug 2022 21:52:44 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CDF7F2B3;\n\tThu, 25 Aug 2022 21:52:43 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1661457166;\n\tbh=FxvhEvtImVY97aqKVsa7KgTUmEr19XtBrXkNaIUZ0Wk=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=dGRqcL2n+lK9LLDbYPWipueoliDYzqCIXo2VVEJa4rwG5ioq50q9H1E0lfgDPOq0Z\n\tP8AjUPESht43pXDFpimiRz4Ikn39LdSd+w+VOAXfrA7D5cXixvbLE7oD6NUSCFcJpE\n\tBsudkRmr/9q7462JFLJiuP9/ldRSPHnWjXZczUQhQhIMqBkqsMgo9xTOOi5Tww7uQg\n\tMAO98CI2zxvfrBmxQ5CJLV/TegoNs0nKvFnTAPzX/yQr3GSGVp5eo3N886dBk97Abf\n\tnItD05L4/3BGpJNcT/YEc8n6thfPHycKa6xDCz3b919Y+wMIkVAybiIcgpGW2bftAl\n\tbvmM34Yf6Dmyg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1661457164;\n\tbh=FxvhEvtImVY97aqKVsa7KgTUmEr19XtBrXkNaIUZ0Wk=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=N6wgzcYfrcZJ/LGbH0hzcGRO/kcoec+sBySWD/XZ/ubJPOJBBzA+ghbfhlgjrGBtP\n\t8ZZgQrFdrYbBggaujhaP3Zo/CQjDjdnoUAbYyrs59pT+5P/MZe5dkHP7o1Hb7hwqzp\n\t+ACHVSwRuZA2SwaFZy6HtBr+PZ2GEp34E1AvC9z0="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"N6wgzcYf\"; dkim-atps=neutral","Date":"Thu, 25 Aug 2022 14:52:37 -0500","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20220825195237.GP109174@pyrite.rasen.tech>","References":"<20220823174314.14881-1-laurent.pinchart@ideasonboard.com>\n\t<20220823174314.14881-5-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20220823174314.14881-5-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 4/6] test: Add a ColorSpace test","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>","From":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"paul.elder@ideasonboard.com","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]