[{"id":37429,"web_url":"https://patchwork.libcamera.org/comment/37429/","msgid":"<0cba1a19-cf5d-4f0c-97c7-eee73af84a14@ideasonboard.com>","date":"2025-12-17T16:19:28","subject":"Re: [PATCH v9 21/26] ipa: libipa: module: Add\n\tcreateSelfEnumeratingAlgorithm","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 12. 17. 11:01 keltezéssel, Bryan O'Donoghue írta:\n> Create an algorithm without having YAML data input.\n> \n> Reviewed-by: Milan Zamazal <mzamazal@redhat.com>\n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n> ---\n>   src/ipa/libipa/module.cpp | 34 +++++++++++++++++++++++++++++\n>   src/ipa/libipa/module.h   | 46 +++++++++++++++++++++++++++++----------\n>   2 files changed, 68 insertions(+), 12 deletions(-)\n> \n> diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp\n> index a95dca696..8e86ca823 100644\n> --- a/src/ipa/libipa/module.cpp\n> +++ b/src/ipa/libipa/module.cpp\n> @@ -83,6 +83,40 @@ namespace ipa {\n>    * \\return The list of instantiated algorithms\n>    */\n> \n> +/**\n> + * \\fn int Module::createSelfEnumeratingAlgorithm(Context &context, const std::string &name)\n> + * \\brief Create and initialise a self-enumerating algorithm by name\n> + *\n> + * This function creates an algorithm instance from the registered algorithm\n> + * factories using only the algorithm name, without requiring YAML configuration\n> + * data.\n> + *\n> + * This is useful for algorithms that don't require external configuration\n> + * parameters and can self-configure or use default values.\n> + *\n> + * \\param[in] context The IPA context to pass to the algorithm's init function\n> + * \\param[in] name The name of the algorithm to instantiate\n> + *\n> + * \\return 0 on success, negative errno value on failure:\n> + *         -EINVAL if the algorithm is not found in the factory registry\n> + *         Other negative values if algorithm initialisation fails\n> + */\n> +\n> +/**\n> + * \\fn int Module::createAlgorithmCommon(Context &context, const YamlObject &algoData, const std::string &name)\n> + * \\brief Common helper fucntion to allow createSelfEnumeratingAlgorithm and createAlgorithm share code\n> + *\n> + * Worker method which allows sharing of common code in the Yaml and self-initialising algorithm case\n> + *\n> + * \\param[in] context The IPA context to pass to the algorithm's init function\n> + * \\param[in] algoData Yaml object\n> + * \\param[in] name The name of the algorithm to instantiate\n> + *\n> + * \\return 0 on success, negative errno value on failure:\n> + *         -EINVAL if the algorithm is not found in the factory registry\n> + *         Other negative values if algorithm initialisation fails\n> + */\n> +\n>   /**\n>    * \\fn Module::createAlgorithms()\n>    * \\brief Create algorithms from YAML configuration data\n> diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h\n> index c27af7718..d309606f2 100644\n> --- a/src/ipa/libipa/module.h\n> +++ b/src/ipa/libipa/module.h\n> @@ -70,22 +70,25 @@ public:\n>   \t\tfactories().push_back(factory);\n>   \t}\n> \n> -private:\n> -\tint createAlgorithm(Context &context, const YamlObject &data)\n> +\tint createSelfEnumeratingAlgorithm(Context &context, const std::string &name)\n>   \t{\n> -\t\tconst auto &[name, algoData] = *data.asDict().begin();\n> +\t\tYamlObject dummy;\n> \n> -\t\t/*\n> -\t\t * Optionally, algorithms can be disabled via the tuning file\n> -\t\t * by including enabled: false as a parameter within the\n> -\t\t * algorithm tuning data. This is not an error, so we return 0.\n> -\t\t */\n> -\t\tif (!algoData[\"enabled\"].get<bool>(true)) {\n> -\t\t\tLOG(IPAModuleAlgo, Info)\n> -\t\t\t\t<< \"Algorithm '\" << name << \"' disabled via tuning file\";\n> -\t\t\treturn 0;\n> +\t\tstd::unique_ptr<Algorithm<Module>> algo = createAlgorithm(name);\n> +\t\tif (!algo) {\n> +\t\t\tLOG(IPAModuleAlgo, Error)\n> +\t\t\t\t<< \"Algorithm '\" << name << \"' not found\";\n> +\t\t\treturn -EINVAL;\n>   \t\t}\n> \n> +\t\tcontext.selfInitialising = true;\n\nThe fact that such a variable is required in the `Context` type should be documented.\nAnd which component is supposed to set it to false between calls?\n\nBut in any case, I think this is not the ideal approach. I feel like adding an `init()`\nthat does not take a `YamlObject` parameter might be better. (With a default implementation\nin `Algorithm` returning `-ENOTSUP` or similar.)\n\nAnd just to confirm, this is needed so that if the \"Ccm\" is not explicitly present in the\ntuning file, then it is automatically loaded if the gpu is used (but not if the cpu is used)?\n\n\nRegards,\nBarnabás Pőcze\n\n\n> +\n> +\t\treturn createAlgorithmCommon(context, dummy, name);\n> +\t}\n> +\n> +private:\n> +\tint createAlgorithmCommon(Context &context, const YamlObject &algoData, const std::string &name)\n> +\t{\n>   \t\tstd::unique_ptr<Algorithm<Module>> algo = createAlgorithm(name);\n>   \t\tif (!algo) {\n>   \t\t\tLOG(IPAModuleAlgo, Error)\n> @@ -104,9 +107,28 @@ private:\n>   \t\t\t<< \"Instantiated algorithm '\" << name << \"'\";\n> \n>   \t\talgorithms_.push_back(std::move(algo));\n> +\n>   \t\treturn 0;\n>   \t}\n> \n> +\tint createAlgorithm(Context &context, const YamlObject &data)\n> +\t{\n> +\t\tconst auto &[name, algoData] = *data.asDict().begin();\n> +\n> +\t\t/*\n> +\t\t * Optionally, algorithms can be disabled via the tuning file\n> +\t\t * by including enabled: false as a parameter within the\n> +\t\t * algorithm tuning data. This is not an error, so we return 0.\n> +\t\t */\n> +\t\tif (!algoData[\"enabled\"].get<bool>(true)) {\n> +\t\t\tLOG(IPAModuleAlgo, Info)\n> +\t\t\t\t<< \"Algorithm '\" << name << \"' disabled via tuning file\";\n> +\t\t\treturn 0;\n> +\t\t}\n> +\n> +\t\treturn createAlgorithmCommon(context, algoData, name);\n> +\t}\n> +\n>   \tstatic std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)\n>   \t{\n>   \t\tfor (const AlgorithmFactoryBase<Module> *factory : factories()) {\n> --\n> 2.52.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 36226C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 17 Dec 2025 16:19:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6045261A60;\n\tWed, 17 Dec 2025 17:19:34 +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 E8D3861A35\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 17 Dec 2025 17:19:32 +0100 (CET)","from [192.168.33.22] (185.221.143.114.nat.pool.zt.hu\n\t[185.221.143.114])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E1F94324;\n\tWed, 17 Dec 2025 17:19:25 +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=\"P6qGEK2T\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1765988366;\n\tbh=EyGqqvBqBZPmarlhfocNTsiPq4nZZd3T2WC7+XjK790=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=P6qGEK2Tz/5YANcWNxpOcyDkZG+H9i/xrvk8LdImrGed3qK1qcEzlyXZPWYIZa8zy\n\tqwAMwlkdbluTOd1WNkH08UeXaUcABKFGqEgHM6YbyWlcjZiFSMiMi/uQrY+yMX4Kvg\n\tyKKR0lPbbI9O7OxRfncgSUDbc8uIEM7fY2yiIM0Q=","Message-ID":"<0cba1a19-cf5d-4f0c-97c7-eee73af84a14@ideasonboard.com>","Date":"Wed, 17 Dec 2025 17:19:28 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v9 21/26] ipa: libipa: module: Add\n\tcreateSelfEnumeratingAlgorithm","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tlibcamera-devel@lists.libcamera.org","Cc":"pavel@ucw.cz, Milan Zamazal <mzamazal@redhat.com>","References":"<20251217100138.82525-1-bryan.odonoghue@linaro.org>\n\t<E3dtlTe9_K8YI2eKFk_Iq2lMpDZSr8vrANA8UNsALRgbraHJNrqsXooJgOPkXtep80NHPJsz5DL59TJtspnhYQ==@protonmail.internalid>\n\t<20251217100138.82525-22-bryan.odonoghue@linaro.org>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20251217100138.82525-22-bryan.odonoghue@linaro.org>","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>"}},{"id":37430,"web_url":"https://patchwork.libcamera.org/comment/37430/","msgid":"<854ippkq0l.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-12-17T16:54:34","subject":"Re: [PATCH v9 21/26] ipa: libipa: module: Add\n\tcreateSelfEnumeratingAlgorithm","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n\n> Hi\n>\n> 2025. 12. 17. 11:01 keltezéssel, Bryan O'Donoghue írta:\n>> Create an algorithm without having YAML data input.\n>> Reviewed-by: Milan Zamazal <mzamazal@redhat.com>\n>> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n>> ---\n>>   src/ipa/libipa/module.cpp | 34 +++++++++++++++++++++++++++++\n>>   src/ipa/libipa/module.h   | 46 +++++++++++++++++++++++++++++----------\n>>   2 files changed, 68 insertions(+), 12 deletions(-)\n>> diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp\n>> index a95dca696..8e86ca823 100644\n>> --- a/src/ipa/libipa/module.cpp\n>> +++ b/src/ipa/libipa/module.cpp\n>> @@ -83,6 +83,40 @@ namespace ipa {\n>>    * \\return The list of instantiated algorithms\n>>    */\n>> +/**\n>> + * \\fn int Module::createSelfEnumeratingAlgorithm(Context &context, const std::string &name)\n>> + * \\brief Create and initialise a self-enumerating algorithm by name\n>> + *\n>> + * This function creates an algorithm instance from the registered algorithm\n>> + * factories using only the algorithm name, without requiring YAML configuration\n>> + * data.\n>> + *\n>> + * This is useful for algorithms that don't require external configuration\n>> + * parameters and can self-configure or use default values.\n>> + *\n>> + * \\param[in] context The IPA context to pass to the algorithm's init function\n>> + * \\param[in] name The name of the algorithm to instantiate\n>> + *\n>> + * \\return 0 on success, negative errno value on failure:\n>> + *         -EINVAL if the algorithm is not found in the factory registry\n>> + *         Other negative values if algorithm initialisation fails\n>> + */\n>> +\n>> +/**\n>> + * \\fn int Module::createAlgorithmCommon(Context &context, const YamlObject &algoData, const std::string &name)\n>> + * \\brief Common helper fucntion to allow createSelfEnumeratingAlgorithm and createAlgorithm share code\n>> + *\n>> + * Worker method which allows sharing of common code in the Yaml and self-initialising algorithm case\n>> + *\n>> + * \\param[in] context The IPA context to pass to the algorithm's init function\n>> + * \\param[in] algoData Yaml object\n>> + * \\param[in] name The name of the algorithm to instantiate\n>> + *\n>> + * \\return 0 on success, negative errno value on failure:\n>> + *         -EINVAL if the algorithm is not found in the factory registry\n>> + *         Other negative values if algorithm initialisation fails\n>> + */\n>> +\n>>   /**\n>>    * \\fn Module::createAlgorithms()\n>>    * \\brief Create algorithms from YAML configuration data\n>> diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h\n>> index c27af7718..d309606f2 100644\n>> --- a/src/ipa/libipa/module.h\n>> +++ b/src/ipa/libipa/module.h\n>> @@ -70,22 +70,25 @@ public:\n>>   \t\tfactories().push_back(factory);\n>>   \t}\n>> -private:\n>> -\tint createAlgorithm(Context &context, const YamlObject &data)\n>> +\tint createSelfEnumeratingAlgorithm(Context &context, const std::string &name)\n>>   \t{\n>> -\t\tconst auto &[name, algoData] = *data.asDict().begin();\n>> +\t\tYamlObject dummy;\n>> -\t\t/*\n>> -\t\t * Optionally, algorithms can be disabled via the tuning file\n>> -\t\t * by including enabled: false as a parameter within the\n>> -\t\t * algorithm tuning data. This is not an error, so we return 0.\n>> -\t\t */\n>> -\t\tif (!algoData[\"enabled\"].get<bool>(true)) {\n>> -\t\t\tLOG(IPAModuleAlgo, Info)\n>> -\t\t\t\t<< \"Algorithm '\" << name << \"' disabled via tuning file\";\n>> -\t\t\treturn 0;\n>> +\t\tstd::unique_ptr<Algorithm<Module>> algo = createAlgorithm(name);\n>> +\t\tif (!algo) {\n>> +\t\t\tLOG(IPAModuleAlgo, Error)\n>> +\t\t\t\t<< \"Algorithm '\" << name << \"' not found\";\n>> +\t\t\treturn -EINVAL;\n>>   \t\t}\n>> +\t\tcontext.selfInitialising = true;\n>\n> The fact that such a variable is required in the `Context` type should be documented.\n> And which component is supposed to set it to false between calls?\n>\n> But in any case, I think this is not the ideal approach. I feel like adding an `init()`\n> that does not take a `YamlObject` parameter might be better. (With a default implementation\n> in `Algorithm` returning `-ENOTSUP` or similar.)\n>\n> And just to confirm, this is needed so that if the \"Ccm\" is not explicitly present in the\n> tuning file, then it is automatically loaded if the gpu is used (but not if the cpu is used)?\n\nYes.  But we agreed at today's meeting that this and the related patches\ncan be dropped and the identity matrix can be specified in the default\nuncalibrated.yaml instead.  This will slow down non-CCM CPU ISP but this\nis not a big issue because GPU ISP will be the default, the default\nmatrix in uncalibrated.yaml can be commented out if needed and I'll work\non the simple IPA algorithms cleanup, which should avoid the need of\nsimilar hacks in future.\n\n>\n> Regards,\n> Barnabás Pőcze\n>\n>\n>> +\n>> +\t\treturn createAlgorithmCommon(context, dummy, name);\n>> +\t}\n>> +\n>> +private:\n>> +\tint createAlgorithmCommon(Context &context, const YamlObject &algoData, const std::string &name)\n>> +\t{\n>>   \t\tstd::unique_ptr<Algorithm<Module>> algo = createAlgorithm(name);\n>>   \t\tif (!algo) {\n>>   \t\t\tLOG(IPAModuleAlgo, Error)\n>> @@ -104,9 +107,28 @@ private:\n>>   \t\t\t<< \"Instantiated algorithm '\" << name << \"'\";\n>>   \t\talgorithms_.push_back(std::move(algo));\n>> +\n>>   \t\treturn 0;\n>>   \t}\n>> +\tint createAlgorithm(Context &context, const YamlObject &data)\n>> +\t{\n>> +\t\tconst auto &[name, algoData] = *data.asDict().begin();\n>> +\n>> +\t\t/*\n>> +\t\t * Optionally, algorithms can be disabled via the tuning file\n>> +\t\t * by including enabled: false as a parameter within the\n>> +\t\t * algorithm tuning data. This is not an error, so we return 0.\n>> +\t\t */\n>> +\t\tif (!algoData[\"enabled\"].get<bool>(true)) {\n>> +\t\t\tLOG(IPAModuleAlgo, Info)\n>> +\t\t\t\t<< \"Algorithm '\" << name << \"' disabled via tuning file\";\n>> +\t\t\treturn 0;\n>> +\t\t}\n>> +\n>> +\t\treturn createAlgorithmCommon(context, algoData, name);\n>> +\t}\n>> +\n>>   \tstatic std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)\n>>   \t{\n>>   \t\tfor (const AlgorithmFactoryBase<Module> *factory : factories()) {\n>> --\n>> 2.52.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 5C6E6C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 17 Dec 2025 16:54:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7E81661A61;\n\tWed, 17 Dec 2025 17:54:41 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EAE0161A35\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 17 Dec 2025 17:54:39 +0100 (CET)","from mail-wr1-f69.google.com (mail-wr1-f69.google.com\n\t[209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-324-kddWiUHbOgGnVyiV0k6PVw-1; Wed, 17 Dec 2025 11:54:37 -0500","by mail-wr1-f69.google.com with SMTP id\n\tffacd0b85a97d-43101a351c7so2971375f8f.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 17 Dec 2025 08:54:37 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb ([213.175.46.86])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-4310adf6fc1sm5152787f8f.40.2025.12.17.08.54.34\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 17 Dec 2025 08:54:35 -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=\"NrN3D8BA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1765990478;\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=FM3qrNwvI81oKbfWtzuiLYD8hPT5YC8tVMEzukQPelE=;\n\tb=NrN3D8BA70p2+qRQaYXrfZ8QOhUqTmAtaNuUK3qYs3LgiDX8xgsW95GKrhB3kMT4vISdfS\n\tZnAFuM6B5s0ByqGeYXtByVqUH+3huXvFPVz5IYTY4o6uv+gE8qUM7vcKQ2OsoxD9lV08iq\n\tUnAtYfIuzlcrfzxDQ8psFDNQRZGbITs=","X-MC-Unique":"kddWiUHbOgGnVyiV0k6PVw-1","X-Mimecast-MFC-AGG-ID":"kddWiUHbOgGnVyiV0k6PVw_1765990476","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1765990476; x=1766595276;\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=nwn5Sib4MuYPtx0jQBCpYvlJbbeMPLcg2Xhu7VUYOMw=;\n\tb=thZ6Ti9kUBNIG6BLiuk2ghygEqbw6sTfuRuQmgqriyLy0oCmv0GcKV1uL1yW1DPd6/\n\ti1C0/9sgRAFvo2igay00hmUpxSoi7LGHLrB2nF0ELHAWPwvM9YWd64aUNRjxhv4DagZ7\n\tMebqFzx0kAr/n3uC9rnncZV3Lg/DQWLQJTrHqurYXSdT8gX8CIKJrtfItoK6lU4WErZn\n\tHcfHaBd5euaKsCSW+LbXP9z+xQz5rjWRnNhfu6mZOi9BY5SgIikMXpOjEk99BjF2/nP2\n\taPyDF70dQeENR9eFWgAuZfEGBDm9SoF8XvhYi+cZnKpTO6R9hjKf29RxFs6qcrvuOOjH\n\tlp+w==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCVEuc1UWcicvp7G+I+gjur7P3qlP8l+1Pq0JJFaqRfm1UMXZnA8P01tRjweqiu/zphAqUvE9iqrle0fZH1BGWQ=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YxH0RSKlZl9FNQVaZ678Rr6kNd09qYKHRZTAXIpdPOzZJxv5Tn5\n\tb1tyUpHmcUZaQ4h6WaMggYPSxgHQLymFjYPMmeILvivj2iALLhR6Now6bfLa5Dv0owOWF6S948a\n\twHCoQ1iefZu8nGkSH5/kx4sqGkc520dKRgLPu5fhRHsVl4ByfLszvWzE87b8hIDVAIUb+EpU0V2\n\tI=","X-Gm-Gg":"AY/fxX7UWfYTJhtdksa1J9PlzaTJVXfBnT+iRNMJi4xTlKOVq6Le8T5NBFMIfn+5tzJ\n\t6DBvxIYH1LJa9jqkSOwstS+RIq9gS+pBBmbHBglSZSExpyX4FVNLzbTxJ7rkc4vgmQY05t6rcHw\n\tINvPX9MF9+NBhzxlQdRJ7WUm2/OcCzvfaZIQV14pZC5WJ7aEeP1vDxBfyyUQt1rRYT5yyAffrZ6\n\tat9dQg1BGR/xxWaYnXECsjISypSHHyftOUWIoAFIM1IFZBReRo/us9dXj9V73/XjoEgbQIW3DtQ\n\trlG7/FjS5X3ChoEx9wpihm7yZLREOgDnDVBtFXTSP7JBow999rc/wS2+XmVid5+QL2eV0LaOxcI\n\tc42toXxEHOFq2uSRZ/SvoxFSdbg==","X-Received":["by 2002:a05:6000:310e:b0:430:fcda:4529 with SMTP id\n\tffacd0b85a97d-430fcda47a1mr12379809f8f.61.1765990476222; \n\tWed, 17 Dec 2025 08:54:36 -0800 (PST)","by 2002:a05:6000:310e:b0:430:fcda:4529 with SMTP id\n\tffacd0b85a97d-430fcda47a1mr12379792f8f.61.1765990475742; \n\tWed, 17 Dec 2025 08:54:35 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IESreHSRVaebCVk15Y9wbEoc20aI7sAqj6dXgLLgZtLS3qAifMLXJopXSG4SxsmxHPVSdWgAg==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tlibcamera-devel@lists.libcamera.org,  pavel@ucw.cz","Subject":"Re: [PATCH v9 21/26] ipa: libipa: module: Add\n\tcreateSelfEnumeratingAlgorithm","In-Reply-To":"<0cba1a19-cf5d-4f0c-97c7-eee73af84a14@ideasonboard.com> (\n\t=?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Wed,\n\t17 Dec 2025  17:19:28 +0100\")","References":"<20251217100138.82525-1-bryan.odonoghue@linaro.org>\n\t<E3dtlTe9_K8YI2eKFk_Iq2lMpDZSr8vrANA8UNsALRgbraHJNrqsXooJgOPkXtep80NHPJsz5DL59TJtspnhYQ==@protonmail.internalid>\n\t<20251217100138.82525-22-bryan.odonoghue@linaro.org>\n\t<0cba1a19-cf5d-4f0c-97c7-eee73af84a14@ideasonboard.com>","Date":"Wed, 17 Dec 2025 17:54:34 +0100","Message-ID":"<854ippkq0l.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":"wXYwA41b9p69UWoWSykau0J0OJnkfFATAMENnmBe_Ng_1765990476","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>"}}]