summaryrefslogtreecommitdiff
path: root/include/libcamera/internal
diff options
context:
space:
mode:
Diffstat (limited to 'include/libcamera/internal')
-rw-r--r--include/libcamera/internal/ipa_context_wrapper.h53
-rw-r--r--include/libcamera/internal/ipa_manager.h31
-rw-r--r--include/libcamera/internal/ipa_module.h4
-rw-r--r--include/libcamera/internal/ipa_proxy.h31
-rw-r--r--include/libcamera/internal/meson.build1
-rw-r--r--include/libcamera/internal/pipeline_handler.h1
6 files changed, 30 insertions, 91 deletions
diff --git a/include/libcamera/internal/ipa_context_wrapper.h b/include/libcamera/internal/ipa_context_wrapper.h
deleted file mode 100644
index ec27e48e..00000000
--- a/include/libcamera/internal/ipa_context_wrapper.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2019, Google Inc.
- *
- * ipa_context_wrapper.h - Image Processing Algorithm context wrapper
- */
-#ifndef __LIBCAMERA_INTERNAL_IPA_CONTEXT_WRAPPER_H__
-#define __LIBCAMERA_INTERNAL_IPA_CONTEXT_WRAPPER_H__
-
-#include <libcamera/ipa/ipa_interface.h>
-
-#include "libcamera/internal/control_serializer.h"
-
-namespace libcamera {
-
-class IPAContextWrapper final : public IPAInterface
-{
-public:
- IPAContextWrapper(struct ipa_context *context);
- ~IPAContextWrapper();
-
- int init(const IPASettings &settings) override;
- int start(const IPAOperationData &data,
- IPAOperationData *result) override;
- void stop() override;
- void configure(const CameraSensorInfo &sensorInfo,
- const std::map<unsigned int, IPAStream> &streamConfig,
- const std::map<unsigned int, const ControlInfoMap &> &entityControls,
- const IPAOperationData &ipaConfig,
- IPAOperationData *result) override;
-
- void mapBuffers(const std::vector<IPABuffer> &buffers) override;
- void unmapBuffers(const std::vector<unsigned int> &ids) override;
-
- virtual void processEvent(const IPAOperationData &data) override;
-
-private:
- static void queue_frame_action(void *ctx, unsigned int frame,
- struct ipa_operation_data &data);
- static const struct ipa_callback_ops callbacks_;
-
- void doQueueFrameAction(unsigned int frame,
- const IPAOperationData &data);
-
- struct ipa_context *ctx_;
- IPAInterface *intf_;
-
- ControlSerializer serializer_;
-};
-
-} /* namespace libcamera */
-
-#endif /* __LIBCAMERA_INTERNAL_IPA_CONTEXT_WRAPPER_H__ */
diff --git a/include/libcamera/internal/ipa_manager.h b/include/libcamera/internal/ipa_manager.h
index 4a143b6a..e904a2be 100644
--- a/include/libcamera/internal/ipa_manager.h
+++ b/include/libcamera/internal/ipa_manager.h
@@ -14,20 +14,45 @@
#include <libcamera/ipa/ipa_module_info.h>
#include "libcamera/internal/ipa_module.h"
+#include "libcamera/internal/log.h"
#include "libcamera/internal/pipeline_handler.h"
#include "libcamera/internal/pub_key.h"
namespace libcamera {
+LOG_DECLARE_CATEGORY(IPAManager)
+
class IPAManager
{
public:
IPAManager();
~IPAManager();
- static std::unique_ptr<IPAProxy> createIPA(PipelineHandler *pipe,
- uint32_t maxVersion,
- uint32_t minVersion);
+ template<typename T>
+ static std::unique_ptr<T> createIPA(PipelineHandler *pipe,
+ uint32_t maxVersion,
+ uint32_t minVersion)
+ {
+ IPAModule *m = nullptr;
+
+ for (IPAModule *module : self_->modules_) {
+ if (module->match(pipe, minVersion, maxVersion)) {
+ m = module;
+ break;
+ }
+ }
+
+ if (!m)
+ return nullptr;
+
+ std::unique_ptr<T> proxy = std::make_unique<T>(m, !self_->isSignatureValid(m));
+ if (!proxy->isValid()) {
+ LOG(IPAManager, Error) << "Failed to load proxy";
+ return nullptr;
+ }
+
+ return proxy;
+ }
private:
static IPAManager *self_;
diff --git a/include/libcamera/internal/ipa_module.h b/include/libcamera/internal/ipa_module.h
index c2df2476..19fc5827 100644
--- a/include/libcamera/internal/ipa_module.h
+++ b/include/libcamera/internal/ipa_module.h
@@ -33,7 +33,7 @@ public:
bool load();
- struct ipa_context *createContext();
+ IPAInterface *createInterface();
bool match(PipelineHandler *pipe,
uint32_t minVersion, uint32_t maxVersion) const;
@@ -52,7 +52,7 @@ private:
bool loaded_;
void *dlHandle_;
- typedef struct ipa_context *(*IPAIntfFactory)();
+ typedef IPAInterface *(*IPAIntfFactory)(void);
IPAIntfFactory ipaCreate_;
};
diff --git a/include/libcamera/internal/ipa_proxy.h b/include/libcamera/internal/ipa_proxy.h
index 49399f4e..f651a3ae 100644
--- a/include/libcamera/internal/ipa_proxy.h
+++ b/include/libcamera/internal/ipa_proxy.h
@@ -27,8 +27,6 @@ public:
std::string configurationFile(const std::string &file) const;
- void stop() override = 0;
-
protected:
std::string resolvePath(const std::string &file) const;
@@ -38,35 +36,6 @@ private:
IPAModule *ipam_;
};
-class IPAProxyFactory
-{
-public:
- IPAProxyFactory(const char *name);
- virtual ~IPAProxyFactory() = default;
-
- virtual std::unique_ptr<IPAProxy> create(IPAModule *ipam) = 0;
-
- const std::string &name() const { return name_; }
-
- static void registerType(IPAProxyFactory *factory);
- static std::vector<IPAProxyFactory *> &factories();
-
-private:
- std::string name_;
-};
-
-#define REGISTER_IPA_PROXY(proxy) \
-class proxy##Factory final : public IPAProxyFactory \
-{ \
-public: \
- proxy##Factory() : IPAProxyFactory(#proxy) {} \
- std::unique_ptr<IPAProxy> create(IPAModule *ipam) \
- { \
- return std::make_unique<proxy>(ipam); \
- } \
-}; \
-static proxy##Factory global_##proxy##Factory;
-
} /* namespace libcamera */
#endif /* __LIBCAMERA_INTERNAL_IPA_PROXY_H__ */
diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build
index a1071721..1fe3918c 100644
--- a/include/libcamera/internal/meson.build
+++ b/include/libcamera/internal/meson.build
@@ -26,7 +26,6 @@ libcamera_internal_headers = files([
'event_notifier.h',
'file.h',
'formats.h',
- 'ipa_context_wrapper.h',
'ipa_manager.h',
'ipa_module.h',
'ipa_proxy.h',
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index d81c9b85..d455d3c9 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -47,7 +47,6 @@ public:
std::list<Request *> queuedRequests_;
ControlInfoMap controlInfo_;
ControlList properties_;
- std::unique_ptr<IPAProxy> ipa_;
private:
LIBCAMERA_DISABLE_COPY(CameraData)