From patchwork Wed May 8 10:35:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 20018 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 77876C3226 for ; Wed, 8 May 2024 10:36:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 700FA62C9F; Wed, 8 May 2024 12:36:01 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="VvQBQtn1"; dkim-atps=neutral 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 E7D6761A73 for ; Wed, 8 May 2024 12:35:58 +0200 (CEST) Received: from neptunite.hamster-moth.ts.net (h175-177-049-156.catv02.itscom.jp [175.177.49.156]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B79D0B0B; Wed, 8 May 2024 12:35:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1715164555; bh=/61b3jqyQUMa8JE9mpDHJnO4gi1lBL/x6la2PxplWXo=; h=From:To:Cc:Subject:Date:From; b=VvQBQtn1c8jvdCt9uVSXfTUmY3q2zOFFTdB0/CYW4MHchYRx2+wBRBfiUWYLCtbjj K5ppZVTxiFNg9ULPNXOf2QOPOAUfh63GGO3jF7TSBvS6l7cwGIl9QlNIlkKdm3d3GX br5xQ3ssXgYFITc6d1ZwWUTEuvblx7E7QRY9XuH4= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder Subject: [PATCH v3] ipa: libipa: histogram: Add transform parameter to constructor Date: Wed, 8 May 2024 19:35:46 +0900 Message-Id: <20240508103546.693219-1-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 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" Add a parameter to the histogram constructor that takes a transformation function to apply to all the bins upon construction. This is necessary notably for the rkisp1, as the values reported from the hardware are 20 bits where the upper 16-bits are meaningful integer values and the lower 4 bits are fractional and meant to be discarded. As adding a right-shift parameter is probably too specialized, a generic function is added as a parameter instead. Signed-off-by: Paul Elder --- Changes in v3: - make the transform function a template parameter, and optimize the constructor This used to be "ipa: libipa: histogram: Add rshift parameter to constructor" Changes in v2: - change rshift parameter to a function parameter --- src/ipa/libipa/histogram.cpp | 8 +------- src/ipa/libipa/histogram.h | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ipa/libipa/histogram.cpp b/src/ipa/libipa/histogram.cpp index c1aac59b..628e3755 100644 --- a/src/ipa/libipa/histogram.cpp +++ b/src/ipa/libipa/histogram.cpp @@ -40,14 +40,8 @@ namespace ipa { /** * \brief Create a cumulative histogram * \param[in] data A pre-sorted histogram to be passed + * \param[in] transform The transformation function to apply to every bin */ -Histogram::Histogram(Span data) -{ - cumulative_.reserve(data.size()); - cumulative_.push_back(0); - for (const uint32_t &value : data) - cumulative_.push_back(cumulative_.back() + value); -} /** * \fn Histogram::bins() diff --git a/src/ipa/libipa/histogram.h b/src/ipa/libipa/histogram.h index 54bb2a19..26326125 100644 --- a/src/ipa/libipa/histogram.h +++ b/src/ipa/libipa/histogram.h @@ -10,10 +10,10 @@ #include #include #include - #include #include +#include namespace libcamera { @@ -23,7 +23,17 @@ class Histogram { public: Histogram() { cumulative_.push_back(0); } - Histogram(Span data); + + template + Histogram(Span data, + Transform transform = [](uint32_t x) { return x; }) + { + cumulative_.resize(data.size() + 1); + cumulative_[0] = 0; + for (const auto &[i, value] : utils::enumerate(data)) + cumulative_[i + 1] = cumulative_[i] + transform(value); + } + size_t bins() const { return cumulative_.size() - 1; } uint64_t total() const { return cumulative_[cumulative_.size() - 1]; } uint64_t cumulativeFrequency(double bin) const;