summaryrefslogtreecommitdiff
path: root/src/ipa/libipa/algorithm.h
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-06-20 02:30:32 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-06-29 17:21:03 +0300
commitd1934c6490e335c273838a960657652bfe6d7546 (patch)
treeebfdb61d43cfe5debace3048a4bb1c118f2a42f2 /src/ipa/libipa/algorithm.h
parent5f94b262da99428fa18d7b33a4230536c86f2ec8 (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/algorithm.h')
-rw-r--r--src/ipa/libipa/algorithm.h47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
index fd2ffcfb..cfbe4ed8 100644
--- a/src/ipa/libipa/algorithm.h
+++ b/src/ipa/libipa/algorithm.h
@@ -6,14 +6,19 @@
*/
#pragma once
+#include <memory>
+#include <string>
+
namespace libcamera {
namespace ipa {
-template<typename Module>
+template<typename _Module>
class Algorithm
{
public:
+ using Module = _Module;
+
virtual ~Algorithm() {}
virtual int configure([[maybe_unused]] typename Module::Context &context,
@@ -34,6 +39,46 @@ public:
}
};
+template<typename _Module>
+class AlgorithmFactoryBase
+{
+public:
+ AlgorithmFactoryBase(const char *name)
+ : name_(name)
+ {
+ _Module::registerAlgorithm(this);
+ }
+
+ virtual ~AlgorithmFactoryBase() = default;
+
+ const std::string &name() const { return name_; }
+
+ virtual std::unique_ptr<Algorithm<_Module>> create() const = 0;
+
+private:
+ std::string name_;
+};
+
+template<typename _Algorithm>
+class AlgorithmFactory : public AlgorithmFactoryBase<typename _Algorithm::Module>
+{
+public:
+ AlgorithmFactory(const char *name)
+ : AlgorithmFactoryBase<typename _Algorithm::Module>(name)
+ {
+ }
+
+ ~AlgorithmFactory() = default;
+
+ std::unique_ptr<Algorithm<typename _Algorithm::Module>> create() const override
+ {
+ return std::make_unique<_Algorithm>();
+ }
+};
+
+#define REGISTER_IPA_ALGORITHM(algorithm, name) \
+static AlgorithmFactory<algorithm> global_##algorithm##Factory(name);
+
} /* namespace ipa */
} /* namespace libcamera */