[{"id":39699,"web_url":"https://patchwork.libcamera.org/comment/39699/","msgid":"<178404903889.3931061.18201615979552760575@ping.linuxembedded.co.uk>","date":"2026-07-14T17:10:38","subject":"Re: [PATCH v5 23/36] ipa: libipa: lsc: Introduce LscAlgorithm","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Jacopo Mondi (2026-07-08 16:51:05)\n> Introduce the LscAlgorithm class that implements the LSC algorithm\n> for libipa.\n> \n> The class uses two backends (LscPolynomial and LscTable) to perform\n> tuning file parsing and re-scaling of the LSC gains.\n> \n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> ---\n>  src/ipa/libipa/lsc.cpp | 209 +++++++++++++++++++++++++++++++++++++++++++++++++\n>  src/ipa/libipa/lsc.h   |  42 ++++++++++\n>  2 files changed, 251 insertions(+)\n> \n> diff --git a/src/ipa/libipa/lsc.cpp b/src/ipa/libipa/lsc.cpp\n> index 382cafc04ab4..cf748b766d1a 100644\n> --- a/src/ipa/libipa/lsc.cpp\n> +++ b/src/ipa/libipa/lsc.cpp\n> @@ -7,6 +7,13 @@\n>  \n>  #include \"lsc.h\"\n>  \n> +#include <libcamera/base/log.h>\n> +\n> +#include <libcamera/control_ids.h>\n> +\n> +#include \"lsc_polynomial.h\"\n> +#include \"lsc_table.h\"\n> +\n>  /**\n>   * \\file lsc.h\n>   * \\brief libipa LSC algorithm\n> @@ -14,6 +21,8 @@\n>  \n>  namespace libcamera {\n>  \n> +LOG_DEFINE_CATEGORY(Lsc)\n> +\n>  namespace ipa {\n>  \n>  namespace lsc {\n> @@ -39,6 +48,206 @@ namespace lsc {\n>  \n>  } /* namespace lsc */\n>  \n> +/**\n> + * \\class LscAlgorithm\n> + * \\brief libIPA LSC algorithm implementation\n> + *\n> + * Due to the optical characteristics of the lens, the light intensity received\n> + * by the sensor is not uniform. The Lens Shading Correction algorithm applies\n> + * multipliers to all pixels to compensate for the lens shading effect.\n> + *\n> + * The LscAlgorithm implements the libipa Lens Shading Correction algorithm\n> + * using an implementation of the LscImplementation interface.\n> + *\n> + * It provides support for parsing the tuning file content and generates tables\n> + * of per-colour temperature gains that IPA algorithms can use to program their\n\nhrm this sounds like it's per colour - which have temperature gains.\nReworking seems awkward to do with just adjusting a '-'. Trying deeper:\n\n\"\"\"\nThis class provides support for parsing the tuning file content and\ngenerates tables indexed by colour temperature to store per-channel\ngains for the IPA algorithm to be able to program the LSC engine.\n\"\"\"\n\nMaybe that's too much - but it's only the 'per-colour' part that I'm\nworried about!\n\n\n> + * LSC engine.\n> + *\n> + * The init() function parses the tuning file and loads the gain tables either\n> + * in tabular form (LscTable) or as radial polynomials (LscPolynomial). The gain\n> + * tables are organized per-colour temperature with per-colour components gain\n> + * vectors or polynomial coefficients.\n\nOh it sneaks in here again too.\n\n> + *\n> + * At LscAlgorithm::configure() time the LSC tables are re-sampled on the\n> + * sensor's crop rectangle in use to adapt them to the configuration in use for\n> + * a streaming session. Polynomial LSC tables support re-sampling and can be\n> + * applied to any sensor configuration. Grid-based LSC tables cannot currently\n> + * be re-sampled and the configuration as parsed from the tuning file is used\n> + * for all sensor configurations providing best-effort results.\n> + *\n> + * \\todo: Implement grid based re-sampling\n\nNo colon needed on the \\todo\n\n> + *\n> + * When the IPA algorithms wants to get access to the (re-sampled) tables to\n> + * program its LSC engine, it uses LscAlgorithm::interpolateComponents() to get\n> + * an LSC table interpolated by the LscAlgorithm class for the specified colour\n> + * temperature. If the algorithm wants to access the non-interpolated tables it\n> + * can retrieve them using LscAlgorithm::getComponents().\n> + */\n> +\n> +/**\n> + * \\param[in] tuningData The tuning data\n> + * \\param[in] sensorSize The physical sensor size\n> + * \\param[in] controls The IPA list of supported controls\n> + *\n> + * Parse \\a tuningData according to the settings specified in \\a descriptor to\n> + * populate the LSC data and registers LSC controls in \\a controls.\n> + *\n> + * \\return 0 on success, a negative error code otherwise\n> + */\n> +int LscAlgorithm::init(const ValueNode &tuningData, const Size &sensorSize,\n> +                      ControlInfoMap::Map &controls)\n> +{\n> +       polynomial_ = false;\n> +\n> +       std::string type = tuningData[\"type\"].get<std::string>(\"table\");\n> +       if (type == \"table\") {\n> +               impl_ = std::make_unique<LscTable>();\n> +               LOG(Lsc, Debug) << \"Using table-based Lsc\";\n> +       } else if (type == \"polynomial\") {\n> +               /*\n> +                * \\todo: Most likely the reference frame should be native_size.\n\nno colon\n\n\n> +                * Let's wait how the internal discussions progress.\n> +                */\n> +               impl_ = std::make_unique<LscPolynomial>(sensorSize);\n> +               polynomial_ = true;\n> +               LOG(Lsc, Debug) << \"Using polynomial Lsc\";\n> +       } else {\n> +               LOG(Lsc, Error) << \"Unsupported Lsc algorithm '\"\n> +                               << type << \"'\";\n> +               return -EINVAL;\n> +       }\n> +\n> +       const ValueNode &yamlSets = tuningData[\"sets\"];\n> +       if (!yamlSets.isList()) {\n> +               LOG(Lsc, Error) << \"'sets' parameter not found in tuning file\";\n> +               return -EINVAL;\n> +       }\n> +\n> +       int ret = impl_->parseLscData(yamlSets);\n> +       if (ret)\n> +               return ret;\n> +\n> +       controls[&controls::LensShadingCorrectionEnable] =\n> +               ControlInfo(false, true, true);\n> +\n> +       return 0;\n> +}\n> +\n> +/**\n> + * \\param[in] state The LSC active state\n> + * \\param[in] analogCrop The current sensor analog crop rectangle\n> + * \\param[in] xPos List of horizontal positions of the LSC grid nodes\n> + * \\param[in] yPos List of vertical positions of the LSC grid nodes\n> + *\n> + * Re-sample the LSC data for an \\a analogCrop.\n> + *\n> + * LSC tables are generated at tuning time using a known sensor configuration.\n> + * When a new streaming session is started, it might use a different sensor\n> + * configuration for which the LSC tables need to be adjusted to.\n> + *\n> + * This function re-generates the LSC tables to adapt them to a new sensor\n> + * configuration, specifically it re-samples the LSC data for a new \\a\n> + * analogCrop on a grid specified by \\a xPos and \\a yPos. Re-sampling of\n> + * LSC data is currently supported by polynomial-based LSC tables.\n> + *\n> + * \\sa LscImplementation::sampleForCrop\n> + *\n> + * \\return 0 on success, a negative error code otherwise\n> + */\n> +int LscAlgorithm::configure(lsc::ActiveState &state, const Rectangle &analogCrop,\n> +                           const std::vector<double> &xPos,\n> +                           const std::vector<double> &yPos)\n> +{\n> +       LOG(Lsc, Debug) << \"Sample Lsc data for \" << analogCrop;\n> +       lsc::ComponentsMap lscData =\n> +               impl_->sampleForCrop(analogCrop, xPos, yPos);\n> +\n> +       /*\n> +        * Retain a copy of the components table.\n> +        *\n> +        * We could avoid a copy here if getComponents() could\n> +        * return sets_.data() but I wasn't able to work around the\n> +        * compiler refusing it.\n> +        */\n> +       lscData_ = lscData;\n> +\n> +       sets_.setData(std::move(lscData));\n> +       state.enabled = true;\n> +\n> +       return 0;\n> +}\n> +\n> +/**\n> + * \\brief Queue a request to the lsc algorithm\n> + * \\param[in] state The lsc active state\n> + * \\param[in] context The lsc frame context\n> + * \\param[in] controls The list of controls associated with a Request\n> + *\n> + * Queue a new list of \\a controls to the lsc algorithm.\n> + * The only supported control is controls::LensShadingCorrectionEnable.\n> + */\n> +void LscAlgorithm::queueRequest(lsc::ActiveState &state,\n> +                               lsc::FrameContext &context,\n> +                               const ControlList &controls)\n> +{\n> +       const auto &lscEnable = controls.get(controls::LensShadingCorrectionEnable);\n> +       if (lscEnable && *lscEnable != state.enabled) {\n> +               state.enabled = *lscEnable;\n> +\n> +               LOG(Lsc, Debug)\n> +                       << (state.enabled ? \"Enabling\" : \"Disabling\") << \" Lsc\";\n> +\n> +               context.update = true;\n> +       }\n> +\n> +       context.enabled = state.enabled;\n> +}\n> +\n> +/**\n> + * \\brief Populate the list of lsc metadata\n> + * \\param[in] context The lsc frame context\n> + * \\param[in] metadata The list of metadata\n> + *\n> + * Populates the list of \\a metadata with controls handled by the LscAlgorithm\n> + * class. The only supported metadata is controls::LensShadingCorrectionEnable.\n> + */\n> +void LscAlgorithm::process(lsc::FrameContext &context, ControlList &metadata)\n> +{\n> +       metadata.set(controls::LensShadingCorrectionEnable, context.enabled);\n> +}\n> +\n> +/**\n> + * \\fn LscAlgorithm::interpolateComponents\n> + * \\brief Interpolate the LSC tables for a given colour temperature\n> + * \\param[in] ct The colour temperature\n> + *\n> + * LSC tables are generated using different colour temperatures during the\n> + * tuning phase.\n> + *\n> + * This function returns the interpolated LSC data for a given \\a ct\n> + * colour temperature.\n> + *\n> + * IPA algorithm can use this function to obtain a list of gains per-colour\n> + * component to program their LSC engines with every time a significant enough\n\nIf we're reworking, \"a list of per-colour component gains\" sounds better\n... I don't know what grammar rule makes it that way - but it just seems\nlike it should be that way around ;-)\n\nBut we have the same issue as we had with 'per-colour temperature' maybe\nit needs to be:\n\n  of per-colour-component gains ?\n \n\n\n\n\n> + * change in colour temperature is detected.\n> + *\n> + * Calling this function is only valid after LscAlgorithm::configure() has been\n> + * called. An empty components list is returned otherwise.\n> + *\n> + * \\return The LSC gains table interpolated for temperature \\a ct\n> + */\n> +\n> +/**\n> + * \\fn LscAlgorithm::getComponents\n> + *\n> + * Return the map of LSC data per colour temperature.\n> + *\n> + * Calling this function is only valid after LscAlgorithm::configure() has been\n> + * called. An empty components list is returned otherwise.\n> + *\n> + * \\return The map of LSC gains tables per colour-temperature\n\nI think throughout the use of 'per' and then 'two words' needs to be\nnormalised to be consistent.\n\n\nWith that:\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> + */\n> +\n>  } /* namespace ipa */\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/ipa/libipa/lsc.h b/src/ipa/libipa/lsc.h\n> index 73519564feff..9a51d32c3464 100644\n> --- a/src/ipa/libipa/lsc.h\n> +++ b/src/ipa/libipa/lsc.h\n> @@ -7,6 +7,17 @@\n>  \n>  #pragma once\n>  \n> +#include <memory>\n> +#include <vector>\n> +\n> +#include <libcamera/controls.h>\n> +#include <libcamera/geometry.h>\n> +\n> +#include \"libcamera/internal/value_node.h\"\n> +\n> +#include \"interpolator.h\"\n> +#include \"lsc_base.h\"\n> +\n>  namespace libcamera {\n>  \n>  namespace ipa {\n> @@ -24,6 +35,37 @@ struct FrameContext {\n>  \n>  } /* namespace lsc */\n>  \n> +class LscAlgorithm\n> +{\n> +public:\n> +       int init(const ValueNode &tuningData, const Size &sensorSize,\n> +                ControlInfoMap::Map &controls);\n> +\n> +       int configure(lsc::ActiveState &state, const Rectangle &analogCrop,\n> +                     const std::vector<double> &xPos,\n> +                     const std::vector<double> &yPos);\n> +\n> +       void queueRequest(lsc::ActiveState &state, lsc::FrameContext &context,\n> +                         const ControlList &controls);\n> +       void process(lsc::FrameContext &context, ControlList &metadata);\n> +\n> +       const lsc::Components interpolateComponents(unsigned int ct)\n> +       {\n> +               return sets_.getInterpolated(ct);\n> +       }\n> +\n> +       const lsc::ComponentsMap getComponents()\n> +       {\n> +               return lscData_;\n> +       }\n> +\n> +private:\n> +       std::unique_ptr<LscImplementation> impl_;\n> +       Interpolator<lsc::Components> sets_;\n> +       lsc::ComponentsMap lscData_;\n> +       bool polynomial_;\n> +};\n> +\n>  } /* namespace ipa */\n>  \n>  } /* namespace libcamera */\n> \n> -- \n> 2.54.0\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 8ABC7BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Jul 2026 17:10:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 478F066144;\n\tTue, 14 Jul 2026 19:10:43 +0200 (CEST)","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 2C62C66137\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Jul 2026 19:10:42 +0200 (CEST)","from monstersaurus.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 9E9F2558;\n\tTue, 14 Jul 2026 19:09:47 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"GHTRK5m3\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1784048987;\n\tbh=OAtUPjXSQX2Q1XWL+TTYEaTYtYYhqLa2dZOr+rxYcIk=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=GHTRK5m36CvgIWDMvyR/3w4U9jUpeW0bXwvycgmR7at6WLYeiY3XjwXZLuayAsIw5\n\t3SUlAtQEAVryWTQQpUXdtmRXvL7k1UJ9uSCFfzXMA/e8k3Ob8fVJmmndyN075L5rYR\n\txlXeXqeGDSWmGZZeVEtcjwrn9Zkp3WMICV+nP+Fw=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260708-libipa-algorithms-v5-23-0759d0359f52@ideasonboard.com>","References":"<20260708-libipa-algorithms-v5-0-0759d0359f52@ideasonboard.com>\n\t<20260708-libipa-algorithms-v5-23-0759d0359f52@ideasonboard.com>","Subject":"Re: [PATCH v5 23/36] ipa: libipa: lsc: Introduce LscAlgorithm","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tStefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 14 Jul 2026 18:10:38 +0100","Message-ID":"<178404903889.3931061.18201615979552760575@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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":39846,"web_url":"https://patchwork.libcamera.org/comment/39846/","msgid":"<cebebba6-e382-491a-b552-423dbcf12762@ideasonboard.com>","date":"2026-07-24T15:40:11","subject":"Re: [PATCH v5 23/36] ipa: libipa: lsc: Introduce LscAlgorithm","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 07. 08. 17:51 keltezéssel, Jacopo Mondi írta:\n> Introduce the LscAlgorithm class that implements the LSC algorithm\n> for libipa.\n> \n> The class uses two backends (LscPolynomial and LscTable) to perform\n> tuning file parsing and re-scaling of the LSC gains.\n> \n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> ---\n>   src/ipa/libipa/lsc.cpp | 209 +++++++++++++++++++++++++++++++++++++++++++++++++\n>   src/ipa/libipa/lsc.h   |  42 ++++++++++\n>   2 files changed, 251 insertions(+)\n> \n> [...]\n> diff --git a/src/ipa/libipa/lsc.h b/src/ipa/libipa/lsc.h\n> index 73519564feff..9a51d32c3464 100644\n> --- a/src/ipa/libipa/lsc.h\n> +++ b/src/ipa/libipa/lsc.h\n> @@ -7,6 +7,17 @@\n>   \n>   #pragma once\n>   \n> +#include <memory>\n> +#include <vector>\n> +\n> +#include <libcamera/controls.h>\n> +#include <libcamera/geometry.h>\n> +\n> +#include \"libcamera/internal/value_node.h\"\n> +\n> +#include \"interpolator.h\"\n> +#include \"lsc_base.h\"\n> +\n>   namespace libcamera {\n>   \n>   namespace ipa {\n> @@ -24,6 +35,37 @@ struct FrameContext {\n>   \n>   } /* namespace lsc */\n>   \n> +class LscAlgorithm\n> +{\n> +public:\n> +\tint init(const ValueNode &tuningData, const Size &sensorSize,\n> +\t\t ControlInfoMap::Map &controls);\n> +\n> +\tint configure(lsc::ActiveState &state, const Rectangle &analogCrop,\n> +\t\t      const std::vector<double> &xPos,\n> +\t\t      const std::vector<double> &yPos);\n> +\n> +\tvoid queueRequest(lsc::ActiveState &state, lsc::FrameContext &context,\n> +\t\t\t  const ControlList &controls);\n> +\tvoid process(lsc::FrameContext &context, ControlList &metadata);\n> +\n> +\tconst lsc::Components interpolateComponents(unsigned int ct)\n> +\t{\n> +\t\treturn sets_.getInterpolated(ct);\n> +\t}\n> +\n> +\tconst lsc::ComponentsMap getComponents()\n> +\t{\n> +\t\treturn lscData_;\n> +\t}\n> +\n> +private:\n> +\tstd::unique_ptr<LscImplementation> impl_;\n> +\tInterpolator<lsc::Components> sets_;\n> +\tlsc::ComponentsMap lscData_;\n> +\tbool polynomial_;\n\nThis does not seem to be used anywhere?\n\n\n> +};\n> +\n>   } /* namespace ipa */\n>   \n>   } /* namespace libcamera */\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 0DAA3BDE17\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2026 15:40:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C298467F35;\n\tFri, 24 Jul 2026 17:40:15 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3B50667F22\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2026 17:40:14 +0200 (CEST)","from [192.168.33.42] (185.182.215.156.nat.pool.zt.hu\n\t[185.182.215.156])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5CABC524;\n\tFri, 24 Jul 2026 17:39:12 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"AVmHz+WO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1784907552;\n\tbh=/uJFeKq/wL8hjJjIurvvM1z6Dis27VZT2FHR+1AgXkQ=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=AVmHz+WO4sAj6OuweDrZVnDaO3TnN7yv08pZVqsrMPGtJ261p8wQ9wfWHjuAGivag\n\tuqA7pSJxX2FqccPcixd4g9CJdVGpTQuwbnWSJJ9qKPdbnyQC3QXdt9DqO+2BjUaT2H\n\tVBbeSydJFGNUvJfirSfi5dswKfc9/sPGUXTlsxyY=","Message-ID":"<cebebba6-e382-491a-b552-423dbcf12762@ideasonboard.com>","Date":"Fri, 24 Jul 2026 17:40:11 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v5 23/36] ipa: libipa: lsc: Introduce LscAlgorithm","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org,\n\tStefan Klug <stefan.klug@ideasonboard.com>","References":"<20260708-libipa-algorithms-v5-0-0759d0359f52@ideasonboard.com>\n\t<20260708-libipa-algorithms-v5-23-0759d0359f52@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260708-libipa-algorithms-v5-23-0759d0359f52@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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>"}}]