[PATCH v2 3/3] libcamera: ipa_proxy: Report a missing configuration as a warning

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Jul 31 11:46:59 CEST 2024


On Mon, Jul 08, 2024 at 02:38:03PM +0200, Milan Zamazal wrote:
> When the configuration file for an IPA module is missing, it is reported
> as an error in the log, for example:
> 
>   ERROR IPAProxy ipa_proxy.cpp:149 Configuration file 'imx219.yaml' not found for IPA module 'simple'
> 
> This is misleading because several pipelines use uncalibrated.yaml in
> such a case and can continue working.  And in case of software ISP,
> there is currently no other configuration file so the error is always
> reported.
> 
> On the other hand, in some other cases the presence of the configuration
> file is required and it is an error if it is missing.
> 
> Let's introduce a new optional argument to IPAProxy::configurationFile
> that specifies a fallback file if the requested file is not found.  If
> the primary requested file is not found and a non-empty fallback file is
> specified then a warning is logged and the fallback file is looked up.
> If neither the fallback file can be found then only then an error is
> logged and the method returns an empty string.  This change has also the
> benefit of putting the common fallback file ("uncalibrated.yaml")
> pattern to a single place.
> 
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> ---
>  include/libcamera/internal/ipa_proxy.h      |  4 +++-
>  src/libcamera/ipa_proxy.cpp                 | 22 +++++++++++++++++----
>  src/libcamera/pipeline/ipu3/ipu3.cpp        |  5 ++---
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp    |  9 ++-------
>  src/libcamera/software_isp/software_isp.cpp |  5 ++---
>  5 files changed, 27 insertions(+), 18 deletions(-)
> 
> diff --git a/include/libcamera/internal/ipa_proxy.h b/include/libcamera/internal/ipa_proxy.h
> index 5240f69f..88068de7 100644
> --- a/include/libcamera/internal/ipa_proxy.h
> +++ b/include/libcamera/internal/ipa_proxy.h
> @@ -31,7 +31,9 @@ public:
>  
>  	bool isValid() const { return valid_; }
>  
> -	std::string configurationFile(const std::string &name) const;
> +	std::string configurationFile(
> +		const std::string &name,
> +		const std::string &fallbackName = std::string()) const;

	std::string configurationFile(const std::string &name,
				      const std::string &fallbackName = std::string()) const;

>  
>  protected:
>  	std::string resolvePath(const std::string &file) const;
> diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp
> index 6c17c456..247c6fa0 100644
> --- a/src/libcamera/ipa_proxy.cpp
> +++ b/src/libcamera/ipa_proxy.cpp
> @@ -72,6 +72,7 @@ IPAProxy::~IPAProxy()
>  /**
>   * \brief Retrieve the absolute path to an IPA configuration file
>   * \param[in] name The configuration file name
> + * \param[in] fallbackName The name of a fallback configuration file
>   *
>   * This function locates the configuration file for an IPA and returns its
>   * absolute path. It searches the following directories, in order:
> @@ -89,10 +90,15 @@ IPAProxy::~IPAProxy()
>   * named after the IPA module name, as reported in IPAModuleInfo::name, and for
>   * a file named \a name within that directory. The \a name is IPA-specific.
>   *
> + * If the file named \a name is not found and \a fallbackName is non-empty then
> + * the whole search is repeated for \a fallbackName.
> + *
>   * \return The full path to the IPA configuration file, or an empty string if
>   * no configuration file can be found
>   */
> -std::string IPAProxy::configurationFile(const std::string &name) const
> +std::string IPAProxy::configurationFile(
> +	const std::string &name,
> +	const std::string &fallbackName) const

std::string IPAProxy::configurationFile(const std::string &name,
					const std::string &fallbackName) const

>  {
>  	struct stat statbuf;
>  	int ret;
> @@ -146,9 +152,17 @@ std::string IPAProxy::configurationFile(const std::string &name) const
>  		}
>  	}
>  
> -	LOG(IPAProxy, Error)
> -		<< "Configuration file '" << name
> -		<< "' not found for IPA module '" << ipaName << "'";
> +	if (fallbackName.empty()) {
> +		LOG(IPAProxy, Error)
> +			<< "Configuration file '" << name
> +			<< "' not found for IPA module '" << ipaName << "'";

		return std::string();

> +	} else {
> +		LOG(IPAProxy, Warning)
> +			<< "Configuration file '" << name
> +			<< "' not found for IPA module '" << ipaName
> +			<< "', trying '" << fallbackName << "'";

s/trying/falling back to/

> +		return configurationFile(fallbackName);

and drop and else and lower the indentation here.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +	}
>  
>  	return std::string();
>  }
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 066fd4a2..2071c338 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -1186,9 +1186,8 @@ int IPU3CameraData::loadIPA()
>  	 * The API tuning file is made from the sensor name. If the tuning file
>  	 * isn't found, fall back to the 'uncalibrated' file.
>  	 */
> -	std::string ipaTuningFile = ipa_->configurationFile(sensor->model() + ".yaml");
> -	if (ipaTuningFile.empty())
> -		ipaTuningFile = ipa_->configurationFile("uncalibrated.yaml");
> +	std::string ipaTuningFile =
> +		ipa_->configurationFile(sensor->model() + ".yaml", "uncalibrated.yaml");
>  
>  	ret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },
>  			 sensorInfo, sensor->controls(), &ipaControls_);
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 97cd78a7..c3dae003 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -350,13 +350,8 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
>  	std::string ipaTuningFile;
>  	char const *configFromEnv = utils::secure_getenv("LIBCAMERA_RKISP1_TUNING_FILE");
>  	if (!configFromEnv || *configFromEnv == '\0') {
> -		ipaTuningFile = ipa_->configurationFile(sensor_->model() + ".yaml");
> -		/*
> -		 * If the tuning file isn't found, fall back to the
> -		 * 'uncalibrated' configuration file.
> -		 */
> -		if (ipaTuningFile.empty())
> -			ipaTuningFile = ipa_->configurationFile("uncalibrated.yaml");
> +		ipaTuningFile =
> +			ipa_->configurationFile(sensor_->model() + ".yaml", "uncalibrated.yaml");
>  	} else {
>  		ipaTuningFile = std::string(configFromEnv);
>  	}
> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
> index 20fb6f48..aeef28e8 100644
> --- a/src/libcamera/software_isp/software_isp.cpp
> +++ b/src/libcamera/software_isp/software_isp.cpp
> @@ -121,9 +121,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor)
>  	 * The API tuning file is made from the sensor name. If the tuning file
>  	 * isn't found, fall back to the 'uncalibrated' file.
>  	 */
> -	std::string ipaTuningFile = ipa_->configurationFile(sensor->model() + ".yaml");
> -	if (ipaTuningFile.empty())
> -		ipaTuningFile = ipa_->configurationFile("uncalibrated.yaml");
> +	std::string ipaTuningFile =
> +		ipa_->configurationFile(sensor->model() + ".yaml", "uncalibrated.yaml");
>  
>  	int ret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },
>  			     debayer_->getStatsFD(),

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list