[libcamera-devel,v2,3/5] ipa: rkisp1: Add Yaml tuning file support
diff mbox series

Message ID 20220616080744.548995-4-fsylvestre@baylibre.com
State Superseded
Headers show
Series
  • Add tuning file support for rkisp1 blc algo
Related show

Commit Message

Florian Sylvestre June 16, 2022, 8:07 a.m. UTC
Retrieve root node in Yaml tuning file and provide to
each algorithm this YamlObject to allow them to grab their default
parameters by calling init() function.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
---
 src/ipa/rkisp1/algorithms/algorithm.h |  4 ++-
 src/ipa/rkisp1/rkisp1.cpp             | 35 +++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)

Comments

Laurent Pinchart June 16, 2022, 9:30 a.m. UTC | #1
Hi Florian,

Thank you for the patch.

On Thu, Jun 16, 2022 at 10:07:42AM +0200, Florian Sylvestre via libcamera-devel wrote:
> Retrieve root node in Yaml tuning file and provide to
> each algorithm this YamlObject to allow them to grab their default
> parameters by calling init() function.
> 
> Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
> ---
>  src/ipa/rkisp1/algorithms/algorithm.h |  4 ++-
>  src/ipa/rkisp1/rkisp1.cpp             | 35 +++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+), 1 deletion(-)
> 
> diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h
> index d46c3188..5b95fd30 100644
> --- a/src/ipa/rkisp1/algorithms/algorithm.h
> +++ b/src/ipa/rkisp1/algorithms/algorithm.h
> @@ -17,9 +17,11 @@
>  
>  namespace libcamera {
>  
> +class YamlObject;
> +
>  namespace ipa::rkisp1 {
>  
> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPACameraSensorInfo, rkisp1_params_cfg, rkisp1_stat_buffer>;
> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, YamlObject, IPACameraSensorInfo, rkisp1_params_cfg, rkisp1_stat_buffer>;

I think this needs to be part of patch 2/5, otherwise patch 2/5 will
fail to compile.

Btw, could you rebase on top of the latest master branch ? There's a
conflict here.

>  
>  } /* namespace ipa::rkisp1 */
>  
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 23cb95b5..6cc501a9 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -14,6 +14,7 @@
>  #include <linux/rkisp1-config.h>
>  #include <linux/v4l2-controls.h>
>  
> +#include <libcamera/base/file.h>
>  #include <libcamera/base/log.h>
>  
>  #include <libcamera/control_ids.h>
> @@ -24,6 +25,7 @@
>  #include <libcamera/request.h>
>  
>  #include <libcamera/internal/mapped_framebuffer.h>
> +#include <libcamera/internal/yaml_parser.h>
>  
>  #include "algorithms/agc.h"
>  #include "algorithms/algorithm.h"
> @@ -61,6 +63,7 @@ public:
>  private:
>  	void setControls(unsigned int frame);
>  	void prepareMetadata(unsigned int frame, unsigned int aeState);
> +	int parseConfigurationFile(File &file);
>  
>  	std::map<unsigned int, FrameBuffer> buffers_;
>  	std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
> @@ -126,6 +129,38 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision)
>  	algorithms_.push_back(std::make_unique<algorithms::Awb>());
>  	algorithms_.push_back(std::make_unique<algorithms::BlackLevelCorrection>());
>  
> +	/* Load the tuning file for this sensor. */
> +	File file(settings.configurationFile.c_str());
> +	if (!file.open(File::OpenModeFlag::ReadOnly)) {
> +		int ret = file.error();
> +		LOG(IPARkISP1, Error) << "Failed to open configuration file "
> +				      << settings.configurationFile << ": " << strerror(-ret);

The usual style to shorten lines is

		LOG(IPARkISP1, Error)
			<< "Failed to open configuration file "
			<< settings.configurationFile << ": " << strerror(-ret);

> +		return ret;
> +	}
> +
> +	int ret = parseConfigurationFile(file);
> +	if (ret)
> +		return -EINVAL;

		return ret;

> +
> +	return 0;

You could replace all this with

	return parseConfigurationFile(file);

Up to you.

> +}
> +
> +int IPARkISP1::parseConfigurationFile(File &file)
> +{
> +	std::unique_ptr<libcamera::YamlObject> root = YamlParser::parse(file);
> +	if (!root)
> +		return -EINVAL;
> +
> +	if (!root->isDictionary())
> +		return -EINVAL;
> +
> +	/* Allow each algo to get parameters from configuration file. */
> +	for (auto const &algo : algorithms_) {
> +		int ret = algo->init(context_, root.get());
> +		if (ret)
> +			return ret;
> +	}
> +
>  	return 0;
>  }
>

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h
index d46c3188..5b95fd30 100644
--- a/src/ipa/rkisp1/algorithms/algorithm.h
+++ b/src/ipa/rkisp1/algorithms/algorithm.h
@@ -17,9 +17,11 @@ 
 
 namespace libcamera {
 
+class YamlObject;
+
 namespace ipa::rkisp1 {
 
-using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPACameraSensorInfo, rkisp1_params_cfg, rkisp1_stat_buffer>;
+using Algorithm = libcamera::ipa::Algorithm<IPAContext, YamlObject, IPACameraSensorInfo, rkisp1_params_cfg, rkisp1_stat_buffer>;
 
 } /* namespace ipa::rkisp1 */
 
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 23cb95b5..6cc501a9 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -14,6 +14,7 @@ 
 #include <linux/rkisp1-config.h>
 #include <linux/v4l2-controls.h>
 
+#include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
 
 #include <libcamera/control_ids.h>
@@ -24,6 +25,7 @@ 
 #include <libcamera/request.h>
 
 #include <libcamera/internal/mapped_framebuffer.h>
+#include <libcamera/internal/yaml_parser.h>
 
 #include "algorithms/agc.h"
 #include "algorithms/algorithm.h"
@@ -61,6 +63,7 @@  public:
 private:
 	void setControls(unsigned int frame);
 	void prepareMetadata(unsigned int frame, unsigned int aeState);
+	int parseConfigurationFile(File &file);
 
 	std::map<unsigned int, FrameBuffer> buffers_;
 	std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
@@ -126,6 +129,38 @@  int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision)
 	algorithms_.push_back(std::make_unique<algorithms::Awb>());
 	algorithms_.push_back(std::make_unique<algorithms::BlackLevelCorrection>());
 
+	/* Load the tuning file for this sensor. */
+	File file(settings.configurationFile.c_str());
+	if (!file.open(File::OpenModeFlag::ReadOnly)) {
+		int ret = file.error();
+		LOG(IPARkISP1, Error) << "Failed to open configuration file "
+				      << settings.configurationFile << ": " << strerror(-ret);
+		return ret;
+	}
+
+	int ret = parseConfigurationFile(file);
+	if (ret)
+		return -EINVAL;
+
+	return 0;
+}
+
+int IPARkISP1::parseConfigurationFile(File &file)
+{
+	std::unique_ptr<libcamera::YamlObject> root = YamlParser::parse(file);
+	if (!root)
+		return -EINVAL;
+
+	if (!root->isDictionary())
+		return -EINVAL;
+
+	/* Allow each algo to get parameters from configuration file. */
+	for (auto const &algo : algorithms_) {
+		int ret = algo->init(context_, root.get());
+		if (ret)
+			return ret;
+	}
+
 	return 0;
 }