/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2021, Ideas On Board * * algorithm.h - ISP control algorithm interface */ #pragma once #include #include #include #include namespace libcamera { class YamlObject; namespace ipa { template class Algorithm { public: using Module = _Module; virtual ~Algorithm() {} virtual int init([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] const YamlObject &tuningData) { return 0; } virtual int configure([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] const typename Module::Config &configInfo) { return 0; } virtual void queueRequest([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] const uint32_t frame, [[maybe_unused]] typename Module::FrameContext &frameContext, [[maybe_unused]] const ControlList &controls) { } virtual void prepare([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] const uint32_t frame, [[maybe_unused]] typename Module::FrameContext &frameContext, [[maybe_unused]] typename Module::Params *params) { } virtual void process([[maybe_unused]] typename Module::Context &context, [[maybe_unused]] const uint32_t frame, [[maybe_unused]] typename Module::FrameContext &frameContext, [[maybe_unused]] const typename Module::Stats *stats, [[maybe_unused]] ControlList &metadata) { } }; 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 */