/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2021, Ideas On Board * * algorithm.h - ISP control algorithm interface */ #pragma once #include #include namespace libcamera { namespace ipa { template class Algorithm { public: using Module = _Module; virtual ~Algorithm() {} virtual int configure([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] const typename Module::Config &configInfo) { return 0; } virtual void prepare([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] typename Module::Params *params) { } virtual void process([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] typename Module::FrameContext *frameContext, [[maybe_unused]] const typename Module::Stats *stats) { } }; template 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> create() const = 0; private: std::string name_; }; template class AlgorithmFactory : public AlgorithmFactoryBase { public: AlgorithmFactory(const char *name) : AlgorithmFactoryBase(name) { } ~AlgorithmFactory() = default; std::unique_ptr> create() const override { return std::make_unique<_Algorithm>(); } }; #define REGISTER_IPA_ALGORITHM(algorithm, name) \ static AlgorithmFactory global_##algorithm##Factory(name); } /* namespace ipa */ } /* namespace libcamera */