[libcamera-devel,18/21] POC: Add control related operation to IPA

Message ID 20190924172503.30864-19-jacopo@jmondi.org
State Superseded
Headers show
Series
  • Implement control serialization
Related show

Commit Message

Jacopo Mondi Sept. 24, 2019, 5:25 p.m. UTC
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(+)

Patch

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);