ipa: libipa: module: Add support for instantiation from YAML

Add a Module::createAlgorithms() function to instantiate algorithms from
a YamlObject. The instantiated algorithms are stored in a private member
variable list, exposed through the Module::algorithms() function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
Laurent Pinchart
2022-06-20 03:36:23 +03:00
parent 575ca88544
commit 7a5e23585f
2 changed files with 99 additions and 16 deletions
+32 -10
View File
@@ -14,6 +14,8 @@
namespace libcamera {
LOG_DEFINE_CATEGORY(IPAModuleAlgo)
/**
* \brief The IPA namespace
*
@@ -76,7 +78,36 @@ namespace ipa {
*/
/**
* \fn Module::createAlgorithm()
* \fn Module::algorithms()
* \brief Retrieve the list of instantiated algorithms
* \return The list of instantiated algorithms
*/
/**
* \fn Module::createAlgorithms()
* \brief Create algorithms from YAML configuration data
* \param[in] context The IPA context
* \param[in] algorithms Algorithms configuration data as a parsed YamlObject
*
* This function iterates over the list of \a algorithms parsed from the YAML
* configuration file, and instantiates and initializes the corresponding
* algorithms. The configuration data is expected to be correct, any error
* causes the function to fail and return immediately.
*
* \return 0 on success, or a negative error code on failure
*/
/**
* \fn Module::registerAlgorithm()
* \brief Add an algorithm factory class to the list of available algorithms
* \param[in] factory Factory to use to construct the algorithm
*
* This function registers an algorithm factory. It is meant to be called by the
* AlgorithmFactory constructor only.
*/
/**
* \fn Module::createAlgorithm(const std::string &name)
* \brief Create an instance of an Algorithm by name
* \param[in] name The algorithm name
*
@@ -90,15 +121,6 @@ namespace ipa {
* \return A new instance of the Algorithm subclass corresponding to the \a name
*/
/**
* \fn Module::registerAlgorithm()
* \brief Add an algorithm factory class to the list of available algorithms
* \param[in] factory Factory to use to construct the algorithm
*
* This function registers an algorithm factory. It is meant to be called by the
* AlgorithmFactory constructor only.
*/
} /* namespace ipa */
} /* namespace libcamera */
+67 -6
View File
@@ -7,14 +7,22 @@
#pragma once
#include <list>
#include <memory>
#include <string>
#include <vector>
#include <libcamera/base/log.h>
#include <libcamera/base/utils.h>
#include "libcamera/internal/yaml_parser.h"
#include "algorithm.h"
namespace libcamera {
LOG_DECLARE_CATEGORY(IPAModuleAlgo)
namespace ipa {
template<typename _Context, typename _FrameContext, typename _Config,
@@ -30,6 +38,63 @@ public:
virtual ~Module() {}
const std::list<std::unique_ptr<Algorithm<Module>>> &algorithms() const
{
return algorithms_;
}
int createAlgorithms(Context &context, const YamlObject &algorithms)
{
const auto &list = algorithms.asList();
for (const auto &[i, algo] : utils::enumerate(list)) {
if (!algo.isDictionary()) {
LOG(IPAModuleAlgo, Error)
<< "Invalid YAML syntax for algorithm " << i;
algorithms_.clear();
return -EINVAL;
}
int ret = createAlgorithm(context, algo);
if (ret) {
algorithms_.clear();
return ret;
}
}
return 0;
}
static void registerAlgorithm(AlgorithmFactoryBase<Module> *factory)
{
factories().push_back(factory);
}
private:
int createAlgorithm(Context &context, const YamlObject &data)
{
const auto &[name, algoData] = *data.asDict().begin();
std::unique_ptr<Algorithm<Module>> algo = createAlgorithm(name);
if (!algo) {
LOG(IPAModuleAlgo, Error)
<< "Algorithm '" << name << "' not found";
return -EINVAL;
}
int ret = algo->init(context, algoData);
if (ret) {
LOG(IPAModuleAlgo, Error)
<< "Algorithm '" << name << "' failed to initialize";
return ret;
}
LOG(IPAModuleAlgo, Debug)
<< "Instantiated algorithm '" << name << "'";
algorithms_.push_back(std::move(algo));
return 0;
}
static std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)
{
for (const AlgorithmFactoryBase<Module> *factory : factories()) {
@@ -40,12 +105,6 @@ public:
return nullptr;
}
static void registerAlgorithm(AlgorithmFactoryBase<Module> *factory)
{
factories().push_back(factory);
}
private:
static std::vector<AlgorithmFactoryBase<Module> *> &factories()
{
/*
@@ -56,6 +115,8 @@ private:
static std::vector<AlgorithmFactoryBase<Module> *> factories;
return factories;
}
std::list<std::unique_ptr<Algorithm<Module>>> algorithms_;
};
} /* namespace ipa */