From patchwork Mon Sep 29 20:19:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24489 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 D98A5C324C for ; Mon, 29 Sep 2025 20:19:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 769186B606; Mon, 29 Sep 2025 22:19:45 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="e0J9OJnj"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 55EB86B599 for ; Mon, 29 Sep 2025 22:19:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177181; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gtF6tvopxppCfY4ryWmG+3Op4EESknysgTiAOm9AzZ4=; b=e0J9OJnjxPvYzaJobkioXZ2xqruPO8YospueGOgvZp6vqE+M0wuEyuqBc5ndWAIUVO21Da yAV9cM2KM6iUXd9LRv3MMfMboSqSveH26S8nMVx9w/ySG7pKlPNT1c3IGuvuUoAz4QU9gI 8yK3oHeaGNg9wvuRT9GuY3vWHG3Wm7Q= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-662-KDXlK-ETPa63Qv6EYGwflA-1; Mon, 29 Sep 2025 16:19:38 -0400 X-MC-Unique: KDXlK-ETPa63Qv6EYGwflA-1 X-Mimecast-MFC-AGG-ID: KDXlK-ETPa63Qv6EYGwflA_1759177177 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 72B57180057E; Mon, 29 Sep 2025 20:19:36 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id ACAEA19560B4; Mon, 29 Sep 2025 20:19:33 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org, =?utf-8?b?QmFybmFiw6Fz?= =?utf-8?q?_P=C5=91cze?= Subject: [PATCH v5 1/7] libcamera: software_isp: Fix width adjustment in SwStatsCpu::setWindow Date: Mon, 29 Sep 2025 22:19:18 +0200 Message-ID: <20250929201924.45019-2-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: NcF3N_4MvYJ_A7W09QzpKClBiXeMU32nkTUXvXe2JQU_1759177177 X-Mimecast-Originator: redhat.com 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" SwStatsCpu::setWindow reduces the window width by the added x-offset, to prevent exceeding image bounds. But if the window width is smaller than the x-offset, we get unsigned integer underflow. Fix it by setting the window width to 0 in such a case. Signed-off-by: Milan Zamazal Reviewed-by: Barnabás Pőcze Reviewed-by: Hans de Goede --- src/libcamera/software_isp/swstats_cpu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp index 4b77b3600..e8a1d52f2 100644 --- a/src/libcamera/software_isp/swstats_cpu.cpp +++ b/src/libcamera/software_isp/swstats_cpu.cpp @@ -426,7 +426,7 @@ void SwStatsCpu::setWindow(const Rectangle &window) window_.y &= ~(patternSize_.height - 1); /* width_ - xShift_ to make sure the window fits */ - window_.width -= xShift_; + window_.width = (window_.width > xShift_ ? window_.width - xShift_ : 0); window_.width &= ~(patternSize_.width - 1); window_.height &= ~(patternSize_.height - 1); } From patchwork Mon Sep 29 20:19:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24490 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 BF9CEC324C for ; Mon, 29 Sep 2025 20:19:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B104A6B608; Mon, 29 Sep 2025 22:19:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="Lx2ghXNE"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 588886B5AA for ; Mon, 29 Sep 2025 22:19:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177183; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZpM7qgEkfxJ1HoluNj1IKEk3XxxwHeTLA5SiE1Wi6xA=; b=Lx2ghXNEHWgnAmKxGvz2v6p6zCgbDE2+XWirBHXzl69KAJXu+FPHvt2woniz3Cl3eDHBZp eHfMvkfphQZG7VJNGjPzYj0nI+AexSGG4ISGM1ixs8tHzw3v0BPMj2qmDsm3t0ywnt6NsH 8bkMIjZ92BWh6lIjSXNzIub+TS1aGio= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-613-vNEewdM9M6KhS64Gtq-a3Q-1; Mon, 29 Sep 2025 16:19:40 -0400 X-MC-Unique: vNEewdM9M6KhS64Gtq-a3Q-1 X-Mimecast-MFC-AGG-ID: vNEewdM9M6KhS64Gtq-a3Q_1759177179 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id C6A571800447; Mon, 29 Sep 2025 20:19:38 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id ECA6C19560B4; Mon, 29 Sep 2025 20:19:36 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org Subject: [PATCH v5 2/7] libcamera: software_isp: Clarify SwStatsCpu::setWindow use Date: Mon, 29 Sep 2025 22:19:19 +0200 Message-ID: <20250929201924.45019-3-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: vvzT7ZrzIMPSiBGRlNsbZOHmib2QSQRYDADVP8xAeZM_1759177179 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The window coordinates passed to SwStatsCpu::setWindow are confusing. Let's clarify what the coordinates should be. A source of confusion is that the specified window is relative to the processed area. Debayering adjusts line pointers for its processed area and this is what's also passed to stats processing. The window passed to SwStatsCpu::setWindow should either specify the size of the whole processed (not image) area, or its cropping in case the stats shouldn't be gathered over the whole processed area. This patch should clarify this in the code. Reviewed-by: Maciej S. Szmigiero Reviewed-by: Hans de Goede Signed-off-by: Milan Zamazal Reviewed-by: Barnabás Pőcze --- src/libcamera/software_isp/debayer_cpu.cpp | 6 +++++- src/libcamera/software_isp/swstats_cpu.cpp | 24 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index 2dc85e5e0..bcaaa5dee 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -554,7 +554,11 @@ int DebayerCpu::configure(const StreamConfiguration &inputCfg, window_.width = outputCfg.size.width; window_.height = outputCfg.size.height; - /* Don't pass x,y since process() already adjusts src before passing it */ + /* + * Set the stats window to the whole processed window. Its coordinates are + * relative to the debayered area since debayering passes only the part of + * data to be processed to the stats; see SwStatsCpu::setWindow. + */ stats_->setWindow(Rectangle(window_.size())); /* pad with patternSize.Width on both left and right side */ diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp index e8a1d52f2..4031c1a9e 100644 --- a/src/libcamera/software_isp/swstats_cpu.cpp +++ b/src/libcamera/software_isp/swstats_cpu.cpp @@ -416,9 +416,33 @@ int SwStatsCpu::configure(const StreamConfiguration &inputCfg) /** * \brief Specify window coordinates over which to gather statistics * \param[in] window The window object. + * + * This method specifies the image area over which to gather the statistics. + * It must be called to set the area, otherwise the default zero-sized + * \a Rectangle is used and no statistics is gathered. + * + * The specified \a window is relative to what is passed to the processLine* + * methods. For example, if statistics are to be gathered from the entire + * processed area, then \a window should be a rectangle with the top-left corner + * of (0,0) and the same size as the processed area. If only a part of the + * processed area (e.g. its centre) is to be considered for statistics, then + * \a window should specify such a restriction accordingly. + * + * It is the responsibility of the callers to provide sensible \a window values, + * most notably not exceeding the original image boundaries. This means, among + * other, that neither coordinate of the top-left corner shall be negative. + * + * Due to limitations of the implementation, the method may adjust the window + * slightly if it is not aligned according to the bayer pattern determined in + * \a SwStatsCpu::configure(). In that case the window will be modified such that + * the sides are no larger than the original, and that the new bottom-left + * corner will be no further from (0,0) (along either axis) than the original + * was. */ void SwStatsCpu::setWindow(const Rectangle &window) { + ASSERT(window.x >= 0 && window.y >= 0); + window_ = window; window_.x &= ~(patternSize_.width - 1); From patchwork Mon Sep 29 20:19:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24491 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 9591DC324C for ; Mon, 29 Sep 2025 20:19:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4602D6B626; Mon, 29 Sep 2025 22:19:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="DtmugV5S"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BA5F26B60F for ; Mon, 29 Sep 2025 22:19:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177185; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Y3EvnC9xVYMjL2+fsG65hSpjsgf/MkaX0weBsZfpdfg=; b=DtmugV5Sve5W/zSC0R1qXfH9p9nBBREn/DzSqzZ+UjRe4lIFhTQ21Io6ongwx4WyBl8uKY q7+GjW8Vpbe4s4jISULZFObrWDCJTULwJpciFtNNrt4wDyMgPFtnOt6BzEl3AKZTYrWGIX rZbe16RBxW6bLRDo30oVbxDZsvmyGbw= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-676-i4pJqKgxNQ2UYJ08fmtccQ-1; Mon, 29 Sep 2025 16:19:42 -0400 X-MC-Unique: i4pJqKgxNQ2UYJ08fmtccQ-1 X-Mimecast-MFC-AGG-ID: i4pJqKgxNQ2UYJ08fmtccQ_1759177181 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 33781195E916; Mon, 29 Sep 2025 20:19:41 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6AB9319560B4; Mon, 29 Sep 2025 20:19:39 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org Subject: [PATCH v5 3/7] libcamera: software_isp: Pass correct y-coordinate to stats Date: Mon, 29 Sep 2025 22:19:20 +0200 Message-ID: <20250929201924.45019-4-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: NY2qL20W9YJEm1mAOdQXuMMO9PkRIrS5JrfJfvyhsy0_1759177181 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The window set by SwStatsCpu::setWindow is relative to the processed image area. But debayering passes the processed line y-coordinate to the stats relative to the whole image area. This can result in gathering stats from a wrong image area or in not gathering stats at all. Let's pass the correct y-coordinate to the stats processing methods. Bug: https://bugs.libcamera.org/show_bug.cgi?id=280 Signed-off-by: Maciej S. Szmigiero Signed-off-by: Milan Zamazal Reviewed-by: Hans de Goede Reviewed-by: Barnabás Pőcze --- src/libcamera/software_isp/debayer_cpu.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index bcaaa5dee..09d171d6b 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -661,7 +661,7 @@ void DebayerCpu::memcpyNextLine(const uint8_t *linePointers[]) void DebayerCpu::process2(const uint8_t *src, uint8_t *dst) { - unsigned int yEnd = window_.y + window_.height; + unsigned int yEnd = window_.height; /* Holds [0] previous- [1] current- [2] next-line */ const uint8_t *linePointers[3]; @@ -676,13 +676,16 @@ void DebayerCpu::process2(const uint8_t *src, uint8_t *dst) /* window_.y == 0, use the next line as prev line */ linePointers[1] = src + inputConfig_.stride; linePointers[2] = src; - /* Last 2 lines also need special handling */ + /* + * Last 2 lines also need special handling. + * (And configure() ensures that yEnd >= 2.) + */ yEnd -= 2; } setupInputMemcpy(linePointers); - for (unsigned int y = window_.y; y < yEnd; y += 2) { + for (unsigned int y = 0; y < yEnd; y += 2) { shiftLinePointers(linePointers, src); memcpyNextLine(linePointers); stats_->processLine0(y, linePointers); @@ -716,7 +719,6 @@ void DebayerCpu::process2(const uint8_t *src, uint8_t *dst) void DebayerCpu::process4(const uint8_t *src, uint8_t *dst) { - const unsigned int yEnd = window_.y + window_.height; /* * This holds pointers to [0] 2-lines-up [1] 1-line-up [2] current-line * [3] 1-line-down [4] 2-lines-down. @@ -734,7 +736,7 @@ void DebayerCpu::process4(const uint8_t *src, uint8_t *dst) setupInputMemcpy(linePointers); - for (unsigned int y = window_.y; y < yEnd; y += 4) { + for (unsigned int y = 0; y < window_.height; y += 4) { shiftLinePointers(linePointers, src); memcpyNextLine(linePointers); stats_->processLine0(y, linePointers); From patchwork Mon Sep 29 20:19:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24492 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 7DF67C324C for ; Mon, 29 Sep 2025 20:19:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D21816B62C; Mon, 29 Sep 2025 22:19:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="K3hB9RUa"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7F25F6B61A for ; Mon, 29 Sep 2025 22:19:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177187; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lDb09VGyzhqP5r/oXwXiq9KLrF0OQQgUEyOYPhJgWx4=; b=K3hB9RUag8UI4cQ9CB4jJfay9IY5OTDVcKCks9C8PPRSbXzqCPqbG5Uk4eaK3tq+Vs1TeZ HmKyev8l6dGeag2ln+L1YburFSYNnqrlrf5b9/8/JleikfieVfKEpmwCpBoFvxsMNk7++V aS87At41tCSjcQsMBEvEUNcWcq2wxSw= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-687-i5MYK76fM-W8Kc-1iVSYAQ-1; Mon, 29 Sep 2025 16:19:46 -0400 X-MC-Unique: i5MYK76fM-W8Kc-1iVSYAQ-1 X-Mimecast-MFC-AGG-ID: i5MYK76fM-W8Kc-1iVSYAQ_1759177184 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 54AC01956096; Mon, 29 Sep 2025 20:19:44 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C2D3D19560B4; Mon, 29 Sep 2025 20:19:41 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org, =?utf-8?b?QmFybmFiw6Fz?= =?utf-8?q?_P=C5=91cze?= Subject: [PATCH v5 4/7] ipa: simple: awb: Avoid incorrect arithmetic in AWB Date: Mon, 29 Sep 2025 22:19:21 +0200 Message-ID: <20250929201924.45019-5-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: rNAZ5FGjfqLdJn9BSPr6C-I_WTo14QxPAWT6I5OlH1g_1759177184 X-Mimecast-Originator: redhat.com 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The R/G/B sums computed in AWB simple IPA may be zero or perhaps even negative. Let's make sure the sums are always positive, to prevent division by zero or completely nonsense results. Signed-off-by: Milan Zamazal Reviewed-by: Barnabás Pőcze Reviewed-by: Hans de Goede --- src/ipa/simple/algorithms/awb.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp index cf567e894..b1eb7d310 100644 --- a/src/ipa/simple/algorithms/awb.cpp +++ b/src/ipa/simple/algorithms/awb.cpp @@ -7,6 +7,7 @@ #include "awb.h" +#include #include #include @@ -69,9 +70,10 @@ void Awb::process(IPAContext &context, const uint64_t nPixels = std::accumulate( histogram.begin(), histogram.end(), 0); const uint64_t offset = blackLevel * nPixels; - const uint64_t sumR = stats->sumR_ - offset / 4; - const uint64_t sumG = stats->sumG_ - offset / 2; - const uint64_t sumB = stats->sumB_ - offset / 4; + const uint64_t minValid = 1; + const uint64_t sumR = stats->sumR_ > offset / 4 ? stats->sumR_ - offset / 4 : minValid; + const uint64_t sumG = stats->sumG_ > offset / 2 ? stats->sumG_ - offset / 2 : minValid; + const uint64_t sumB = stats->sumB_ > offset / 4 ? stats->sumB_ - offset / 4 : minValid; /* * Calculate red and blue gains for AWB. From patchwork Mon Sep 29 20:19:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24493 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 28CC6C324C for ; Mon, 29 Sep 2025 20:19:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B2EA76B63D; Mon, 29 Sep 2025 22:19:56 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="a/+d4K4N"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9E4A36B629 for ; Mon, 29 Sep 2025 22:19:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177191; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XWvUR07kciLuBnqkJFghSeoKkucr5rx9vJXZTwvkPTk=; b=a/+d4K4NhwanwbOVnQtuknAWxXXd5JUqX7OR2beyeYh5ZSTSiee35FAsQLcWANSLgq9i1E v3HFX+A6FKyCaIKRjrKI8+LORtdJ4svUzQmwqL8dvKXA7fZs5cmA7wHn21rUG1+ChG6QxU oxSKAcu2PmUK/IMW5UCC11fQJMezRDI= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-202-op0zCXSnO9KlGGoZR81dGg-1; Mon, 29 Sep 2025 16:19:48 -0400 X-MC-Unique: op0zCXSnO9KlGGoZR81dGg-1 X-Mimecast-MFC-AGG-ID: op0zCXSnO9KlGGoZR81dGg_1759177187 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 020AC1800378; Mon, 29 Sep 2025 20:19:47 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id E46F419560B4; Mon, 29 Sep 2025 20:19:44 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org Subject: [PATCH v5 5/7] ipa: simple: awb: Use correct type in std::accumulate Date: Mon, 29 Sep 2025 22:19:22 +0200 Message-ID: <20250929201924.45019-6-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: dQtgiFBmib2tQZ-ecBx8IIFoqoD-azQGWVmAPtkJKNk_1759177187 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The result type of the std::accumulate() call is uint64_t; let's use the same type for the initial value (rather than the default int) to prevent summing up the values in a different integer type. Signed-off-by: Milan Zamazal Reviewed-by: Hans de Goede Reviewed-by: Barnabás Pőcze --- src/ipa/simple/algorithms/awb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp index b1eb7d310..fb21396ef 100644 --- a/src/ipa/simple/algorithms/awb.cpp +++ b/src/ipa/simple/algorithms/awb.cpp @@ -68,7 +68,7 @@ void Awb::process(IPAContext &context, * rather than from the sensor range. */ const uint64_t nPixels = std::accumulate( - histogram.begin(), histogram.end(), 0); + histogram.begin(), histogram.end(), uint64_t(0)); const uint64_t offset = blackLevel * nPixels; const uint64_t minValid = 1; const uint64_t sumR = stats->sumR_ > offset / 4 ? stats->sumR_ - offset / 4 : minValid; From patchwork Mon Sep 29 20:19:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24494 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 136F5C324C for ; Mon, 29 Sep 2025 20:20:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B3DE86B647; Mon, 29 Sep 2025 22:20:00 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="i1PBlNMy"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9A7606B635 for ; Mon, 29 Sep 2025 22:19:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177194; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0vG1RzvtkN9GpHKzUJAvHhmys4xFr8duDDYgf71W3L0=; b=i1PBlNMys+YMaGTh92Fg6POlcTCR9NmmuCpqKMyvHXKDxK7x7MVZEorT63PrhRW4jIc3fl zTxYrU7uCd2i4oJQeYg+oDXOA9mOIwEa9YhYQbyhwgy9F9RQESBc+9LqRxsuGxVKxKUnr4 YOh4/yQHaLxWdL7UpkjtozyWpDQqKaI= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-219-_VUXu6PpM8egfLeVclntiw-1; Mon, 29 Sep 2025 16:19:51 -0400 X-MC-Unique: _VUXu6PpM8egfLeVclntiw-1 X-Mimecast-MFC-AGG-ID: _VUXu6PpM8egfLeVclntiw_1759177190 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D57B4180057C; Mon, 29 Sep 2025 20:19:49 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A5D3D19560B4; Mon, 29 Sep 2025 20:19:47 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org, =?utf-8?b?QmFybmFiw6Fz?= =?utf-8?q?_P=C5=91cze?= Subject: [PATCH v5 6/7] ipa: simple: blc: Prevent division by zero in BLC Date: Mon, 29 Sep 2025 22:19:23 +0200 Message-ID: <20250929201924.45019-7-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: EBzUym3FbOe007ni7msPrKgN6xFu6-8DwhcVaQn0Hs0_1759177190 X-Mimecast-Originator: redhat.com 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" When there are no values in the histogram, BLC simple IPA can crash on division by zero. We cannot get anything meaningful in such a case anyway, let's simply return from `process()' then. Tested-by: Barnabás Pőcze Reviewed-by: Barnabás Pőcze Reviewed-by: Maciej S. Szmigiero Reviewed-by: Hans de Goede Signed-off-by: Milan Zamazal --- src/ipa/simple/algorithms/blc.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp index 8c1e9ed08..ea5356443 100644 --- a/src/ipa/simple/algorithms/blc.cpp +++ b/src/ipa/simple/algorithms/blc.cpp @@ -77,6 +77,11 @@ void BlackLevel::process(IPAContext &context, constexpr float ignoredPercentage = 0.02; const unsigned int total = std::accumulate(begin(histogram), end(histogram), 0); + if (total == 0) { + LOG(IPASoftBL, Debug) << "Not guessing black level, histogram is empty"; + return; + } + const unsigned int pixelThreshold = ignoredPercentage * total; const unsigned int histogramRatio = 256 / SwIspStats::kYHistogramSize; const unsigned int currentBlackIdx = From patchwork Mon Sep 29 20:19:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24495 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 CC6C4C3310 for ; Mon, 29 Sep 2025 20:20:03 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 590AB6B64D; Mon, 29 Sep 2025 22:20:03 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="CX1u28um"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 13EAC6B635 for ; Mon, 29 Sep 2025 22:19:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759177198; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7GCryMsl+ajnaVE7aS9jBR1GNxGzNJGPxB5HObD4bZU=; b=CX1u28umM6phZvIm8Iy6UJYKEwsK4qh1bOIXk4SL1Ct20ZHYxLoxCkhWJHmy7B03Fi1eU4 braDOJiORTsrY1lu0wnLu5rqAHzleJ5/M559JdDftbo1RxC8PLIbb2wfAoaHn8M+JYo6GD BWdWbq9HeqNbWGembx+ylnd0V4QnZ3A= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-677-R-oZv3UIMTWgFcl-TZ2PHg-1; Mon, 29 Sep 2025 16:19:53 -0400 X-MC-Unique: R-oZv3UIMTWgFcl-TZ2PHg-1 X-Mimecast-MFC-AGG-ID: R-oZv3UIMTWgFcl-TZ2PHg_1759177192 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id CE351195609F; Mon, 29 Sep 2025 20:19:52 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.35]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5840619560B4; Mon, 29 Sep 2025 20:19:50 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , pobrn@protonmail.com, mail@maciej.szmigiero.name, hansg@kernel.org, =?utf-8?b?QmFybmFiw6Fz?= =?utf-8?q?_P=C5=91cze?= Subject: [PATCH v5 7/7] ipa: simple: agc: Prevent division by zero in AGC Date: Mon, 29 Sep 2025 22:19:24 +0200 Message-ID: <20250929201924.45019-8-mzamazal@redhat.com> In-Reply-To: <20250929201924.45019-1-mzamazal@redhat.com> References: <20250929201924.45019-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: LHzvv3WzwAjGpzfm32sVCksRrsSwDR2ULa1APEGtT8s_1759177192 X-Mimecast-Originator: redhat.com 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" If the histogram size is non-zero but lower than the number of bins, yHistValsPerBin is zero and then the AGC processing crashes on division by it. Let's check yHistValsPerBin for being zero and stop AGC processing in such a case. The condition also covers the cases where histogramSize or yHistValsPerBinMod are zero. Tested-by: Barnabás Pőcze Reviewed-by: Hans de Goede Signed-off-by: Milan Zamazal Reviewed-by: Kieran Bingham --- src/ipa/simple/algorithms/agc.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp index c46bb0ebe..e47949ec4 100644 --- a/src/ipa/simple/algorithms/agc.cpp +++ b/src/ipa/simple/algorithms/agc.cpp @@ -124,6 +124,12 @@ void Agc::process(IPAContext &context, unsigned int denom = 0; unsigned int num = 0; + if (yHistValsPerBin == 0) { + LOG(IPASoftExposure, Debug) + << "Not adjusting exposure due to insufficient histogram data"; + return; + } + for (unsigned int i = 0; i < histogramSize; i++) { unsigned int idx = (i - (i / yHistValsPerBinMod)) / yHistValsPerBin; exposureBins[idx] += histogram[blackLevelHistIdx + i];