[{"id":37182,"web_url":"https://patchwork.libcamera.org/comment/37182/","msgid":"<85cy4v4rnr.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-12-03T13:32:40","subject":"Re: [PATCH v3 09/22] libcamera: software_isp: Move useful items\n\tfrom DebayerCpu to Debayer base class","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Bryan O'Donoghue <bryan.odonoghue@linaro.org> writes:\n\n> The DebayerCpu class has a number of variables, embedded structures and\n> methods which are useful to DebayerGpu implementation.\n>\n> Move relevant variables and methods to base class.\n>\n> Since we want to call setParams() from the GPUISP and reuse the code in\n> the existing CPUISP as a first step, we need to move all of the\n> dependent variables in DebayerCPU to the Debayer base class including\n> LookupTable and redCcm_.\n>\n> The DebayerEGL class will ultimately be able to consume both the CCM and\n> non-CCM data.\n>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n> ---\n>  src/libcamera/software_isp/debayer.cpp     | 149 +++++++++++++++++++++\n>  src/libcamera/software_isp/debayer.h       |  35 ++++-\n>  src/libcamera/software_isp/debayer_cpu.cpp |   2 +-\n>  src/libcamera/software_isp/debayer_cpu.h   |  41 +-----\n>  4 files changed, 185 insertions(+), 42 deletions(-)\n>\n> diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp\n> index e9e18c488..1e3f08673 100644\n> --- a/src/libcamera/software_isp/debayer.cpp\n> +++ b/src/libcamera/software_isp/debayer.cpp\n> @@ -18,6 +18,12 @@ namespace libcamera {\n>   * \\brief Struct to hold the debayer parameters.\n>   */\n>  \n> +/**\n> + * \\fn Debayer::Debayer(const GlobalConfiguration &configuration)\n> + * \\brief Construct a Debayer object\n> + * \\param[in] configuration Global configuration reference\n> + */\n> +\n>  /**\n>   * \\var DebayerParams::kRGBLookupSize\n>   * \\brief Size of a color lookup table\n> @@ -167,6 +173,24 @@ Debayer::~Debayer()\n>   */\n>  \n>  /**\n> + * \\fn const SharedFD &Debayer::getStatsFD()\n> + * \\brief Get the file descriptor for the statistics.\n\nI think \\brief lines (here and below) shouldn't contain final dots but I\nhappily leave dealing with this to the maintainers.\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\n\n> + *\n> + * This file descriptor provides access to the output statistics buffer\n> + * associated with the current debayering process.\n> + *\n> + * \\return The file descriptor pointing to the statistics data.\n> + */\n> +\n> +/**\n> + * \\fn unsigned int Debayer::frameSize()\n> + * \\brief Get the output frame size.\n> + *\n> + * \\return The total output frame size in bytes as configured for the\n> + * current stream.\n> + */\n> +\n> + /**\n>   * \\var Signal<FrameBuffer *> Debayer::inputBufferReady\n>   * \\brief Signals when the input buffer is ready\n>   */\n> @@ -176,4 +200,129 @@ Debayer::~Debayer()\n>   * \\brief Signals when the output buffer is ready\n>   */\n>  \n> +/**\n> + * \\struct Debayer::DebayerInputConfig\n> + * \\brief Structure describing the incoming Bayer parameters.\n> + *\n> + * The DebayerInputConfig structure defines the characteristics of the raw\n> + * Bayer frame being processed, including:\n> + *  - The Bayer pattern dimensions (\\ref patternSize)\n> + *  - Memory layout parameters such as stride and bytes per pixel (\\ref bpp)\n> + *  - A list of supported output pixel formats.\n> + *\n> + * \\var Debayer::DebayerInputConfig::patternSize\n> + * Size of the Bayer pattern in pixels. For standard Bayer formats such as\n> + * BGGR, GRBG, GBRG, and RGGB, this is typically 2×2 pixels.\n> + *\n> + * \\var Debayer::DebayerInputConfig::bpp\n> + * Number of bytes used per pixel in memory. This reflects storage size,\n> + * not precision.\n> + *\n> + * \\var Debayer::DebayerInputConfig::stride\n> + * Line stride in bytes for the Bayer input frame.\n> + *\n> + * \\var Debayer::DebayerInputConfig::outputFormats\n> + * List of pixel formats supported as output for this input configuration.\n> + */\n> +\n> +/**\n> + * \\struct Debayer::DebayerOutputConfig\n> + * \\brief Structure describing the output frame configuration.\n> + *\n> + * Defines how the output of the debayer process is laid out in memory.\n> + * It includes per-pixel size, stride, and total frame size.\n> + *\n> + * \\var Debayer::DebayerOutputConfig::bpp\n> + * Bytes used per pixel in the output format.\n> + *\n> + * \\var Debayer::DebayerOutputConfig::stride\n> + * Line stride in bytes for the output frame.\n> + *\n> + * \\var Debayer::DebayerOutputConfig::frameSize\n> + * Total frame size in bytes for the output buffer.\n> + */\n> +\n> +/**\n> + * \\var Debayer::inputConfig_\n> + * \\brief Input configuration parameters for the current debayer operation.\n> + *\n> + * Holds metadata describing the incoming Bayer image layout, including\n> + * pattern size, bytes per pixel, stride, and supported output formats.\n> + * Populated during configuration.\n> + */\n> +\n> +/**\n> + * \\var Debayer::outputConfig_\n> + * \\brief Output configuration data for the debayered frame.\n> + *\n> + * Contains bytes per pixel, stride, and total frame size for the\n> + * output image buffer. Set during stream configuration.\n> + */\n> +\n> +/**\n> + * \\var Debayer::red_\n> + * \\brief Lookup table for red channel gain and correction values.\n> + *\n> + * This table provides precomputed per-pixel or per-intensity\n> + * correction values for the red color channel used during debayering.\n> + */\n> +\n> +/**\n> + * \\var Debayer::green_\n> + * \\brief Lookup table for green channel gain and correction values.\n> + *\n> + * This table provides precomputed per-pixel or per-intensity\n> + * correction values for the green color channel used during debayering.\n> + */\n> +\n> +/**\n> + * \\var Debayer::blue_\n> + * \\brief Lookup table for blue channel gain and correction values.\n> + *\n> + * This table provides precomputed per-pixel or per-intensity\n> + * correction values for the blue color channel used during debayering.\n> + */\n> +\n> +/**\n> + * \\var Debayer::redCcm_\n> + * \\brief Red channel Color Correction Matrix (CCM) lookup table.\n> + *\n> + * Contains coefficients for green channel color correction.\n> + */\n> +\n> +/**\n> + * \\var Debayer::greenCcm_\n> + * \\brief Green channel Color Correction Matrix (CCM) lookup table.\n> + *\n> + * Contains coefficients for green channel color correction.\n> + */\n> +\n> +/**\n> + * \\var Debayer::blueCcm_\n> + * \\brief Blue channel Color Correction Matrix (CCM) lookup table.\n> + *\n> + * Contains coefficients for blue channel color correction.\n> + */\n> +\n> +/**\n> + * \\var Debayer::gammaLut_\n> + * \\brief Gamma correction lookup table.\n> + */\n> +\n> +/**\n> + * \\var Debayer::swapRedBlueGains_\n> + * \\brief Flag indicating whether red and blue channel gains should be swapped.\n> + *\n> + * Used when the Bayer pattern order indicates that red/blue color channels are\n> + * reversed.\n> + */\n> +\n> +/**\n> + * \\var Debayer::bench_\n> + * \\brief Benchmarking utility instance for performance measurements.\n> + *\n> + * Used internally to track timing and performance metrics during\n> + * debayer processing.\n> + */\n> +\n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h\n> index ba033d440..b562985a6 100644\n> --- a/src/libcamera/software_isp/debayer.h\n> +++ b/src/libcamera/software_isp/debayer.h\n> @@ -14,11 +14,14 @@\n>  #include <stdint.h>\n>  \n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/object.h>\n>  #include <libcamera/base/signal.h>\n>  \n>  #include <libcamera/geometry.h>\n>  #include <libcamera/stream.h>\n>  \n> +#include \"libcamera/internal/global_configuration.h\"\n> +#include \"libcamera/internal/software_isp/benchmark.h\"\n>  #include \"libcamera/internal/software_isp/debayer_params.h\"\n>  \n>  namespace libcamera {\n> @@ -27,9 +30,10 @@ class FrameBuffer;\n>  \n>  LOG_DECLARE_CATEGORY(Debayer)\n>  \n> -class Debayer\n> +class Debayer : public Object\n>  {\n>  public:\n> +\tDebayer (const GlobalConfiguration &configuration) : bench_(configuration) {};\n>  \tvirtual ~Debayer() = 0;\n>  \n>  \tvirtual int configure(const StreamConfiguration &inputCfg,\n> @@ -45,9 +49,38 @@ public:\n>  \n>  \tvirtual SizeRange sizes(PixelFormat inputFormat, const Size &inputSize) = 0;\n>  \n> +\tvirtual const SharedFD &getStatsFD() = 0;\n> +\n> +\tunsigned int frameSize() { return outputConfig_.frameSize; }\n> +\n>  \tSignal<FrameBuffer *> inputBufferReady;\n>  \tSignal<FrameBuffer *> outputBufferReady;\n>  \n> +\tstruct DebayerInputConfig {\n> +\t\tSize patternSize;\n> +\t\tunsigned int bpp;\n> +\t\tunsigned int stride;\n> +\t\tstd::vector<PixelFormat> outputFormats;\n> +\t};\n> +\n> +\tstruct DebayerOutputConfig {\n> +\t\tunsigned int bpp;\n> +\t\tunsigned int stride;\n> +\t\tunsigned int frameSize;\n> +\t};\n> +\n> +\tDebayerInputConfig inputConfig_;\n> +\tDebayerOutputConfig outputConfig_;\n> +\tDebayerParams::LookupTable red_;\n> +\tDebayerParams::LookupTable green_;\n> +\tDebayerParams::LookupTable blue_;\n> +\tDebayerParams::CcmLookupTable redCcm_;\n> +\tDebayerParams::CcmLookupTable greenCcm_;\n> +\tDebayerParams::CcmLookupTable blueCcm_;\n> +\tDebayerParams::LookupTable gammaLut_;\n> +\tbool swapRedBlueGains_;\n> +\tBenchmark bench_;\n> +\n>  private:\n>  \tvirtual Size patternSize(PixelFormat inputFormat) = 0;\n>  };\n> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\n> index b92c6a904..e55599f09 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.cpp\n> +++ b/src/libcamera/software_isp/debayer_cpu.cpp\n> @@ -42,7 +42,7 @@ namespace libcamera {\n>   * \\param[in] configuration The global configuration\n>   */\n>  DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats, const GlobalConfiguration &configuration)\n> -\t: stats_(std::move(stats)), bench_(configuration)\n> +\t: Debayer(configuration), stats_(std::move(stats))\n>  {\n>  \t/*\n>  \t * Reading from uncached buffers may be very slow.\n> diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h\n> index aff32491e..ecc4f9dd0 100644\n> --- a/src/libcamera/software_isp/debayer_cpu.h\n> +++ b/src/libcamera/software_isp/debayer_cpu.h\n> @@ -17,16 +17,14 @@\n>  \n>  #include <libcamera/base/object.h>\n>  \n> -#include \"libcamera/internal/software_isp/benchmark.h\"\n>  #include \"libcamera/internal/bayer_format.h\"\n> -#include \"libcamera/internal/global_configuration.h\"\n>  #include \"libcamera/internal/software_isp/swstats_cpu.h\"\n>  \n>  #include \"debayer.h\"\n>  \n>  namespace libcamera {\n>  \n> -class DebayerCpu : public Debayer, public Object\n> +class DebayerCpu : public Debayer\n>  {\n>  public:\n>  \tDebayerCpu(std::unique_ptr<SwStatsCpu> stats, const GlobalConfiguration &configuration);\n> @@ -41,21 +39,8 @@ public:\n>  \tstrideAndFrameSize(const PixelFormat &outputFormat, const Size &size);\n>  \tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params);\n>  \tSizeRange sizes(PixelFormat inputFormat, const Size &inputSize);\n> -\n> -\t/**\n> -\t * \\brief Get the file descriptor for the statistics\n> -\t *\n> -\t * \\return the file descriptor pointing to the statistics\n> -\t */\n>  \tconst SharedFD &getStatsFD() { return stats_->getStatsFD(); }\n>  \n> -\t/**\n> -\t * \\brief Get the output frame size\n> -\t *\n> -\t * \\return The output frame size\n> -\t */\n> -\tunsigned int frameSize() { return outputConfig_.frameSize; }\n> -\n>  private:\n>  \t/**\n>  \t * \\brief Called to debayer 1 line of Bayer input data to output format\n> @@ -112,19 +97,6 @@ private:\n>  \ttemplate<bool addAlphaByte, bool ccmEnabled>\n>  \tvoid debayer10P_RGRG_BGR888(uint8_t *dst, const uint8_t *src[]);\n>  \n> -\tstruct DebayerInputConfig {\n> -\t\tSize patternSize;\n> -\t\tunsigned int bpp; /* Memory used per pixel, not precision */\n> -\t\tunsigned int stride;\n> -\t\tstd::vector<PixelFormat> outputFormats;\n> -\t};\n> -\n> -\tstruct DebayerOutputConfig {\n> -\t\tunsigned int bpp; /* Memory used per pixel, not precision */\n> -\t\tunsigned int stride;\n> -\t\tunsigned int frameSize;\n> -\t};\n> -\n>  \tint getInputConfig(PixelFormat inputFormat, DebayerInputConfig &config);\n>  \tint getOutputConfig(PixelFormat outputFormat, DebayerOutputConfig &config);\n>  \tint setupStandardBayerOrder(BayerFormat::Order order);\n> @@ -140,20 +112,11 @@ private:\n>  \t/* Max. supported Bayer pattern height is 4, debayering this requires 5 lines */\n>  \tstatic constexpr unsigned int kMaxLineBuffers = 5;\n>  \n> -\tDebayerParams::LookupTable red_;\n> -\tDebayerParams::LookupTable green_;\n> -\tDebayerParams::LookupTable blue_;\n> -\tDebayerParams::CcmLookupTable redCcm_;\n> -\tDebayerParams::CcmLookupTable greenCcm_;\n> -\tDebayerParams::CcmLookupTable blueCcm_;\n> -\tDebayerParams::LookupTable gammaLut_;\n>  \tdebayerFn debayer0_;\n>  \tdebayerFn debayer1_;\n>  \tdebayerFn debayer2_;\n>  \tdebayerFn debayer3_;\n>  \tRectangle window_;\n> -\tDebayerInputConfig inputConfig_;\n> -\tDebayerOutputConfig outputConfig_;\n>  \tstd::unique_ptr<SwStatsCpu> stats_;\n>  \tstd::vector<uint8_t> lineBuffers_[kMaxLineBuffers];\n>  \tunsigned int lineBufferLength_;\n> @@ -161,8 +124,6 @@ private:\n>  \tunsigned int lineBufferIndex_;\n>  \tunsigned int xShift_; /* Offset of 0/1 applied to window_.x */\n>  \tbool enableInputMemcpy_;\n> -\tbool swapRedBlueGains_;\n> -\tBenchmark bench_;\n>  };\n>  \n>  } /* namespace libcamera */","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 462E5C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  3 Dec 2025 13:32:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4DAB760F1F;\n\tWed,  3 Dec 2025 14:32:48 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A25A1609D8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  3 Dec 2025 14:32:46 +0100 (CET)","from mail-wr1-f72.google.com (mail-wr1-f72.google.com\n\t[209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-609-C34ZrNWuMMuDue-ZQKB2Rw-1; Wed, 03 Dec 2025 08:32:44 -0500","by mail-wr1-f72.google.com with SMTP id\n\tffacd0b85a97d-42e2e2ee360so2709056f8f.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 03 Dec 2025 05:32:44 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-42e1c5c3041sm36690926f8f.6.2025.12.03.05.32.41\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 03 Dec 2025 05:32:41 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"UMdhSt4x\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1764768765;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=h5YoUpO64+aua2DYKjxKER3kc5ZYEMtt6rSYD10C2UQ=;\n\tb=UMdhSt4x7PU6YnkonHJmAeH5LwxPUURWbbunwIfZRlHlHHLjtcEsBZCiqmJVmgfKrN8OLC\n\tKX2S1Ce96ZnE2orUwFayGGdVfPDfUJ5wj41c6myPCyFLS+Y9WwIsq77g5MMPnlpUfI/yo0\n\tGZ5mU2JjUz0NNaQvKtgyptrLQZJybXE=","X-MC-Unique":"C34ZrNWuMMuDue-ZQKB2Rw-1","X-Mimecast-MFC-AGG-ID":"C34ZrNWuMMuDue-ZQKB2Rw_1764768763","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1764768763; x=1765373563;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=EI6wNiVplNefkAttz6J6JjeT9WPzEqt8qoKQQhz/HZY=;\n\tb=xTT/I1Lylnf1UtamJ4KTjZjC9G3UOLeN8fsEte+itQih62edDU4V4KMC4f++oOdFPT\n\tz79XdPXtQDm6tEv+u9zKxOQONPQC2Rz2uAbTelVEsrTaNFJMgaliswsCjZN63gTk8gBT\n\t9V/+F/xRCA83OkXJ7jaKPEZ2TT2LQ+t56U5lhPaTOxORGXnoB9xe8HSpIZ66FYzpVgLX\n\tLTWjDqDgguOqnBYE5uVhsEg14yis1ChGDDd5yWHJlflBePc+Y+euKwD0KbaKpcJmys9F\n\tOL/x8nES2j50kWTIZaFFse3yShpIi+5Ee05mdnwRDExKJeMTYDwMJ29Fue36vI10iAH8\n\tbcgQ==","X-Gm-Message-State":"AOJu0YyXConWl4DXgU7zEaXnuX9Jl8UlybmpetdACCphpbc5qgq64Uvd\n\t21DcuV4eQq/tRYmqeyIAIfIeSy0Ha+K++vnvXt0JNaYHUCSO+VaqiXCHOI9l8woxqcaRRd6UnEv\n\ttQnPIRTv6eUKn0YksF63iXoqKCfniQJ2xAq6dRZta6yL7/pQsIErP1rydKT7vmIYq++YCSurxqt\n\tzGtOF74PE=","X-Gm-Gg":"ASbGncu3YAc5JjaJoqAO7Pd/Le96uRfxzVuweYGKgkBT4Rv80nRTnZ3n9/g9xyqEl79\n\tdVs3Pb83Dv2A9ycz/L7F93uGdWXtOqU7nZvJAuQid11MY8BQFjzcLhvsworbAV2VcgfPg1+/nMa\n\t6981i9h3GCDM5ubxOxSDoA/adJd4odNUs1gSBbU7DcxZ3r/xqR7IZtwGNB2rEL5iQy48M0BlGgP\n\ta0bBCG31tUnOBsat1J16oqNRJuH7JQ1Oj3/oP9MtOyfxmJBAGnMBouHoweaxmp0mbc55rdtgwvE\n\tr6cqZFMnz1ebgFAy5u0Ys+Z2XTYOGnLbk2lS5qcEsIXHOwBFkelnD5qkRAJYrVS6R3OTAmt6pRT\n\tcge5FGXFHkEzFLck/d2f/nAmTReElvug4GDkxijt9lwtv3cWHLMYB1Ysc37TUqss=","X-Received":["by 2002:a05:6000:22c2:b0:42b:4081:ccb8 with SMTP id\n\tffacd0b85a97d-42f73172889mr2310043f8f.23.1764768762753; \n\tWed, 03 Dec 2025 05:32:42 -0800 (PST)","by 2002:a05:6000:22c2:b0:42b:4081:ccb8 with SMTP id\n\tffacd0b85a97d-42f73172889mr2310010f8f.23.1764768762253; \n\tWed, 03 Dec 2025 05:32:42 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IECoKjuPB7Lh4id4ygRPO7IJwkdeWX+ikB0n0AB1d/2lE5BvOcb/uuN8gTnDhlU+WqOa3WaFg==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"libcamera-devel@lists.libcamera.org,  pavel@ucw.cz,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v3 09/22] libcamera: software_isp: Move useful items\n\tfrom DebayerCpu to Debayer base class","In-Reply-To":"<20251202133157.661407-10-bryan.odonoghue@linaro.org> (Bryan\n\tO'Donoghue's message of \"Tue, 2 Dec 2025 13:31:40 +0000\")","References":"<20251202133157.661407-1-bryan.odonoghue@linaro.org>\n\t<20251202133157.661407-10-bryan.odonoghue@linaro.org>","Date":"Wed, 03 Dec 2025 14:32:40 +0100","Message-ID":"<85cy4v4rnr.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"OxM4hei8m6JMgAngNFF0WklVR7HfWI26Q0qghSg9A6o_1764768763","X-Mimecast-Originator":"redhat.com","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>"}}]