From patchwork Fri Feb 3 09:17:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 18240 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 075BFBEFBE for ; Fri, 3 Feb 2023 09:17:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F4158625EE; Fri, 3 Feb 2023 10:17:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1675415862; bh=gnjOLxwHnFSU2iGTu7KO1N3RlVXKuSggoauFfbGNjrI=; 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=TveAgHmL/hZO7OFwSR3Xam2d8PJSz47M5wWQB4VeILCc30vKlRJWDgHAvJdX6ZrZ7 og3Dht7HeGAQGzF2pI+hdqiUDR8X4dxZZMo/xa/4h7fiD2FGM5U5GuYWlFdLBAJ/11 h+5a9NHnwUyur4A/YU6/W36itBEGKzZL9dwy8c0ZwmS40IJ383rZ9YDiP2XW+yI/Hu 9PRY1jGpdcVH+MN6VglAFk3F9DndouxaU+7Yy2Y2FnzC0wvuKrMLRlyVGDiiMl3L2c KGLqbLAdG51sbxfSDsbvtPq/XsXR9gxvi+TB1PQDzoZ8w2XDgCyao2eShLN/z18sDX VEJPyK5JvCVfw== Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7728761EF4 for ; Fri, 3 Feb 2023 10:17:40 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="XAjSdPzx"; dkim-atps=neutral Received: by mail-wm1-x32a.google.com with SMTP id m5-20020a05600c4f4500b003db03b2559eso3327931wmq.5 for ; Fri, 03 Feb 2023 01:17:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cFKCg+ZE+nhe2cGJPAWdDIMNRxjiykJzy0Pv0P4gmyY=; b=XAjSdPzxrRaAYn5n9SnykQbJk04dkhF9ux0jIhrfo/sLHL60V2vbzR47WzYJCNyEYr lM96hZ1DKePJ6MhjI1eYty4VmxtrF7EvtVHHKgScvKfhA02iswi+OapC8zGp/1052Jbh zKvXX/z5p/U4eEwxyqrZEXy8Ea5fAHa7gX9MvPJDTgiMjnU+QKAKqaahX5CpwJbI/Kl9 0qc8Har2pBiSJvyDQY4LEZWgauJ6yTnkbtD8tYhMVWfJ1AAxBgRhxeudl9QXhLvAiiDj MW+BPqVhoX3bpxNGhGL6t8m1xrmDSGtr39cIDwxVyk6I/eKv3e9qtGKddV9xtTrFC0FW rDaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cFKCg+ZE+nhe2cGJPAWdDIMNRxjiykJzy0Pv0P4gmyY=; b=ae9T6bLiFdJBb4fxkbMJqT/URW0KAZ3ilC/ysPkt0fFllR6HCrp246uSySOMQpfZim mvdbY8wzQ4nvKyOXLwjZpmma6xEtZ3I9HYyJbSP4fK1P/Iv/m+aHWB2z6Z/CS4aYPu+1 Z/oOyvC6NgILlZ+ipnJGBVIxuPRcqYoW5LVFYEKx9H1wgt5IQ7rAyr03uzBbI46j+AOI e/ifgzXFQ5RAxod48ip/L58EziQID+tivo65LhGXqhroCuPnlpa4fwqnIb4ODZ3EPATH yN41A5lPDEfq5lxY9ptfe1VDM5onVOb8bghHByAum7KbBVLv7qmUNiFJsxB7qCtMPQyt Dp9w== X-Gm-Message-State: AO0yUKXnRI9Wv1gcl1zrAcNtsr7k7jqEQPljDE72jJ8GQvfy+ObVZoJf UiKi23IVGpsm/f+pWbVUR18jIFMLrbK+w9WGvjnMnA== X-Google-Smtp-Source: AK7set/H/+V1VTQR06YTnEHPb5NVNR6CNF6XJkebH+pLS01w/XHD9mhkLm7cc1n2HmutrziY3HoJzQ== X-Received: by 2002:a1c:4c08:0:b0:3de:b1ec:7f95 with SMTP id z8-20020a1c4c08000000b003deb1ec7f95mr8978810wmf.18.1675415859843; Fri, 03 Feb 2023 01:17:39 -0800 (PST) Received: from localhost.localdomain ([93.93.133.154]) by smtp.gmail.com with ESMTPSA id az24-20020a05600c601800b003dc4baaedd3sm7468864wmb.37.2023.02.03.01.17.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Feb 2023 01:17:39 -0800 (PST) To: libcamera-devel@lists.libcamera.org Date: Fri, 3 Feb 2023 09:17:30 +0000 Message-Id: <20230203091734.22803-2-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230203091734.22803-1-naush@raspberrypi.com> References: <20230203091734.22803-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 1/5] ipa: raspberrypi: Generalise statistics 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: Naushir Patuck via libcamera-devel From: Naushir Patuck Reply-To: Naushir Patuck Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" At present, the controller algorithms access the bcm2835_isp_stats structure, which is hardware specific. It would be desirable to abstract out the statistics structure to remove hardware specific headers from the algorithms source files. Define a new templated RegionStats class that encompasses region based statistics generated by the ISP. For the VC4 ISP, this can be used to hold RGB sums and focus FoM values. Define a new Statistics structure that holds all the VC4 ISP statistics output. This includes AGC histograms, AGC/AWB region sums and focus FoM regions. Signed-off-by: Naushir Patuck Reviewed-by: David Plowman Reviewed-by: Kieran Bingham --- src/ipa/raspberrypi/controller/region_stats.h | 123 ++++++++++++++++++ src/ipa/raspberrypi/statistics.h | 76 +++++++++++ 2 files changed, 199 insertions(+) create mode 100644 src/ipa/raspberrypi/controller/region_stats.h create mode 100644 src/ipa/raspberrypi/statistics.h diff --git a/src/ipa/raspberrypi/controller/region_stats.h b/src/ipa/raspberrypi/controller/region_stats.h new file mode 100644 index 000000000000..9aaf3a58a6f7 --- /dev/null +++ b/src/ipa/raspberrypi/controller/region_stats.h @@ -0,0 +1,123 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2022, Raspberry Pi Ltd + * + * region_stats.h - Raspberry Pi region based statistics container + */ +#pragma once + +#include +#include +#include + +#include + +namespace RPiController { + +template +class RegionStats +{ +public: + struct Region { + T val; + uint32_t counted; + uint32_t uncounted; + }; + + RegionStats() + : size_({}), numFloating_(0), default_({}) + { + } + + void init(const libcamera::Size &size, unsigned int numFloating = 0) + { + size_ = size; + numFloating_ = numFloating; + regions_.clear(); + regions_.resize(size_.width * size_.height + numFloating_); + } + + void init(unsigned int num) + { + size_ = libcamera::Size(num, 1); + numFloating_ = 0; + regions_.clear(); + regions_.resize(num); + } + + unsigned int numRegions() const + { + return size_.width * size_.height; + } + + unsigned int numFloatingRegions() const + { + return numFloating_; + } + + libcamera::Size size() const + { + return size_; + } + + void set(unsigned int index, const Region ®ion) + { + if (index >= numRegions()) + return; + set_(index, region); + } + + void set(const libcamera::Point &pos, const Region ®ion) + { + set(pos.y * size_.width + pos.x, region); + } + + void setFloating(unsigned int index, const Region ®ion) + { + if (index >= numFloatingRegions()) + return; + set(numRegions() + index, region); + } + + const Region &get(unsigned int index) const + { + if (index >= numRegions()) + return default_; + return get_(index); + } + + const T &get(const libcamera::Point &pos) const + { + return get(pos.y * size_.width + pos.x); + } + + const T &getFloating(unsigned int index) const + { + if (index >= numFloatingRegions()) + return default_; + return get_(numRegions() + index); + } + + typename std::vector::iterator begin() { return regions_.begin(); } + typename std::vector::iterator end() { return regions_.end(); } + typename std::vector::const_iterator begin() const { return regions_.begin(); } + typename std::vector::const_iterator end() const { return regions_.end(); } + +private: + void set_(unsigned int index, const Region ®ion) + { + regions_[index] = region; + } + + const Region &get_(unsigned int index) const + { + return regions_[index]; + } + + libcamera::Size size_; + unsigned int numFloating_; + std::vector regions_; + Region default_; +}; + +} /* namespace RPiController */ diff --git a/src/ipa/raspberrypi/statistics.h b/src/ipa/raspberrypi/statistics.h new file mode 100644 index 000000000000..ad486534b216 --- /dev/null +++ b/src/ipa/raspberrypi/statistics.h @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2022, Raspberry Pi Ltd + * + * statistics.h - Raspberry Pi generic statistics structure + */ +#pragma once + +#include +#include +#include + +#include "histogram.h" +#include "region_stats.h" + +namespace RPiController { + +struct RgbySums { + RgbySums(uint64_t _rSum = 0, uint64_t _gSum = 0, uint64_t _bSum = 0, uint64_t _ySum = 0) + : rSum(_rSum), gSum(_gSum), bSum(_bSum), ySum(_ySum) + { + } + uint64_t rSum; + uint64_t gSum; + uint64_t bSum; + uint64_t ySum; +}; + +using RgbyRegions = RegionStats; +using FocusRegions = RegionStats; + +struct Statistics { + /* + * All region based statistics are normalised to 16-bits, giving a + * maximum value of (1 << NormalisationFactorPow2) - 1. + */ + static constexpr unsigned int NormalisationFactorPow2 = 16; + + /* + * Positioning of the AGC statistics gathering in the pipeline: + * Pre-WB correction or post-WB correction. + * Assume this is post-LSC. + */ + enum class AgcStatsPos { PreWb, PostWb }; + const AgcStatsPos agcStatsPos; + + /* + * Positioning of the AWB/ALSC statistics gathering in the pipeline: + * Pre-LSC or post-LSC. + */ + enum class ColourStatsPos { PreLsc, PostLsc }; + const ColourStatsPos colourStatsPos; + + Statistics(AgcStatsPos a, ColourStatsPos c) + : agcStatsPos(a), colourStatsPos(c) + { + } + + /* Histogram statistics. Not all histograms may be populated! */ + Histogram rHist; + Histogram gHist; + Histogram bHist; + Histogram yHist; + + /* Row sums for flicker avoidance. */ + std::vector rowSums; + + /* Region based colour sums. */ + RgbyRegions agcRegions; + RgbyRegions awbRegions; + + /* Region based focus FoM. */ + FocusRegions focusRegions; +}; + +} /* namespace RPiController */