From patchwork Thu Nov 24 10:38:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 17862 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 410D7BDE6B for ; Thu, 24 Nov 2022 10:38:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A36526330A; Thu, 24 Nov 2022 11:38:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1669286323; bh=NOrgDIPDWhC3tzOO598pHppsdGT5KpshNbARfH0Eg20=; 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=rAHp4QBB3Ac1GjloCxaP0gGzwzTpzr9tzWQ3BKuELbMhKBy8OVBnKoLakrPWDuZwZ ex/jS8UYO2mwBVkLKwiXpazAPG+82jr8AoEYdILgvq4GHxK4jDTfL2Va5be+Hr/E+9 L4BmxKH0WBKR1H1R2t46+QbSjXuqXy1G0GHrlShtuMix5Hk7Ep4Qa2da5B3Qd+QEKY g2eh6Ik8l9IK+bZtvi+TRNlIUUhkENYzXCgo8LNEaSnrt+Atop4+Gv37nHGIAeDmP4 eJ0gHH0Kraidx767MYQwwIxhqvhRSUTJHyKu9F8pyOTaFL8SVENPwGHRIklZYJhv1x f+pX8jUKHOo8Q== Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C860B6330A for ; Thu, 24 Nov 2022 11:38:40 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="VuD4r0v6"; dkim-atps=neutral Received: by mail-wr1-x42d.google.com with SMTP id g12so1821488wrs.10 for ; Thu, 24 Nov 2022 02:38: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=TgY1XqtE04Zqn2QHeFSJfKHeETJOVH8v2DU+dZ7yV4Y=; b=VuD4r0v6GFdSe3zV6tXNyYqOlkICbE5bTdvT4GWPml4+6b3k0I0f7NcU9U84dbxRhq BBiAQ15Gnjf74VT0e0cIu7+dnTAG/Xgyc0ajjOBMrYeGPd3fgzthzQsao3DT1kxyw/Ch RTmlpi+EeWOZr/x1WPWzV1y5hTyq0OvIcADRhWIqr06PAxWG07HQJCcLS3Qd0QwEy6Jp ICNhzgP71bi3xPBfgX0I5pKOwd66Me5mpjfsQIMKnSfFxK9OYb5glVBb8jEPa1zUGbpm a3M4Fn5ZkNPBL4EoR39etm3Gxkqum1nb4gavEmR0wkte0/SsfcqRpE3ahni4VXft/08M wVPw== 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=TgY1XqtE04Zqn2QHeFSJfKHeETJOVH8v2DU+dZ7yV4Y=; b=VNI7PMlwVCyRS2BdBqYX9DXqyVCqEbdfrpXgdbOaotV+JueNW+5kzgOxZVqUnT2xsJ 5TwDzsMo1Hnhrs41+rSn/pqS++HgJzPYBiCWydWxjKGDnnua3/7mGk6cGVpxi2aEIwLX ZHEg+OTYLfHTppxdJR53pZ12Dw+llU8wfjHn9LEo20FP+WyWOrT9yk+7SDlD/+K9rdw4 UDDMcbyvuSZG4/9YGCoId2+jbJyS3fX3a7C70eFQ4KKzckys5hAZMgxiQxIoZKfLGYz+ l1+rbWFVanHYNQ2I82zi1GphqxwKNU/QoakDYRMcqk/xKlihQRuWizCF40ET9ATy1qnt wIjg== X-Gm-Message-State: ANoB5pnPmTx7y2OuUT59idMKo0Uvl4KmUou4NNDSBuwxOkqiMB6Xg+AU 0L0xspe/H8Si9XIY6SA1R+Z7xUvGi9yarQ== X-Google-Smtp-Source: AA0mqf5O/xuMfFm6nnqCh7Uiq5K/+4fYQ6xg7vrZD2g/nCZ2zzp0tFCInBd9MdAYwD1NEY7ne9LHyw== X-Received: by 2002:a5d:6244:0:b0:236:73b2:f026 with SMTP id m4-20020a5d6244000000b0023673b2f026mr19914801wrv.396.1669286320172; Thu, 24 Nov 2022 02:38:40 -0800 (PST) Received: from naush-laptop.localdomain ([93.93.133.154]) by smtp.gmail.com with ESMTPSA id s16-20020adff810000000b002368a6deaf8sm995103wrp.57.2022.11.24.02.38.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Nov 2022 02:38:39 -0800 (PST) To: libcamera-devel@lists.libcamera.org Date: Thu, 24 Nov 2022 10:38:28 +0000 Message-Id: <20221124103832.6172-2-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221124103832.6172-1-naush@raspberrypi.com> References: <20221124103832.6172-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 hostograms, AGC/AWB region sums and focus FoM regions. Signed-off-by: Naushir Patuck Reviewed-by: David Plowman --- src/ipa/raspberrypi/controller/region_stats.h | 123 ++++++++++++++++++ src/ipa/raspberrypi/statistics.h | 70 ++++++++++ 2 files changed, 193 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..a762bf3d41aa --- /dev/null +++ b/src/ipa/raspberrypi/statistics.h @@ -0,0 +1,70 @@ +/* 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 { + /* + * 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 */