[libcamera-devel] [PATCH 18/21] POC: Add control related operation to IPA
Jacopo Mondi
jacopo at jmondi.org
Tue Sep 24 19:25:00 CEST 2019
Implement operations plumbing in the IPA interface for the
init_controls() operation and queue_request() one.
Signed-off-by: Jacopo Mondi <jacopo at 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(+)
diff --git a/include/ipa/ipa_interface.h b/include/ipa/ipa_interface.h
index f1ebac20f151..d50ec41ba55e 100644
--- a/include/ipa/ipa_interface.h
+++ b/include/ipa/ipa_interface.h
@@ -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 */
diff --git a/src/ipa/ipa_dummy.cpp b/src/ipa/ipa_dummy.cpp
index 6dc9448a3f56..ec79ba83ce58 100644
--- a/src/ipa/ipa_dummy.cpp
+++ b/src/ipa/ipa_dummy.cpp
@@ -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;
+ }
};
/*
diff --git a/src/ipa/libipa/ipa_interface_wrapper.cpp b/src/ipa/libipa/ipa_interface_wrapper.cpp
index aacd189851c3..bc2fb3b78ea2 100644
--- a/src/ipa/libipa/ipa_interface_wrapper.cpp
+++ b/src/ipa/libipa/ipa_interface_wrapper.cpp
@@ -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
diff --git a/src/ipa/libipa/ipa_interface_wrapper.h b/src/ipa/libipa/ipa_interface_wrapper.h
index d2ab46f50d3c..ec528f624494 100644
--- a/src/ipa/libipa/ipa_interface_wrapper.h
+++ b/src/ipa/libipa/ipa_interface_wrapper.h
@@ -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 */
diff --git a/src/libcamera/include/ipa_context_wrapper.h b/src/libcamera/include/ipa_context_wrapper.h
index 12894ac6885e..c7820290c56a 100644
--- a/src/libcamera/include/ipa_context_wrapper.h
+++ b/src/libcamera/include/ipa_context_wrapper.h
@@ -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_;
};
diff --git a/src/libcamera/ipa_context_wrapper.cpp b/src/libcamera/ipa_context_wrapper.cpp
index 87ff98d45c99..fbb9eb1df6eb 100644
--- a/src/libcamera/ipa_context_wrapper.cpp
+++ b/src/libcamera/ipa_context_wrapper.cpp
@@ -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 */
diff --git a/src/libcamera/proxy/ipa_proxy_linux.cpp b/src/libcamera/proxy/ipa_proxy_linux.cpp
index c9eaedff0224..052f6c00afad 100644
--- a/src/libcamera/proxy/ipa_proxy_linux.cpp
+++ b/src/libcamera/proxy/ipa_proxy_linux.cpp
@@ -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);
--
2.23.0
More information about the libcamera-devel
mailing list