Message ID | 20220616080744.548995-4-fsylvestre@baylibre.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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; > } >
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; }
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(-)