From patchwork Tue Sep 27 02:36:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 17435 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 6AE3FC0DA4 for ; Tue, 27 Sep 2022 02:37:41 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0564E622E8; Tue, 27 Sep 2022 04:37:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1664246261; bh=UlmoKdWfvwRreP4dtGHvpH32FV97sx3ax0ZcEdVQmGU=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=1CB9txdd8pJpMFjIceK+G2TrYQCCWMGKdYv6TKPmjStyd9yznhk5CwNHwxgs56fQ8 SyY6HMzNGpEhZ8f/Idyu3i/Ubua8/NAr9QMg0laAmwYSFevM/9lzh13oJzqyiNwE0Y XKol3xdITxqBxzgMXcCA9/Ytx9gka+uvZoG8jzFdhDSf/ASPqYcU27+0Fq20EE9miE Dn71K/IPOOCtK1SyKM3AuQeWhcMyRLs0eZqqJLfixsbj9NOxxo+OpgQOhB42rS0v+2 sR1uh8TOihSukCaURKez8dtFregd93kpMrBQ824y42QZg+pC4bSa62wceX3Ddzybp5 8eEDP1nUBUaqQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B7AB762268 for ; Tue, 27 Sep 2022 04:37:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="VusSu2EU"; dkim-atps=neutral Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 30FA0E5 for ; Tue, 27 Sep 2022 04:37:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1664246257; bh=UlmoKdWfvwRreP4dtGHvpH32FV97sx3ax0ZcEdVQmGU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=VusSu2EUhgIwMq31HAyRZPDBLm15c1BS1pvqPZlb2HWZ9C2Jnf6lirWbZxvjTB1IM 8Ncki0/Fs3cLzDBcN9SgoRHhn4U8qQP8nnc9SGtZANQ8dYMncUhsQfIevUp9ydL/O5 xRa3qg77tyCV6zcV50UdDQlfR+homop95UyDxyHw= To: libcamera-devel@lists.libcamera.org Date: Tue, 27 Sep 2022 05:36:33 +0300 Message-Id: <20220927023642.12341-25-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220927023642.12341-1-laurent.pinchart@ideasonboard.com> References: <20220927023642.12341-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v5 24/33] ipa: rkisp1: filter: Store per-frame information in frame context 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: Laurent Pinchart via libcamera-devel From: Laurent Pinchart Reply-To: Laurent Pinchart Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Rework the algorithm's usage of the active state, to store the value of controls for the last queued request in the queueRequest() function, and store a copy of the values in the corresponding frame context. The latter is used in the prepare() function to populate the ISP parameters with values corresponding to the right frame. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Jacopo Mondi --- Changes since v4: - Only update parameters when values have changed --- src/ipa/rkisp1/algorithms/filter.cpp | 49 +++++++++++++++++----------- src/ipa/rkisp1/ipa_context.cpp | 18 ++++++++-- src/ipa/rkisp1/ipa_context.h | 7 +++- 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp index 837560eb20a6..4b89c05a52c4 100644 --- a/src/ipa/rkisp1/algorithms/filter.cpp +++ b/src/ipa/rkisp1/algorithms/filter.cpp @@ -44,15 +44,20 @@ static constexpr uint32_t kFiltModeDefault = 0x000004f2; */ void Filter::queueRequest(IPAContext &context, [[maybe_unused]] const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameContext, + IPAFrameContext &frameContext, const ControlList &controls) { auto &filter = context.activeState.filter; + bool update = false; const auto &sharpness = controls.get(controls::Sharpness); if (sharpness) { - filter.sharpness = std::round(std::clamp(*sharpness, 0.0f, 10.0f)); - filter.updateParams = true; + unsigned int value = std::round(std::clamp(*sharpness, 0.0f, 10.0f)); + + if (filter.sharpness != value) { + filter.sharpness = value; + update = true; + } LOG(RkISP1Filter, Debug) << "Set sharpness to " << *sharpness; } @@ -63,42 +68,48 @@ void Filter::queueRequest(IPAContext &context, switch (*denoise) { case controls::draft::NoiseReductionModeOff: - filter.denoise = 0; - filter.updateParams = true; + if (filter.denoise != 0) { + filter.denoise = 0; + update = true; + } break; case controls::draft::NoiseReductionModeMinimal: - filter.denoise = 1; - filter.updateParams = true; + if (filter.denoise != 1) { + filter.denoise = 1; + update = true; + } break; case controls::draft::NoiseReductionModeHighQuality: case controls::draft::NoiseReductionModeFast: - filter.denoise = 3; - filter.updateParams = true; + if (filter.denoise != 3) { + filter.denoise = 3; + update = true; + } break; default: LOG(RkISP1Filter, Error) << "Unsupported denoise value " << *denoise; + break; } } + + frameContext.filter.denoise = filter.denoise; + frameContext.filter.sharpness = filter.sharpness; + frameContext.filter.update = update; } /** * \copydoc libcamera::ipa::Algorithm::prepare */ -void Filter::prepare(IPAContext &context, +void Filter::prepare([[maybe_unused]] IPAContext &context, [[maybe_unused]] const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameContext, - rkisp1_params_cfg *params) + IPAFrameContext &frameContext, rkisp1_params_cfg *params) { - auto &filter = context.activeState.filter; - /* Check if the algorithm configuration has been updated. */ - if (!filter.updateParams) + if (!frameContext.filter.update) return; - filter.updateParams = false; - static constexpr uint16_t filt_fac_sh0[] = { 0x04, 0x07, 0x0a, 0x0c, 0x10, 0x14, 0x1a, 0x1e, 0x24, 0x2a, 0x30 }; @@ -147,8 +158,8 @@ void Filter::prepare(IPAContext &context, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; - uint8_t denoise = filter.denoise; - uint8_t sharpness = filter.sharpness; + uint8_t denoise = frameContext.filter.denoise; + uint8_t sharpness = frameContext.filter.sharpness; auto &flt_config = params->others.flt_config; flt_config.fac_sh0 = filt_fac_sh0[sharpness]; diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp index c7cd007b2428..4380634e272d 100644 --- a/src/ipa/rkisp1/ipa_context.cpp +++ b/src/ipa/rkisp1/ipa_context.cpp @@ -179,9 +179,6 @@ namespace libcamera::ipa::rkisp1 { * * \var IPAActiveState::filter.sharpness * \brief Sharpness level - * - * \var IPAActiveState::filter.updateParams - * \brief Indicates if ISP parameters need to be updated */ /** @@ -260,6 +257,21 @@ namespace libcamera::ipa::rkisp1 { * compared to the previous frame */ +/** + * \var IPAFrameContext::filter + * \brief Filter parameters for this frame + * + * \struct IPAFrameContext::filter.denoise + * \brief Denoising level + * + * \var IPAFrameContext::filter.sharpness + * \brief Sharpness level + * + * \var IPAFrameContext::filter.updateParams + * \brief Indicates if the filter parameters have been updated compared to the + * previous frame + */ + /** * \var IPAFrameContext::sensor * \brief Sensor configuration that used been used for this frame diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h index 81b632a15960..9a16dd6cf108 100644 --- a/src/ipa/rkisp1/ipa_context.h +++ b/src/ipa/rkisp1/ipa_context.h @@ -85,7 +85,6 @@ struct IPAActiveState { struct { uint8_t denoise; uint8_t sharpness; - bool updateParams; } filter; }; @@ -118,6 +117,12 @@ struct IPAFrameContext : public FrameContext { bool update; } dpf; + struct { + uint8_t denoise; + uint8_t sharpness; + bool update; + } filter; + struct { uint32_t exposure; double gain;