[libcamera-devel] [libcamera-devel 3/5] ipa: rkisp1: Add Yaml configuration file support

Florian Sylvestre fsylvestre at baylibre.com
Mon May 23 11:24:33 CEST 2022


Retrieve root node in Yaml configuration 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 at baylibre.com>
---
 src/ipa/rkisp1/algorithms/algorithm.h |  4 ++-
 src/ipa/rkisp1/rkisp1.cpp             | 36 +++++++++++++++++++++++++++
 2 files changed, 39 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>;
 
 } /* namespace ipa::rkisp1 */
 
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 23cb95b5..c44514c2 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -24,6 +24,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 +62,7 @@ public:
 private:
 	void setControls(unsigned int frame);
 	void prepareMetadata(unsigned int frame, unsigned int aeState);
+	int parseConfigurationFile(FILE *fh);
 
 	std::map<unsigned int, FrameBuffer> buffers_;
 	std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
@@ -126,6 +128,40 @@ 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 *fh = fopen(settings.configurationFile.c_str(), "r");
+	if (!fh) {
+		int ret = -errno;
+		LOG(IPARkISP1, Error) << "Failed to open configuration file "
+				      << settings.configurationFile << ": " << strerror(-ret);
+		return ret;
+	}
+
+	int ret = parseConfigurationFile(fh);
+
+	fclose(fh);
+	if (ret)
+		return -EINVAL;
+
+	return 0;
+}
+
+int IPARkISP1::parseConfigurationFile(FILE *fh)
+{
+	std::unique_ptr<libcamera::YamlObject> root = YamlParser::parse(fh);
+	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;
 }
 
-- 
2.34.1



More information about the libcamera-devel mailing list