diff options
Diffstat (limited to 'src/ipa/libipa/algorithm.h')
-rw-r--r-- | src/ipa/libipa/algorithm.h | 47 |
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 */ |