diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2022-06-20 02:30:32 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2022-06-29 17:21:03 +0300 |
commit | d1934c6490e335c273838a960657652bfe6d7546 (patch) | |
tree | ebfdb61d43cfe5debace3048a4bb1c118f2a42f2 /src/ipa/libipa/module.h | |
parent | 5f94b262da99428fa18d7b33a4230536c86f2ec8 (diff) |
ipa: libipa: algorithm: Add an algorithm registration mechanism
In order to allow dynamic instantiation of algorithms based on tuning
data files, add a mechanism to register algorithms with the IPA module.
The implementation relies on an AlgorithmFactory class and a
registration macro, similar to the pipeline handler registration
mechanism. The main difference is that the algorithm registration and
instantiation are implemented in the Module class instead of the
AlgorithmFactory class, making the factory an internal implementation
detail.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Diffstat (limited to 'src/ipa/libipa/module.h')
-rw-r--r-- | src/ipa/libipa/module.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h index c4d77812..05f39801 100644 --- a/src/ipa/libipa/module.h +++ b/src/ipa/libipa/module.h @@ -7,6 +7,12 @@ #pragma once +#include <memory> +#include <string> +#include <vector> + +#include "algorithm.h" + namespace libcamera { namespace ipa { @@ -23,6 +29,33 @@ public: using Stats = _Stats; virtual ~Module() {} + + static std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name) + { + for (const AlgorithmFactoryBase<Module> *factory : factories()) { + if (factory->name() == name) + return factory->create(); + } + + return nullptr; + } + + static void registerAlgorithm(AlgorithmFactoryBase<Module> *factory) + { + factories().push_back(factory); + } + +private: + static std::vector<AlgorithmFactoryBase<Module> *> &factories() + { + /* + * The static factories map is defined inside the function to ensure + * it gets initialized on first use, without any dependency on + * link order. + */ + static std::vector<AlgorithmFactoryBase<Module> *> factories; + return factories; + } }; } /* namespace ipa */ |