@@ -8,6 +8,10 @@
#define __LIBCAMERA_IPA_INTERFACE_H__
#ifdef __cplusplus
+#include <cstdint>
+
+#include "libcamera/controls.h"
+
extern "C" {
#endif
@@ -16,6 +20,10 @@ struct ipa_context {
};
struct ipa_operations {
+ int (*init_controls)(struct ipa_context *ctx, uint8_t *controlInfo,
+ std::size_t len);
+ int (*queue_request)(struct ipa_context *ctx, uint8_t *controls,
+ std::size_t len);
void (*destroy)(struct ipa_context *ctx);
};
@@ -28,6 +36,9 @@ class IPAInterface
{
public:
virtual ~IPAInterface() {}
+
+ virtual int initControls(ControlInfoMap &controlInfo) = 0;
+ virtual int queueRequest(ControlList &controls) = 0;
};
} /* namespace libcamera */
@@ -14,6 +14,16 @@ namespace libcamera {
class IPADummy : public IPAInterface
{
+public:
+ int initControls(ControlInfoMap &controlInfo) override
+ {
+ return 0;
+ }
+
+ int queueRequest(ControlList &controls) override
+ {
+ return 0;
+ }
};
/*
@@ -61,12 +61,33 @@ void IPAInterfaceWrapper::destroy(struct ipa_context *_ctx)
delete ctx;
}
+int IPAInterfaceWrapper::initControls(struct ipa_context *_ctx,
+ uint8_t *data, std::size_t len)
+{
+ IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
+
+ return ctx->controlInfoMap_.deserialize(data, len);
+}
+
+int IPAInterfaceWrapper::queueRequest(struct ipa_context *_ctx,
+ uint8_t *data, std::size_t len)
+{
+ IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
+
+ ControlList controls(ctx->controlInfoMap_);
+ controls.deserialize(data, len);
+
+ return ctx->ipa->queueRequest(controls);
+}
+
#ifndef __DOXYGEN__
/*
* This construct confuses Doygen and makes it believe that all members of the
* operations is a member of IPAInterfaceWrapper. It must thus be hidden.
*/
const struct ipa_operations IPAInterfaceWrapper::operations = {
+ .init_controls = &IPAInterfaceWrapper::initControls,
+ .queue_request = &IPAInterfaceWrapper::queueRequest,
.destroy = &IPAInterfaceWrapper::destroy,
};
#endif
@@ -15,6 +15,10 @@ class IPAInterfaceWrapper : public ipa_context
{
public:
IPAInterfaceWrapper(IPAInterface *interface);
+ static int initControls(struct ipa_context *_ctx,
+ uint8_t *controlInfo, std::size_t len);
+ static int queueRequest(struct ipa_context *_ctx,
+ uint8_t *controls, std::size_t len);
private:
static void destroy(struct ipa_context *ctx);
@@ -22,6 +26,8 @@ private:
static const struct ipa_operations operations;
IPAInterface *ipa;
+
+ ControlInfoMap controlInfoMap_;
};
} /* namespace libcamera */
@@ -9,14 +9,21 @@
#include <ipa/ipa_interface.h>
+#include <cstdint>
+
namespace libcamera {
+class ControlInfoMap;
+class ControlList;
class IPAContextWrapper final : public IPAInterface
{
public:
IPAContextWrapper(struct ipa_context *context);
~IPAContextWrapper();
+ int initControls(ControlInfoMap &controlInfo) override;
+ int queueRequest(ControlList &controls) override;
+
private:
struct ipa_context *ctx_;
};
@@ -8,6 +8,7 @@
#include "ipa_context_wrapper.h"
#include <libcamera/controls.h>
+#include <libcamera/serializable.h>
/**
* \file ipa_context_wrapper.h
@@ -49,4 +50,22 @@ IPAContextWrapper::~IPAContextWrapper()
ctx_->ops->destroy(ctx_);
}
+int IPAContextWrapper::initControls(ControlInfoMap &controlInfo)
+{
+ std::unique_ptr<DataBlob> blob = controlInfo.serialize();
+ if (!blob->valid())
+ return -EINVAL;
+
+ return ctx_->ops->init_controls(ctx_, blob->data(), blob->size());
+}
+
+int IPAContextWrapper::queueRequest(ControlList &controls)
+{
+ std::unique_ptr<DataBlob> blob = controls.serialize();
+ if (!blob->valid())
+ return -EINVAL;
+
+ return ctx_->ops->queue_request(ctx_, blob->data(), blob->size());
+}
+
} /* namespace libcamera */
@@ -26,6 +26,16 @@ public:
IPAProxyLinux(IPAModule *ipam);
~IPAProxyLinux();
+ int initControls(ControlInfoMap &controlInfo) override
+ {
+ return 0;
+ }
+
+ int queueRequest(ControlList &controls) override
+ {
+ return 0;
+ }
+
private:
void readyRead(IPCUnixSocket *ipc);
Implement operations plumbing in the IPA interface for the init_controls() operation and queue_request() one. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> --- include/ipa/ipa_interface.h | 11 +++++++++++ src/ipa/ipa_dummy.cpp | 10 ++++++++++ src/ipa/libipa/ipa_interface_wrapper.cpp | 21 +++++++++++++++++++++ src/ipa/libipa/ipa_interface_wrapper.h | 6 ++++++ src/libcamera/include/ipa_context_wrapper.h | 7 +++++++ src/libcamera/ipa_context_wrapper.cpp | 19 +++++++++++++++++++ src/libcamera/proxy/ipa_proxy_linux.cpp | 10 ++++++++++ 7 files changed, 84 insertions(+)