[{"id":30519,"web_url":"https://patchwork.libcamera.org/comment/30519/","msgid":"<20240731094659.GR8146@pendragon.ideasonboard.com>","date":"2024-07-31T09:46:59","subject":"Re: [PATCH v2 3/3] libcamera: ipa_proxy: Report a missing\n\tconfiguration as a warning","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Mon, Jul 08, 2024 at 02:38:03PM +0200, Milan Zamazal wrote:\n> When the configuration file for an IPA module is missing, it is reported\n> as an error in the log, for example:\n> \n>   ERROR IPAProxy ipa_proxy.cpp:149 Configuration file 'imx219.yaml' not found for IPA module 'simple'\n> \n> This is misleading because several pipelines use uncalibrated.yaml in\n> such a case and can continue working.  And in case of software ISP,\n> there is currently no other configuration file so the error is always\n> reported.\n> \n> On the other hand, in some other cases the presence of the configuration\n> file is required and it is an error if it is missing.\n> \n> Let's introduce a new optional argument to IPAProxy::configurationFile\n> that specifies a fallback file if the requested file is not found.  If\n> the primary requested file is not found and a non-empty fallback file is\n> specified then a warning is logged and the fallback file is looked up.\n> If neither the fallback file can be found then only then an error is\n> logged and the method returns an empty string.  This change has also the\n> benefit of putting the common fallback file (\"uncalibrated.yaml\")\n> pattern to a single place.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  include/libcamera/internal/ipa_proxy.h      |  4 +++-\n>  src/libcamera/ipa_proxy.cpp                 | 22 +++++++++++++++++----\n>  src/libcamera/pipeline/ipu3/ipu3.cpp        |  5 ++---\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp    |  9 ++-------\n>  src/libcamera/software_isp/software_isp.cpp |  5 ++---\n>  5 files changed, 27 insertions(+), 18 deletions(-)\n> \n> diff --git a/include/libcamera/internal/ipa_proxy.h b/include/libcamera/internal/ipa_proxy.h\n> index 5240f69f..88068de7 100644\n> --- a/include/libcamera/internal/ipa_proxy.h\n> +++ b/include/libcamera/internal/ipa_proxy.h\n> @@ -31,7 +31,9 @@ public:\n>  \n>  \tbool isValid() const { return valid_; }\n>  \n> -\tstd::string configurationFile(const std::string &name) const;\n> +\tstd::string configurationFile(\n> +\t\tconst std::string &name,\n> +\t\tconst std::string &fallbackName = std::string()) const;\n\n\tstd::string configurationFile(const std::string &name,\n\t\t\t\t      const std::string &fallbackName = std::string()) const;\n\n>  \n>  protected:\n>  \tstd::string resolvePath(const std::string &file) const;\n> diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp\n> index 6c17c456..247c6fa0 100644\n> --- a/src/libcamera/ipa_proxy.cpp\n> +++ b/src/libcamera/ipa_proxy.cpp\n> @@ -72,6 +72,7 @@ IPAProxy::~IPAProxy()\n>  /**\n>   * \\brief Retrieve the absolute path to an IPA configuration file\n>   * \\param[in] name The configuration file name\n> + * \\param[in] fallbackName The name of a fallback configuration file\n>   *\n>   * This function locates the configuration file for an IPA and returns its\n>   * absolute path. It searches the following directories, in order:\n> @@ -89,10 +90,15 @@ IPAProxy::~IPAProxy()\n>   * named after the IPA module name, as reported in IPAModuleInfo::name, and for\n>   * a file named \\a name within that directory. The \\a name is IPA-specific.\n>   *\n> + * If the file named \\a name is not found and \\a fallbackName is non-empty then\n> + * the whole search is repeated for \\a fallbackName.\n> + *\n>   * \\return The full path to the IPA configuration file, or an empty string if\n>   * no configuration file can be found\n>   */\n> -std::string IPAProxy::configurationFile(const std::string &name) const\n> +std::string IPAProxy::configurationFile(\n> +\tconst std::string &name,\n> +\tconst std::string &fallbackName) const\n\nstd::string IPAProxy::configurationFile(const std::string &name,\n\t\t\t\t\tconst std::string &fallbackName) const\n\n>  {\n>  \tstruct stat statbuf;\n>  \tint ret;\n> @@ -146,9 +152,17 @@ std::string IPAProxy::configurationFile(const std::string &name) const\n>  \t\t}\n>  \t}\n>  \n> -\tLOG(IPAProxy, Error)\n> -\t\t<< \"Configuration file '\" << name\n> -\t\t<< \"' not found for IPA module '\" << ipaName << \"'\";\n> +\tif (fallbackName.empty()) {\n> +\t\tLOG(IPAProxy, Error)\n> +\t\t\t<< \"Configuration file '\" << name\n> +\t\t\t<< \"' not found for IPA module '\" << ipaName << \"'\";\n\n\t\treturn std::string();\n\n> +\t} else {\n> +\t\tLOG(IPAProxy, Warning)\n> +\t\t\t<< \"Configuration file '\" << name\n> +\t\t\t<< \"' not found for IPA module '\" << ipaName\n> +\t\t\t<< \"', trying '\" << fallbackName << \"'\";\n\ns/trying/falling back to/\n\n> +\t\treturn configurationFile(fallbackName);\n\nand drop and else and lower the indentation here.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\t}\n>  \n>  \treturn std::string();\n>  }\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 066fd4a2..2071c338 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -1186,9 +1186,8 @@ int IPU3CameraData::loadIPA()\n>  \t * The API tuning file is made from the sensor name. If the tuning file\n>  \t * isn't found, fall back to the 'uncalibrated' file.\n>  \t */\n> -\tstd::string ipaTuningFile = ipa_->configurationFile(sensor->model() + \".yaml\");\n> -\tif (ipaTuningFile.empty())\n> -\t\tipaTuningFile = ipa_->configurationFile(\"uncalibrated.yaml\");\n> +\tstd::string ipaTuningFile =\n> +\t\tipa_->configurationFile(sensor->model() + \".yaml\", \"uncalibrated.yaml\");\n>  \n>  \tret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },\n>  \t\t\t sensorInfo, sensor->controls(), &ipaControls_);\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 97cd78a7..c3dae003 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -350,13 +350,8 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)\n>  \tstd::string ipaTuningFile;\n>  \tchar const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RKISP1_TUNING_FILE\");\n>  \tif (!configFromEnv || *configFromEnv == '\\0') {\n> -\t\tipaTuningFile = ipa_->configurationFile(sensor_->model() + \".yaml\");\n> -\t\t/*\n> -\t\t * If the tuning file isn't found, fall back to the\n> -\t\t * 'uncalibrated' configuration file.\n> -\t\t */\n> -\t\tif (ipaTuningFile.empty())\n> -\t\t\tipaTuningFile = ipa_->configurationFile(\"uncalibrated.yaml\");\n> +\t\tipaTuningFile =\n> +\t\t\tipa_->configurationFile(sensor_->model() + \".yaml\", \"uncalibrated.yaml\");\n>  \t} else {\n>  \t\tipaTuningFile = std::string(configFromEnv);\n>  \t}\n> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> index 20fb6f48..aeef28e8 100644\n> --- a/src/libcamera/software_isp/software_isp.cpp\n> +++ b/src/libcamera/software_isp/software_isp.cpp\n> @@ -121,9 +121,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor)\n>  \t * The API tuning file is made from the sensor name. If the tuning file\n>  \t * isn't found, fall back to the 'uncalibrated' file.\n>  \t */\n> -\tstd::string ipaTuningFile = ipa_->configurationFile(sensor->model() + \".yaml\");\n> -\tif (ipaTuningFile.empty())\n> -\t\tipaTuningFile = ipa_->configurationFile(\"uncalibrated.yaml\");\n> +\tstd::string ipaTuningFile =\n> +\t\tipa_->configurationFile(sensor->model() + \".yaml\", \"uncalibrated.yaml\");\n>  \n>  \tint ret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },\n>  \t\t\t     debayer_->getStatsFD(),","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 68D45C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 31 Jul 2024 09:47:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 25F1563374;\n\tWed, 31 Jul 2024 11:47:21 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9F44B6336B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 31 Jul 2024 11:47:19 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 98047842;\n\tWed, 31 Jul 2024 11:46:31 +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=\"KJ9YDWuq\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1722419191;\n\tbh=cSrtg7WImy0yH4YuV7PnJPDNQt3rhqzjPawCaZGT6/U=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=KJ9YDWuq8zRDF3IosMd/c1xSO63Xu9Vfg1I7JcETatiOOVzuuNxsw1gOEI1WEABzt\n\tKfU4AvfG/54otSJggzhEj5GsXuBnsM2NF7kZvr/ZSiJX7yXascY4EHhHuozzlDuM17\n\tp8YYfhZpFRg1QDAFDQhEE/dcvIbTqrbCrGmEcjXU=","Date":"Wed, 31 Jul 2024 12:46:59 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v2 3/3] libcamera: ipa_proxy: Report a missing\n\tconfiguration as a warning","Message-ID":"<20240731094659.GR8146@pendragon.ideasonboard.com>","References":"<20240708123803.1006689-1-mzamazal@redhat.com>\n\t<20240708123803.1006689-4-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240708123803.1006689-4-mzamazal@redhat.com>","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":30520,"web_url":"https://patchwork.libcamera.org/comment/30520/","msgid":"<172242616062.392292.12440561534101113151@ping.linuxembedded.co.uk>","date":"2024-07-31T11:42:40","subject":"Re: [PATCH v2 3/3] libcamera: ipa_proxy: Report a missing\n\tconfiguration as a warning","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2024-07-31 10:46:59)\n> On Mon, Jul 08, 2024 at 02:38:03PM +0200, Milan Zamazal wrote:\n> > When the configuration file for an IPA module is missing, it is reported\n> > as an error in the log, for example:\n> > \n> >   ERROR IPAProxy ipa_proxy.cpp:149 Configuration file 'imx219.yaml' not found for IPA module 'simple'\n> > \n> > This is misleading because several pipelines use uncalibrated.yaml in\n> > such a case and can continue working.  And in case of software ISP,\n> > there is currently no other configuration file so the error is always\n> > reported.\n> > \n> > On the other hand, in some other cases the presence of the configuration\n> > file is required and it is an error if it is missing.\n> > \n> > Let's introduce a new optional argument to IPAProxy::configurationFile\n> > that specifies a fallback file if the requested file is not found.  If\n> > the primary requested file is not found and a non-empty fallback file is\n> > specified then a warning is logged and the fallback file is looked up.\n> > If neither the fallback file can be found then only then an error is\n> > logged and the method returns an empty string.  This change has also the\n> > benefit of putting the common fallback file (\"uncalibrated.yaml\")\n> > pattern to a single place.\n> > \n> > Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> > ---\n> >  include/libcamera/internal/ipa_proxy.h      |  4 +++-\n> >  src/libcamera/ipa_proxy.cpp                 | 22 +++++++++++++++++----\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp        |  5 ++---\n> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp    |  9 ++-------\n> >  src/libcamera/software_isp/software_isp.cpp |  5 ++---\n> >  5 files changed, 27 insertions(+), 18 deletions(-)\n> > \n> > diff --git a/include/libcamera/internal/ipa_proxy.h b/include/libcamera/internal/ipa_proxy.h\n> > index 5240f69f..88068de7 100644\n> > --- a/include/libcamera/internal/ipa_proxy.h\n> > +++ b/include/libcamera/internal/ipa_proxy.h\n> > @@ -31,7 +31,9 @@ public:\n> >  \n> >       bool isValid() const { return valid_; }\n> >  \n> > -     std::string configurationFile(const std::string &name) const;\n> > +     std::string configurationFile(\n> > +             const std::string &name,\n> > +             const std::string &fallbackName = std::string()) const;\n> \n>         std::string configurationFile(const std::string &name,\n>                                       const std::string &fallbackName = std::string()) const;\n> \n> >  \n> >  protected:\n> >       std::string resolvePath(const std::string &file) const;\n> > diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp\n> > index 6c17c456..247c6fa0 100644\n> > --- a/src/libcamera/ipa_proxy.cpp\n> > +++ b/src/libcamera/ipa_proxy.cpp\n> > @@ -72,6 +72,7 @@ IPAProxy::~IPAProxy()\n> >  /**\n> >   * \\brief Retrieve the absolute path to an IPA configuration file\n> >   * \\param[in] name The configuration file name\n> > + * \\param[in] fallbackName The name of a fallback configuration file\n> >   *\n> >   * This function locates the configuration file for an IPA and returns its\n> >   * absolute path. It searches the following directories, in order:\n> > @@ -89,10 +90,15 @@ IPAProxy::~IPAProxy()\n> >   * named after the IPA module name, as reported in IPAModuleInfo::name, and for\n> >   * a file named \\a name within that directory. The \\a name is IPA-specific.\n> >   *\n> > + * If the file named \\a name is not found and \\a fallbackName is non-empty then\n> > + * the whole search is repeated for \\a fallbackName.\n> > + *\n> >   * \\return The full path to the IPA configuration file, or an empty string if\n> >   * no configuration file can be found\n> >   */\n> > -std::string IPAProxy::configurationFile(const std::string &name) const\n> > +std::string IPAProxy::configurationFile(\n> > +     const std::string &name,\n> > +     const std::string &fallbackName) const\n> \n> std::string IPAProxy::configurationFile(const std::string &name,\n>                                         const std::string &fallbackName) const\n> \n> >  {\n> >       struct stat statbuf;\n> >       int ret;\n> > @@ -146,9 +152,17 @@ std::string IPAProxy::configurationFile(const std::string &name) const\n> >               }\n> >       }\n> >  \n> > -     LOG(IPAProxy, Error)\n> > -             << \"Configuration file '\" << name\n> > -             << \"' not found for IPA module '\" << ipaName << \"'\";\n> > +     if (fallbackName.empty()) {\n> > +             LOG(IPAProxy, Error)\n> > +                     << \"Configuration file '\" << name\n> > +                     << \"' not found for IPA module '\" << ipaName << \"'\";\n> \n>                 return std::string();\n> \n> > +     } else {\n> > +             LOG(IPAProxy, Warning)\n> > +                     << \"Configuration file '\" << name\n> > +                     << \"' not found for IPA module '\" << ipaName\n> > +                     << \"', trying '\" << fallbackName << \"'\";\n> \n> s/trying/falling back to/\n> \n> > +             return configurationFile(fallbackName);\n> \n> and drop and else and lower the indentation here.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n> \n> > +     }\n> >  \n> >       return std::string();\n> >  }\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 066fd4a2..2071c338 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -1186,9 +1186,8 @@ int IPU3CameraData::loadIPA()\n> >        * The API tuning file is made from the sensor name. If the tuning file\n> >        * isn't found, fall back to the 'uncalibrated' file.\n> >        */\n> > -     std::string ipaTuningFile = ipa_->configurationFile(sensor->model() + \".yaml\");\n> > -     if (ipaTuningFile.empty())\n> > -             ipaTuningFile = ipa_->configurationFile(\"uncalibrated.yaml\");\n> > +     std::string ipaTuningFile =\n> > +             ipa_->configurationFile(sensor->model() + \".yaml\", \"uncalibrated.yaml\");\n> >  \n> >       ret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },\n> >                        sensorInfo, sensor->controls(), &ipaControls_);\n> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > index 97cd78a7..c3dae003 100644\n> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > @@ -350,13 +350,8 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)\n> >       std::string ipaTuningFile;\n> >       char const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RKISP1_TUNING_FILE\");\n> >       if (!configFromEnv || *configFromEnv == '\\0') {\n> > -             ipaTuningFile = ipa_->configurationFile(sensor_->model() + \".yaml\");\n> > -             /*\n> > -              * If the tuning file isn't found, fall back to the\n> > -              * 'uncalibrated' configuration file.\n> > -              */\n> > -             if (ipaTuningFile.empty())\n> > -                     ipaTuningFile = ipa_->configurationFile(\"uncalibrated.yaml\");\n> > +             ipaTuningFile =\n> > +                     ipa_->configurationFile(sensor_->model() + \".yaml\", \"uncalibrated.yaml\");\n> >       } else {\n> >               ipaTuningFile = std::string(configFromEnv);\n> >       }\n> > diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> > index 20fb6f48..aeef28e8 100644\n> > --- a/src/libcamera/software_isp/software_isp.cpp\n> > +++ b/src/libcamera/software_isp/software_isp.cpp\n> > @@ -121,9 +121,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor)\n> >        * The API tuning file is made from the sensor name. If the tuning file\n> >        * isn't found, fall back to the 'uncalibrated' file.\n> >        */\n> > -     std::string ipaTuningFile = ipa_->configurationFile(sensor->model() + \".yaml\");\n> > -     if (ipaTuningFile.empty())\n> > -             ipaTuningFile = ipa_->configurationFile(\"uncalibrated.yaml\");\n> > +     std::string ipaTuningFile =\n> > +             ipa_->configurationFile(sensor->model() + \".yaml\", \"uncalibrated.yaml\");\n> >  \n> >       int ret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },\n> >                            debayer_->getStatsFD(),\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","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 34AC3C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 31 Jul 2024 11:42:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9A66E63374;\n\tWed, 31 Jul 2024 13:42:45 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A90266198E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 31 Jul 2024 13:42:43 +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 722F8842;\n\tWed, 31 Jul 2024 13:41:55 +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=\"Qa8MVtl6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1722426115;\n\tbh=CK/aUV5iyP07K5eRVRBinbmFzV2y0MFtlnrE4J9bs1c=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Qa8MVtl6/sBvM2rn+WmiMOfsOL+YWinpfmAwGz5Fi7wwS9bEhsouo4XHvvumqMWAS\n\tBYDbl7fMU15lpmRDH0Lo65kJD9SgU48fTyZaPLnQ6bCeIT2PlbM1t6DyiyqPZZMhuM\n\tw7lKObc8EMhjVvQTw759xPqtKZyFQwuCYuPJaTwQ=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20240731094659.GR8146@pendragon.ideasonboard.com>","References":"<20240708123803.1006689-1-mzamazal@redhat.com>\n\t<20240708123803.1006689-4-mzamazal@redhat.com>\n\t<20240731094659.GR8146@pendragon.ideasonboard.com>","Subject":"Re: [PATCH v2 3/3] libcamera: ipa_proxy: Report a missing\n\tconfiguration as a warning","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tMilan Zamazal <mzamazal@redhat.com>","Date":"Wed, 31 Jul 2024 12:42:40 +0100","Message-ID":"<172242616062.392292.12440561534101113151@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","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>"}}]