From patchwork Wed Nov 23 13:43:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 17848 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 375EFBE08B for ; Wed, 23 Nov 2022 13:44:00 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E98556331E; Wed, 23 Nov 2022 14:43:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1669211039; bh=B4yGLK0L1CqI8Ruh1+blBFV5EgL9RagzdtM5FeuENh4=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=F/P7aobVjl6kXbMd3VGEGDt+dClWar0SJXAlTQ+mro76tEKXb6w1PLGVltIc8O2rk UB556fB6qH8qwKATFxIH8hsih212xEo55YBdk66jZOwikdepkXinpEacA6YYjzRU5q 8tkIhahZSte4DfrUo7gQrJodC5khqgvZg4wnJL5IJ1Qnj9LLICMJ2aQKf6lj7eSm28 Rrf3gV9DMZS40BU6vWu320LwL8v/RtA4Bspc/d4IQs8hUEqk3kDOgF83gcJwiqFe9I VNtut0s01vcLhFQlhyVfybqh5usjuWHsy/3vbDMqK81rrWqdqIm0SeDab5bGS8D4vl ewe8hHsU878jw== Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::224]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B5CF963311 for ; Wed, 23 Nov 2022 14:43:58 +0100 (CET) Received: (Authenticated sender: jacopo@jmondi.org) by mail.gandi.net (Postfix) with ESMTPSA id 778C2E0014; Wed, 23 Nov 2022 13:43:56 +0000 (UTC) To: libcamera-devel@lists.libcamera.org Date: Wed, 23 Nov 2022 14:43:44 +0100 Message-Id: <20221123134346.129807-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221123134346.129807-1-jacopo@jmondi.org> References: <20221123134346.129807-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/4] ipa: rkisp1: Use IPAConfig in IPA::configure() 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-Patchwork-Original-From: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Cc: Nicholas Roth Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The RkISP1 implementation of IPA::configure() still uses the legacy interface where sensor controls (and eventually lens controls) are passed from the pipeline handler to the IPA in a map. Since the introduction of mojom-based IPA interface definition, it is possible to define custom data types and use them in the interface definition between the pipeline handler and the IPA. Align the RkISP1 IPA::configure() implementation with the one in the IPU3 IPA module by using a custom data type instead of relying on a map to pass controls to the IPA. Signed-off-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- include/libcamera/ipa/rkisp1.mojom | 10 ++++++--- src/ipa/rkisp1/rkisp1.cpp | 26 ++++++++++-------------- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 12 +++++------ 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom index eaf3955e4096..36bf291e8a51 100644 --- a/include/libcamera/ipa/rkisp1.mojom +++ b/include/libcamera/ipa/rkisp1.mojom @@ -8,6 +8,11 @@ module ipa.rkisp1; import "include/libcamera/ipa/core.mojom"; +struct IPAConfigInfo { + libcamera.IPACameraSensorInfo sensorInfo; + libcamera.ControlInfoMap sensorControls; +}; + interface IPARkISP1Interface { init(libcamera.IPASettings settings, uint32 hwRevision) @@ -15,9 +20,8 @@ interface IPARkISP1Interface { start() => (int32 ret); stop(); - configure(libcamera.IPACameraSensorInfo sensorInfo, - map streamConfig, - map entityControls) + configure(IPAConfigInfo configInfo, + map streamConfig) => (int32 ret); mapBuffers(array buffers); diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index d237758f7bf0..088d7c74d448 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -53,9 +53,8 @@ public: int start() override; void stop() override; - int configure(const IPACameraSensorInfo &info, - const std::map &streamConfig, - const std::map &entityControls) override; + int configure(const IPAConfigInfo &ipaConfig, + const std::map &streamConfig) override; void mapBuffers(const std::vector &buffers) override; void unmapBuffers(const std::vector &ids) override; @@ -73,7 +72,7 @@ private: std::map buffers_; std::map mappedBuffers_; - ControlInfoMap ctrls_; + ControlInfoMap sensorControls_; /* revision-specific data */ rkisp1_cif_isp_version hwRevision_; @@ -206,20 +205,16 @@ void IPARkISP1::stop() * assemble one. Make sure the reported sensor information are relevant * before accessing them. */ -int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info, - [[maybe_unused]] const std::map &streamConfig, - const std::map &entityControls) +int IPARkISP1::configure(const IPAConfigInfo &ipaConfig, + [[maybe_unused]] const std::map &streamConfig) { - if (entityControls.empty()) - return -EINVAL; - - ctrls_ = entityControls.at(0); + sensorControls_ = ipaConfig.sensorControls; - const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE); + const auto itExp = sensorControls_.find(V4L2_CID_EXPOSURE); int32_t minExposure = itExp->second.min().get(); int32_t maxExposure = itExp->second.max().get(); - const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN); + const auto itGain = sensorControls_.find(V4L2_CID_ANALOGUE_GAIN); int32_t minGain = itGain->second.min().get(); int32_t maxGain = itGain->second.max().get(); @@ -235,7 +230,8 @@ int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info, /* Set the hardware revision for the algorithms. */ context_.configuration.hw.revision = hwRevision_; - const ControlInfo vBlank = ctrls_.find(V4L2_CID_VBLANK)->second; + const IPACameraSensorInfo &info = ipaConfig.sensorInfo; + const ControlInfo vBlank = sensorControls_.find(V4L2_CID_VBLANK)->second; context_.configuration.sensor.defVBlank = vBlank.def().get(); context_.configuration.sensor.size = info.outputSize; context_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate; @@ -353,7 +349,7 @@ void IPARkISP1::setControls(unsigned int frame) uint32_t exposure = frameContext.agc.exposure; uint32_t gain = camHelper_->gainCode(frameContext.agc.gain); - ControlList ctrls(ctrls_); + ControlList ctrls(sensorControls_); ctrls.set(V4L2_CID_EXPOSURE, static_cast(exposure)); ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast(gain)); diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 3d3a7086c03a..4f0e1f8b1a35 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -715,18 +715,18 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c) return ret; /* Inform IPA of stream configuration and sensor controls. */ - IPACameraSensorInfo sensorInfo = {}; - ret = data->sensor_->sensorInfo(&sensorInfo); + ipa::rkisp1::IPAConfigInfo ipaConfig{}; + + ret = data->sensor_->sensorInfo(&ipaConfig.sensorInfo); if (ret) { /* \todo Turn this into a hard failure. */ LOG(RkISP1, Warning) << "Camera sensor information not available"; - sensorInfo = {}; + ipaConfig.sensorInfo = {}; } - std::map entityControls; - entityControls.emplace(0, data->sensor_->controls()); + ipaConfig.sensorControls = data->sensor_->controls(); - ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls); + ret = data->ipa_->configure(ipaConfig, streamConfig); if (ret) { LOG(RkISP1, Error) << "failed configuring IPA (" << ret << ")"; return ret;