[{"id":35360,"web_url":"https://patchwork.libcamera.org/comment/35360/","msgid":"<175501542933.560048.10088529717980079122@ping.linuxembedded.co.uk>","date":"2025-08-12T16:17:09","subject":"Re: [PATCH] libcamera: ipa_proxy: Log configuration file path","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Stefan Klug (2025-08-12 15:38:04)\n> It is often helpful to know which tuning file is used. Add a log\n> statement with INFO level for that.\n> \n> As the core logic has multiple return paths, adding the log statement is\n> not straight forward. Extract finder logic into a ipaConfigurationFile()\n> function and call that with the name and optionally the fallbackName\n> from the configurationFile() function.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n> \n> Hi all,\n> \n> I posted a similar patch a while ago here:\n> https://lists.libcamera.org/pipermail/libcamera-devel/2025-January/048324.html\n> \n> We didn't merge it back then because it should be central in ipa_proxy.\n> Adding it there is a bit ugly because there are a few return paths. I\n> tried to use a scope_exit but that doesn't work as the exit function is\n> called after confPath is moved out to the caller. So I settled for\n> refactoring which imho makes the configurationFile() function also\n> easier to read.\n\nAs a related option which could also be complementary to this patch -\nI've been pondering about putting the tuning file path into the camera\nproperties. That makes it easy to find from either cam -c1 -p - or from\ncamshark!\n\n - https://git.uk.ideasonboard.com/kbingham/libcamera/commit/da431b3599311b754d18f9ac6325c98f4ed8f87f\n - https://git.uk.ideasonboard.com/kbingham/libcamera/commit/04e79e0733c70b065b0cbb070d8263d3c416fc67\n\nBut alas, I don't think we can have something like that in a central\nlocation easily as there's no common path that has access to the IPA Proxy path\nand camera properties for all cameras I don't think.\n\n\n\n> \n> Best regards,\n> Stefan\n> \n> ---\n>  src/libcamera/ipa_proxy.cpp | 143 ++++++++++++++++++++----------------\n>  1 file changed, 79 insertions(+), 64 deletions(-)\n> \n> diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp\n> index 9907b9615ec7..b5c13a30f1d4 100644\n> --- a/src/libcamera/ipa_proxy.cpp\n> +++ b/src/libcamera/ipa_proxy.cpp\n> @@ -25,6 +25,78 @@ namespace libcamera {\n>  \n>  LOG_DEFINE_CATEGORY(IPAProxy)\n>  \n> +namespace {\n> +\n> +std::string ipaConfigurationFile(const std::string &ipaName, const std::string &name)\n> +{\n> +       /*\n> +        * Start with any user override through the module-specific environment\n> +        * variable. Use the name of the IPA module up to the first '/' to\n> +        * construct the variable name.\n> +        */\n> +       std::string ipaEnvName = ipaName.substr(0, ipaName.find('/'));\n> +       std::transform(ipaEnvName.begin(), ipaEnvName.end(), ipaEnvName.begin(),\n> +                      [](unsigned char c) { return std::toupper(c); });\n> +       ipaEnvName = \"LIBCAMERA_\" + ipaEnvName + \"_TUNING_FILE\";\n> +\n> +       char const *configFromEnv = utils::secure_getenv(ipaEnvName.c_str());\n> +       if (configFromEnv && *configFromEnv != '\\0')\n> +               return { configFromEnv };\n> +\n> +       struct stat statbuf;\n> +       int ret;\n> +\n> +       /*\n> +        * Check the directory pointed to by the IPA config path environment\n> +        * variable next.\n> +        */\n> +       const char *confPaths = utils::secure_getenv(\"LIBCAMERA_IPA_CONFIG_PATH\");\n> +       if (confPaths) {\n> +               for (const auto &dir : utils::split(confPaths, \":\")) {\n> +                       if (dir.empty())\n> +                               continue;\n> +\n> +                       std::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> +                       ret = stat(confPath.c_str(), &statbuf);\n> +                       if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> +                               return confPath;\n> +               }\n> +       }\n> +\n> +       std::string root = utils::libcameraSourcePath();\n> +       if (!root.empty()) {\n> +               /*\n> +                * When libcamera is used before it is installed, load\n> +                * configuration files from the source directory. The\n> +                * configuration files are then located in the 'data'\n> +                * subdirectory of the corresponding IPA module.\n> +                */\n> +               std::string ipaConfDir = root + \"src/ipa/\" + ipaName + \"/data\";\n> +\n> +               LOG(IPAProxy, Info)\n> +                       << \"libcamera is not installed. Loading IPA configuration from '\"\n> +                       << ipaConfDir << \"'\";\n> +\n> +               std::string confPath = ipaConfDir + \"/\" + name;\n> +               ret = stat(confPath.c_str(), &statbuf);\n> +               if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> +                       return confPath;\n> +\n> +       } else {\n> +               /* Else look in the system locations. */\n> +               for (const auto &dir : utils::split(IPA_CONFIG_DIR, \":\")) {\n> +                       std::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> +                       ret = stat(confPath.c_str(), &statbuf);\n> +                       if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> +                               return confPath;\n> +               }\n> +       }\n> +\n> +       return {};\n> +}\n> +\n> +} /* namespace */\n> +\n>  /**\n>   * \\class IPAProxy\n>   * \\brief IPA Proxy\n> @@ -103,68 +175,10 @@ std::string IPAProxy::configurationFile(const std::string &name,\n>          * has been validated when loading the module.\n>          */\n>         const std::string ipaName = ipam_->info().name;\n> -\n> -       /*\n> -        * Start with any user override through the module-specific environment\n> -        * variable. Use the name of the IPA module up to the first '/' to\n> -        * construct the variable name.\n> -        */\n> -       std::string ipaEnvName = ipaName.substr(0, ipaName.find('/'));\n> -       std::transform(ipaEnvName.begin(), ipaEnvName.end(), ipaEnvName.begin(),\n> -                      [](unsigned char c) { return std::toupper(c); });\n> -       ipaEnvName = \"LIBCAMERA_\" + ipaEnvName + \"_TUNING_FILE\";\n> -\n> -       char const *configFromEnv = utils::secure_getenv(ipaEnvName.c_str());\n> -       if (configFromEnv && *configFromEnv != '\\0')\n> -               return { configFromEnv };\n> -\n> -       struct stat statbuf;\n> -       int ret;\n> -\n> -       /*\n> -        * Check the directory pointed to by the IPA config path environment\n> -        * variable next.\n> -        */\n> -       const char *confPaths = utils::secure_getenv(\"LIBCAMERA_IPA_CONFIG_PATH\");\n> -       if (confPaths) {\n> -               for (const auto &dir : utils::split(confPaths, \":\")) {\n> -                       if (dir.empty())\n> -                               continue;\n> -\n> -                       std::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> -                       ret = stat(confPath.c_str(), &statbuf);\n> -                       if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> -                               return confPath;\n> -               }\n> -       }\n> -\n> -       std::string root = utils::libcameraSourcePath();\n> -       if (!root.empty()) {\n> -               /*\n> -                * When libcamera is used before it is installed, load\n> -                * configuration files from the source directory. The\n> -                * configuration files are then located in the 'data'\n> -                * subdirectory of the corresponding IPA module.\n> -                */\n> -               std::string ipaConfDir = root + \"src/ipa/\" + ipaName + \"/data\";\n> -\n> -               LOG(IPAProxy, Info)\n> -                       << \"libcamera is not installed. Loading IPA configuration from '\"\n> -                       << ipaConfDir << \"'\";\n> -\n> -               std::string confPath = ipaConfDir + \"/\" + name;\n> -               ret = stat(confPath.c_str(), &statbuf);\n> -               if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> -                       return confPath;\n> -\n> -       } else {\n> -               /* Else look in the system locations. */\n> -               for (const auto &dir : utils::split(IPA_CONFIG_DIR, \":\")) {\n> -                       std::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> -                       ret = stat(confPath.c_str(), &statbuf);\n> -                       if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> -                               return confPath;\n> -               }\n> +       std::string confPath = ipaConfigurationFile(ipaName, name);\n> +       if (!confPath.empty()) {\n> +               LOG(IPAProxy, Info) << \"Using tuning file \" << confPath;\n> +               return confPath;\n>         }\n>  \n>         if (fallbackName.empty()) {\n> @@ -174,11 +188,12 @@ std::string IPAProxy::configurationFile(const std::string &name,\n>                 return std::string();\n>         }\n>  \n> +       confPath = ipaConfigurationFile(ipaName, fallbackName);\n\nHow come we call this ... ohhhh we were recursive before. Ok - this is\nnicer indeed!\n\nAnd I can confirm with meld that the moved code is simply moved....\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>         LOG(IPAProxy, Warning)\n>                 << \"Configuration file '\" << name\n>                 << \"' not found for IPA module '\" << ipaName\n> -               << \"', falling back to '\" << fallbackName << \"'\";\n> -       return configurationFile(fallbackName);\n> +               << \"', falling back to '\" << confPath << \"'\";\n> +       return confPath;\n>  }\n>  \n>  /**\n> -- \n> 2.48.1\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 2FEB0BDCC1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 Aug 2025 16:17:15 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EB09669249;\n\tTue, 12 Aug 2025 18:17:13 +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 63F716921A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 12 Aug 2025 18:17:12 +0200 (CEST)","from pendragon.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 60D8F465;\n\tTue, 12 Aug 2025 18:16:19 +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=\"eYrvdlM0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755015379;\n\tbh=68oRpQl2jCcu5kfJSREQorT70V1/ZIzkeoSwKVJpy6o=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=eYrvdlM0tmlL3m6v8nB2nFiv7GYzssgi/HQEP8zuf7luKeCs4Blsu9iQWTEpJKyln\n\tpNsWw00QoR/AXds3/ADnUDpJdmpkaqM+lv8ZIrfK/XQ1IWB6LiqUZt1Ki0rYcPCFtI\n\tyhsqTk0Lm46Aqa9Cy6S2sofI0G9Rqk/gxzvoma2U=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250812143814.120975-1-stefan.klug@ideasonboard.com>","References":"<20250812143814.120975-1-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH] libcamera: ipa_proxy: Log configuration file path","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 12 Aug 2025 17:17:09 +0100","Message-ID":"<175501542933.560048.10088529717980079122@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":35379,"web_url":"https://patchwork.libcamera.org/comment/35379/","msgid":"<d3d1b9cb-c4b2-4458-8741-73ef89a55d42@ideasonboard.com>","date":"2025-08-13T11:45:50","subject":"Re: [PATCH] libcamera: ipa_proxy: Log configuration file path","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2025. 08. 12. 16:38 keltezéssel, Stefan Klug írta:\n> It is often helpful to know which tuning file is used. Add a log\n> statement with INFO level for that.\n> \n> As the core logic has multiple return paths, adding the log statement is\n> not straight forward. Extract finder logic into a ipaConfigurationFile()\n> function and call that with the name and optionally the fallbackName\n> from the configurationFile() function.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n> \n> Hi all,\n> \n> I posted a similar patch a while ago here:\n> https://lists.libcamera.org/pipermail/libcamera-devel/2025-January/048324.html\n> \n> We didn't merge it back then because it should be central in ipa_proxy.\n> Adding it there is a bit ugly because there are a few return paths. I\n> tried to use a scope_exit but that doesn't work as the exit function is\n> called after confPath is moved out to the caller. So I settled for\n> refactoring which imho makes the configurationFile() function also\n> easier to read.\n> \n> Best regards,\n> Stefan\n> \n> ---\n\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\n\n\n>   src/libcamera/ipa_proxy.cpp | 143 ++++++++++++++++++++----------------\n>   1 file changed, 79 insertions(+), 64 deletions(-)\n> \n> diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp\n> index 9907b9615ec7..b5c13a30f1d4 100644\n> --- a/src/libcamera/ipa_proxy.cpp\n> +++ b/src/libcamera/ipa_proxy.cpp\n> @@ -25,6 +25,78 @@ namespace libcamera {\n>   \n>   LOG_DEFINE_CATEGORY(IPAProxy)\n>   \n> +namespace {\n> +\n> +std::string ipaConfigurationFile(const std::string &ipaName, const std::string &name)\n> +{\n> +\t/*\n> +\t * Start with any user override through the module-specific environment\n> +\t * variable. Use the name of the IPA module up to the first '/' to\n> +\t * construct the variable name.\n> +\t */\n> +\tstd::string ipaEnvName = ipaName.substr(0, ipaName.find('/'));\n> +\tstd::transform(ipaEnvName.begin(), ipaEnvName.end(), ipaEnvName.begin(),\n> +\t\t       [](unsigned char c) { return std::toupper(c); });\n> +\tipaEnvName = \"LIBCAMERA_\" + ipaEnvName + \"_TUNING_FILE\";\n> +\n> +\tchar const *configFromEnv = utils::secure_getenv(ipaEnvName.c_str());\n> +\tif (configFromEnv && *configFromEnv != '\\0')\n> +\t\treturn { configFromEnv };\n> +\n> +\tstruct stat statbuf;\n> +\tint ret;\n> +\n> +\t/*\n> +\t * Check the directory pointed to by the IPA config path environment\n> +\t * variable next.\n> +\t */\n> +\tconst char *confPaths = utils::secure_getenv(\"LIBCAMERA_IPA_CONFIG_PATH\");\n> +\tif (confPaths) {\n> +\t\tfor (const auto &dir : utils::split(confPaths, \":\")) {\n> +\t\t\tif (dir.empty())\n> +\t\t\t\tcontinue;\n> +\n> +\t\t\tstd::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> +\t\t\tret = stat(confPath.c_str(), &statbuf);\n> +\t\t\tif (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> +\t\t\t\treturn confPath;\n> +\t\t}\n> +\t}\n> +\n> +\tstd::string root = utils::libcameraSourcePath();\n> +\tif (!root.empty()) {\n> +\t\t/*\n> +\t\t * When libcamera is used before it is installed, load\n> +\t\t * configuration files from the source directory. The\n> +\t\t * configuration files are then located in the 'data'\n> +\t\t * subdirectory of the corresponding IPA module.\n> +\t\t */\n> +\t\tstd::string ipaConfDir = root + \"src/ipa/\" + ipaName + \"/data\";\n> +\n> +\t\tLOG(IPAProxy, Info)\n> +\t\t\t<< \"libcamera is not installed. Loading IPA configuration from '\"\n> +\t\t\t<< ipaConfDir << \"'\";\n> +\n> +\t\tstd::string confPath = ipaConfDir + \"/\" + name;\n> +\t\tret = stat(confPath.c_str(), &statbuf);\n> +\t\tif (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> +\t\t\treturn confPath;\n> +\n> +\t} else {\n> +\t\t/* Else look in the system locations. */\n> +\t\tfor (const auto &dir : utils::split(IPA_CONFIG_DIR, \":\")) {\n> +\t\t\tstd::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> +\t\t\tret = stat(confPath.c_str(), &statbuf);\n> +\t\t\tif (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> +\t\t\t\treturn confPath;\n> +\t\t}\n> +\t}\n> +\n> +\treturn {};\n> +}\n> +\n> +} /* namespace */\n> +\n>   /**\n>    * \\class IPAProxy\n>    * \\brief IPA Proxy\n> @@ -103,68 +175,10 @@ std::string IPAProxy::configurationFile(const std::string &name,\n>   \t * has been validated when loading the module.\n>   \t */\n>   \tconst std::string ipaName = ipam_->info().name;\n> -\n> -\t/*\n> -\t * Start with any user override through the module-specific environment\n> -\t * variable. Use the name of the IPA module up to the first '/' to\n> -\t * construct the variable name.\n> -\t */\n> -\tstd::string ipaEnvName = ipaName.substr(0, ipaName.find('/'));\n> -\tstd::transform(ipaEnvName.begin(), ipaEnvName.end(), ipaEnvName.begin(),\n> -\t\t       [](unsigned char c) { return std::toupper(c); });\n> -\tipaEnvName = \"LIBCAMERA_\" + ipaEnvName + \"_TUNING_FILE\";\n> -\n> -\tchar const *configFromEnv = utils::secure_getenv(ipaEnvName.c_str());\n> -\tif (configFromEnv && *configFromEnv != '\\0')\n> -\t\treturn { configFromEnv };\n> -\n> -\tstruct stat statbuf;\n> -\tint ret;\n> -\n> -\t/*\n> -\t * Check the directory pointed to by the IPA config path environment\n> -\t * variable next.\n> -\t */\n> -\tconst char *confPaths = utils::secure_getenv(\"LIBCAMERA_IPA_CONFIG_PATH\");\n> -\tif (confPaths) {\n> -\t\tfor (const auto &dir : utils::split(confPaths, \":\")) {\n> -\t\t\tif (dir.empty())\n> -\t\t\t\tcontinue;\n> -\n> -\t\t\tstd::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> -\t\t\tret = stat(confPath.c_str(), &statbuf);\n> -\t\t\tif (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> -\t\t\t\treturn confPath;\n> -\t\t}\n> -\t}\n> -\n> -\tstd::string root = utils::libcameraSourcePath();\n> -\tif (!root.empty()) {\n> -\t\t/*\n> -\t\t * When libcamera is used before it is installed, load\n> -\t\t * configuration files from the source directory. The\n> -\t\t * configuration files are then located in the 'data'\n> -\t\t * subdirectory of the corresponding IPA module.\n> -\t\t */\n> -\t\tstd::string ipaConfDir = root + \"src/ipa/\" + ipaName + \"/data\";\n> -\n> -\t\tLOG(IPAProxy, Info)\n> -\t\t\t<< \"libcamera is not installed. Loading IPA configuration from '\"\n> -\t\t\t<< ipaConfDir << \"'\";\n> -\n> -\t\tstd::string confPath = ipaConfDir + \"/\" + name;\n> -\t\tret = stat(confPath.c_str(), &statbuf);\n> -\t\tif (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> -\t\t\treturn confPath;\n> -\n> -\t} else {\n> -\t\t/* Else look in the system locations. */\n> -\t\tfor (const auto &dir : utils::split(IPA_CONFIG_DIR, \":\")) {\n> -\t\t\tstd::string confPath = dir + \"/\" + ipaName + \"/\" + name;\n> -\t\t\tret = stat(confPath.c_str(), &statbuf);\n> -\t\t\tif (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)\n> -\t\t\t\treturn confPath;\n> -\t\t}\n> +\tstd::string confPath = ipaConfigurationFile(ipaName, name);\n> +\tif (!confPath.empty()) {\n> +\t\tLOG(IPAProxy, Info) << \"Using tuning file \" << confPath;\n> +\t\treturn confPath;\n>   \t}\n>   \n>   \tif (fallbackName.empty()) {\n> @@ -174,11 +188,12 @@ std::string IPAProxy::configurationFile(const std::string &name,\n>   \t\treturn std::string();\n>   \t}\n>   \n> +\tconfPath = ipaConfigurationFile(ipaName, fallbackName);\n>   \tLOG(IPAProxy, Warning)\n>   \t\t<< \"Configuration file '\" << name\n>   \t\t<< \"' not found for IPA module '\" << ipaName\n> -\t\t<< \"', falling back to '\" << fallbackName << \"'\";\n> -\treturn configurationFile(fallbackName);\n> +\t\t<< \"', falling back to '\" << confPath << \"'\";\n> +\treturn confPath;\n>   }\n>   \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 B1952BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 13 Aug 2025 11:45:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C197669249;\n\tWed, 13 Aug 2025 13:45:55 +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 4F40461444\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 Aug 2025 13:45:54 +0200 (CEST)","from [192.168.33.21] (185.221.141.188.nat.pool.zt.hu\n\t[185.221.141.188])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A5E6F2C5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 Aug 2025 13:45:00 +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=\"pAOsH0tB\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1755085500;\n\tbh=hbFhz5rt7q36jlhqEqvtNdmMo14SV7GrQ/vVWXW9IGc=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=pAOsH0tBxYjGF/07Udb+ItfkmvUt9cYqch/31z2UM+Qno1XHgl1RuTskCo9R5f6qD\n\tKr5+JWuisX2kpl2isHjFSceH2whft49mKwsWHjfF0QmripoafBSt0fKP91mFbJvIFr\n\thM2/daj1UKdviAUpumYW0wHzDnfMWLIl3pCPMjvE=","Message-ID":"<d3d1b9cb-c4b2-4458-8741-73ef89a55d42@ideasonboard.com>","Date":"Wed, 13 Aug 2025 13:45:50 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] libcamera: ipa_proxy: Log configuration file path","To":"libcamera-devel@lists.libcamera.org","References":"<20250812143814.120975-1-stefan.klug@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":"<20250812143814.120975-1-stefan.klug@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>"}}]