From patchwork Thu Jul 24 15:29:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 23948 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 9B5A6C3237 for ; Thu, 24 Jul 2025 15:29:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4728F6911B; Thu, 24 Jul 2025 17:29:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="W4RR+Khb"; 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 9D33F69111 for ; Thu, 24 Jul 2025 17:29:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1753370989; 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=GE3y2yYFnJuaa26K/nYhD5BmAa9VJfwt1rxoAuG+Ncs=; b=W4RR+KhbYqJznqtrZ/mhJ8gB4BB0iYKWaEj1Gj/kjVGn6xsfLESEZHtMzD726B6cSkjESy 6ocmNudqOixfzmFDWFacSbYe3Qj716LPJiO3aAGu7Q8BQNSDH3cU7RAhHAWgGrJ9rm7VEi uDWwBBYtXm+v3y4L5E7oFly0ev+t6RI= 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-61-JaNl7-4HOTC8n0sBdV1g6Q-1; Thu, 24 Jul 2025 11:29:47 -0400 X-MC-Unique: JaNl7-4HOTC8n0sBdV1g6Q-1 X-Mimecast-MFC-AGG-ID: JaNl7-4HOTC8n0sBdV1g6Q_1753370986 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (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 6C234195FD06; Thu, 24 Jul 2025 15:29:46 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.255]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D649F300018D; Thu, 24 Jul 2025 15:29:44 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Kieran Bingham Subject: [PATCH v2 1/2] libcamera: geometry: Add Rectangle::croppedBy Date: Thu, 24 Jul 2025 17:29:35 +0200 Message-ID: <20250724152936.99830-2-mzamazal@redhat.com> In-Reply-To: <20250724152936.99830-1-mzamazal@redhat.com> References: <20250724152936.99830-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: uQ8MaXrYsMmA94Xmi2UWsIbltx7k-QACLuHT3heocB8_1753370986 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" Let's add a new Rectangle method that returns the coordinates of the central area of the original rectangle cropped by given numerator/denominator fraction. This is useful to specify a limited area of the image to operate on, for example computing statistics only from a reduced area for speedup. Signed-off-by: Milan Zamazal --- include/libcamera/geometry.h | 2 ++ src/libcamera/geometry.cpp | 19 +++++++++++++++++++ test/geometry.cpp | 9 +++++++++ 3 files changed, 30 insertions(+) diff --git a/include/libcamera/geometry.h b/include/libcamera/geometry.h index f322e3d5b..603c9a117 100644 --- a/include/libcamera/geometry.h +++ b/include/libcamera/geometry.h @@ -297,6 +297,8 @@ public: [[nodiscard]] Rectangle scaledBy(const Size &numerator, const Size &denominator) const; [[nodiscard]] Rectangle translatedBy(const Point &point) const; + [[nodiscard]] Rectangle croppedBy(const unsigned int numerator, + const unsigned int denominator) const; Rectangle transformedBetween(const Rectangle &source, const Rectangle &target) const; diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp index 81cc8cd53..8ceb75698 100644 --- a/src/libcamera/geometry.cpp +++ b/src/libcamera/geometry.cpp @@ -837,6 +837,25 @@ Rectangle Rectangle::translatedBy(const Point &point) const return { x + point.x, y + point.y, width, height }; } +/** + * \brief Return a central area crop of the rectangle + * \param[in] numerator The numerator of the crop factor + * \param[in] denominator The denominator of the crop factor + * + * The rectangle of the central part of the original rectangle is computed, of + * numerator/denominator times the original width and height. + * + * \return The cropped Rectangle coordinates + */ +Rectangle Rectangle::croppedBy(const unsigned int numerator, + const unsigned int denominator) const +{ + unsigned int w = static_cast(width) * numerator / denominator; + unsigned int h = static_cast(height) * numerator / denominator; + + return Size(w, h).centeredTo(center()); +} + /** * \brief Transform a Rectangle from one reference rectangle to another * \param[in] source The \a source reference rectangle diff --git a/test/geometry.cpp b/test/geometry.cpp index 11df043b7..9864774f4 100644 --- a/test/geometry.cpp +++ b/test/geometry.cpp @@ -466,6 +466,15 @@ protected: return TestFail; } + /* Rectangle::croppedBy() tests */ + if (Rectangle(Size(300, 100)).croppedBy(2, 3) != + Rectangle(50, 17, 200, 66) || + Rectangle(-100, 100, 300, 700).croppedBy(3, 7) != + Rectangle(-14, 300, 128, 300)) { + cout << "Rectangle::croppedBy() test failed " << endl; + return TestFail; + } + /* Rectangle::translateBy() tests */ r = Rectangle(10, -20, 300, 400); r.translateBy(Point(-30, 40)); From patchwork Thu Jul 24 15:29:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 23949 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 8E214C3237 for ; Thu, 24 Jul 2025 15:29:56 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 65B0A69113; Thu, 24 Jul 2025 17:29:55 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="fo0i/x9Q"; 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 875B169111 for ; Thu, 24 Jul 2025 17:29:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1753370991; 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=VF4ZjUc9WvxVQjlS9PwGC60ALuXZobxXkTsY36KUEj0=; b=fo0i/x9QGEaqT+byh0prn+lg3v6CyZKb5XYVo2SzCIZ8V9CfQ8xp2P9WrM7AbX5N1zUqTK nIeUlaZQb3qGZY7c326ZrdhYzzg0WYcSxt+fwv/jCteuqzPpBg+EWXm0sfh0mPEMozzIQI K/6J4NMLPCjUe1hcp0S9674+S4lFQ28= 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-252-MGS2zZsiMLGeoMjt5HQYYA-1; Thu, 24 Jul 2025 11:29:49 -0400 X-MC-Unique: MGS2zZsiMLGeoMjt5HQYYA-1 X-Mimecast-MFC-AGG-ID: MGS2zZsiMLGeoMjt5HQYYA_1753370988 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (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 55E72180035F; Thu, 24 Jul 2025 15:29:48 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.255]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id F2EC5300018D; Thu, 24 Jul 2025 15:29:46 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Kieran Bingham Subject: [PATCH v2 2/2] libcamera: software_isp: Reduce statistics image area Date: Thu, 24 Jul 2025 17:29:36 +0200 Message-ID: <20250724152936.99830-3-mzamazal@redhat.com> In-Reply-To: <20250724152936.99830-1-mzamazal@redhat.com> References: <20250724152936.99830-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: jyDYvjlu0mmxzwar1LfeAmHQU07GeaTZH2madzG_vpE_1753370988 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 statistics in software ISP is computed basically over the whole image area, although only on part of the pixels. It is not necessary to cover the whole image area, it's sufficient to compute the statistics let's say over the central area of 2/3 of the image width and height, which should be both sufficient and faster. The speedup is not that important with the CPU implementation but it may save CPU work more noticeably with GPU debayering implementation. Signed-off-by: Milan Zamazal --- src/libcamera/software_isp/debayer_cpu.cpp | 2 +- src/libcamera/software_isp/debayer_egl.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp index e56492848..bea153592 100644 --- a/src/libcamera/software_isp/debayer_cpu.cpp +++ b/src/libcamera/software_isp/debayer_cpu.cpp @@ -526,7 +526,7 @@ 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 */ + /* Don't pass x,y from window_ since process() already adjusts for it. */ stats_->setWindow(Rectangle(window_.size())); /* pad with patternSize.Width on both left and right side */ diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp index 9ec966608..9ad7d6fe7 100644 --- a/src/libcamera/software_isp/debayer_egl.cpp +++ b/src/libcamera/software_isp/debayer_egl.cpp @@ -393,8 +393,11 @@ int DebayerEGL::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 */ - stats_->setWindow(Rectangle(window_.size())); + /* + * Don't pass x,y from window_ since process() already adjusts for it. + * But crop the window to 2/3 of its width and height for speedup. + */ + stats_->setWindow(Rectangle(window_.size()).croppedBy(2, 3)); LOG(Debayer, Debug) << "Input width " << inputCfg.size.width << " height " << inputCfg.size.height; LOG(Debayer, Debug) << "Output width " << outputCfg.size.width << " height " << outputCfg.size.height;