From patchwork Tue Sep 24 17:25:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2017 Return-Path: Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9A34462381 for ; Tue, 24 Sep 2019 19:23:40 +0200 (CEST) X-Originating-IP: 213.45.248.89 Received: from uno.homenet.telecomitalia.it (host89-248-dynamic.45-213-r.retail.telecomitalia.it [213.45.248.89]) (Authenticated sender: jacopo@jmondi.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 245C960005 for ; Tue, 24 Sep 2019 17:23:39 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Tue, 24 Sep 2019 19:25:00 +0200 Message-Id: <20190924172503.30864-19-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190924172503.30864-1-jacopo@jmondi.org> References: <20190924172503.30864-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 18/21] POC: Add control related operation to IPA X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Sep 2019 17:23:40 -0000 Implement operations plumbing in the IPA interface for the init_controls() operation and queue_request() one. Signed-off-by: Jacopo Mondi --- 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 + +#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(_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(_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 +#include + 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 +#include /** * \file ipa_context_wrapper.h @@ -49,4 +50,22 @@ IPAContextWrapper::~IPAContextWrapper() ctx_->ops->destroy(ctx_); } +int IPAContextWrapper::initControls(ControlInfoMap &controlInfo) +{ + std::unique_ptr 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 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);