From patchwork Mon Mar 27 12:20: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: 18479 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 33779C32A0 for ; Mon, 27 Mar 2023 12:20:56 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B75046278B; Mon, 27 Mar 2023 14:20:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1679919655; bh=I+GJeNia0yCq893YG/WPqw5ionNfPpft/qbqOyAt4ew=; 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=g7vz9Ak86zExOVDQbpC9xJFM9ba3Vpwqk89u3d5ihbxNio3CeXleFmy0o7G6wswR2 h71XuRfRspZJPow0sCtyO9sC1lQJqCeBt5MCpaEmCmNZFkY/5oqcW7oLNhFLNuYNP2 zZ+2AwdVpgrPI34iDFp7xsNnRIGqSpVDyd7keuwNk46UaxHkfYrYNV4opa4XWMy3ib vkRZhMAgVoW+Cw5hM9OtSAgpwkxN0IUPF0mcHTemq7ICf5u59GaTGsHBNjEWgaVLKV x+xybbT869BJ20+OnYAx+89A5S1ju5bYw50o9Jnl+Xb3FEuVDxEbnC9Ff9Q3WmmIT6 Y5O9V+p0ltQbA== Received: from mail-io1-xd30.google.com (mail-io1-xd30.google.com [IPv6:2607:f8b0:4864:20::d30]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5B78A6276A for ; Mon, 27 Mar 2023 14:20:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="P75iVobl"; dkim-atps=neutral Received: by mail-io1-xd30.google.com with SMTP id d14so3784998ion.9 for ; Mon, 27 Mar 2023 05:20:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1679919652; 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=gCzt2lkm41Vsp+5UNwKr7yvk6OMuYLjlo17eIpDSEa8=; b=P75iVoblhdiGehWMQ9j4cIUDqhkr/Kosn+7YFxV1vC6putKODLIHMEXjPE6zWw5564 gYA0IfrBlYlgTOtSqEYET3FJF6tnIBNde5VRLWKE1qJ7eY0ISz8+EADvce8YouQfIYli Ek0ntQjoD4rMz/heCzniZmm/bHMyrKCtJKTRSgJiPFQ05MkcBY1yv+DnshZoMzmiR3ML c+3MPjiGUuyfJi0l/lmKTJ899XMS/2PxBLlBZne3Z7wi9pSgxEgAmhcMXWUThj1w6k9K kJMeFxNvI21om8Y/Y2Egm+h7ov7n6UrC8piGfoY8+Yv3L02hhKRFfh/iIeykdbZisk9m uI6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679919652; 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=gCzt2lkm41Vsp+5UNwKr7yvk6OMuYLjlo17eIpDSEa8=; b=LTV5RaDA3aH/p1acsAuYH2ValbWpM46NmbC6S62zUIDjN+Xd09L/qMcGELS/ZTl4l8 Aw2d78OJTzpQYCcjDwDSRGFe8I5huFi8LE640APvtIynzmURwZVMn9CczFIezBjlP4He RbDQQxfPijmbTrkixXVtjYlcaf93C7cm2gE3KwydEgRQqPlBrKc1HFVTiKnCPC78XBNt eidTcOsz+8uGQOc5FuO1WAEhmgIXd4cF7N7vMrB6ETU0aMHG3F7xy6W+q18dX8MJImcv jcQIfmxfEBKZHS242YYMPG+mfJqsUoamwpSQeFUOQElBGvzjvSwmXnEXoxNDU4gUicxw aSSQ== X-Gm-Message-State: AO0yUKVFjbpnaZm6HmbSK1R3kLy8ovGZlxFcD+se+6sHiFxWgt+Ttyof TltqnFrX4JVpLw3ZywCbFYBlmTliwQ6M4HaN0VJHLQ== X-Google-Smtp-Source: AK7set/scNFAwKnbx7lLY9se+Sy9BXdj238sT+f02zzNL/sMn5Lw1z5F0cJmRuFPLRb/rMLg5qGfeg== X-Received: by 2002:a5d:9d8d:0:b0:753:2226:952f with SMTP id ay13-20020a5d9d8d000000b007532226952fmr13274248iob.0.1679919651660; Mon, 27 Mar 2023 05:20:51 -0700 (PDT) Received: from localhost.localdomain ([93.93.133.154]) by smtp.gmail.com with ESMTPSA id r7-20020a5edb47000000b00758ff97aaedsm3239026iop.16.2023.03.27.05.20.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Mar 2023 05:20:51 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Mon, 27 Mar 2023 13:20:30 +0100 Message-Id: <20230327122030.11756-11-naush@raspberrypi.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230327122030.11756-1-naush@raspberrypi.com> References: <20230327122030.11756-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 10/10] ipa: raspberrypi: Remove the focus reporting algorithm 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" Update the IPA focus reporting code to use the generalised statistics Region structure. Remove the focus reporting algorithm as the functionality is duplicated this bit of IPA code. Remove focus_status.h as it is no longer needed. Signed-off-by: Naushir Patuck --- src/ipa/raspberrypi/controller/focus_status.h | 20 -------- src/ipa/raspberrypi/controller/rpi/af.h | 1 - src/ipa/raspberrypi/controller/rpi/focus.cpp | 49 ------------------- src/ipa/raspberrypi/data/imx290.json | 3 -- src/ipa/raspberrypi/data/imx296.json | 3 -- src/ipa/raspberrypi/data/imx296_mono.json | 3 -- src/ipa/raspberrypi/data/imx477.json | 3 -- src/ipa/raspberrypi/data/imx477_noir.json | 3 -- .../raspberrypi/data/imx477_scientific.json | 3 -- src/ipa/raspberrypi/data/imx477_v1.json | 3 -- src/ipa/raspberrypi/data/imx708.json | 3 -- src/ipa/raspberrypi/data/imx708_noir.json | 3 -- src/ipa/raspberrypi/data/imx708_wide.json | 3 -- .../raspberrypi/data/imx708_wide_noir.json | 3 -- src/ipa/raspberrypi/meson.build | 1 - src/ipa/raspberrypi/raspberrypi.cpp | 16 ++++-- 16 files changed, 11 insertions(+), 109 deletions(-) delete mode 100644 src/ipa/raspberrypi/controller/focus_status.h delete mode 100644 src/ipa/raspberrypi/controller/rpi/focus.cpp diff --git a/src/ipa/raspberrypi/controller/focus_status.h b/src/ipa/raspberrypi/controller/focus_status.h deleted file mode 100644 index 8b74e59840c1..000000000000 --- a/src/ipa/raspberrypi/controller/focus_status.h +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (C) 2020, Raspberry Pi Ltd - * - * focus_status.h - focus measurement status - */ -#pragma once - -#include - -/* - * The focus algorithm should post the following structure into the image's - * "focus.status" metadata. Recall that it's only reporting focus (contrast) - * measurements, it's not driving any kind of auto-focus algorithm! - */ - -struct FocusStatus { - unsigned int num; - uint32_t focusMeasures[FOCUS_REGIONS]; -}; diff --git a/src/ipa/raspberrypi/controller/rpi/af.h b/src/ipa/raspberrypi/controller/rpi/af.h index b479feb88c39..6d2bae671a22 100644 --- a/src/ipa/raspberrypi/controller/rpi/af.h +++ b/src/ipa/raspberrypi/controller/rpi/af.h @@ -28,7 +28,6 @@ * "nuisance" scans. During each interval where PDAF is not working, only * ONE scan will be performed; CAF cannot track objects using CDAF alone. * - * This algorithm is unrelated to "rpi.focus" which merely reports CDAF FoM. */ namespace RPiController { diff --git a/src/ipa/raspberrypi/controller/rpi/focus.cpp b/src/ipa/raspberrypi/controller/rpi/focus.cpp deleted file mode 100644 index ea3cc00e42c3..000000000000 --- a/src/ipa/raspberrypi/controller/rpi/focus.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (C) 2020, Raspberry Pi Ltd - * - * focus.cpp - focus algorithm - */ -#include - -#include - -#include "../focus_status.h" -#include "focus.h" - -using namespace RPiController; -using namespace libcamera; - -LOG_DEFINE_CATEGORY(RPiFocus) - -#define NAME "rpi.focus" - -Focus::Focus(Controller *controller) - : Algorithm(controller) -{ -} - -char const *Focus::name() const -{ - return NAME; -} - -void Focus::process(StatisticsPtr &stats, Metadata *imageMetadata) -{ - FocusStatus status; - for (unsigned int i = 0; i < stats->focusRegions.numRegions(); i++) - status.focusMeasures[i] = stats->focusRegions.get(i).val; - status.num = stats->focusRegions.numRegions(); - imageMetadata->set("focus.status", status); - - LOG(RPiFocus, Debug) - << "Focus contrast measure: " - << (status.focusMeasures[5] + status.focusMeasures[6]) / 10; -} - -/* Register algorithm with the system. */ -static Algorithm *create(Controller *controller) -{ - return new Focus(controller); -} -static RegisterAlgorithm reg(NAME, &create); diff --git a/src/ipa/raspberrypi/data/imx290.json b/src/ipa/raspberrypi/data/imx290.json index bfb9c6093d26..ace68d0ebf1c 100644 --- a/src/ipa/raspberrypi/data/imx290.json +++ b/src/ipa/raspberrypi/data/imx290.json @@ -195,9 +195,6 @@ } ] } - }, - { - "rpi.focus": { } } ] } \ No newline at end of file diff --git a/src/ipa/raspberrypi/data/imx296.json b/src/ipa/raspberrypi/data/imx296.json index 346f5b658957..ae8722c46a85 100644 --- a/src/ipa/raspberrypi/data/imx296.json +++ b/src/ipa/raspberrypi/data/imx296.json @@ -532,9 +532,6 @@ "strength": 1.0, "limit": 0.18 } - }, - { - "rpi.focus": { } } ] } diff --git a/src/ipa/raspberrypi/data/imx296_mono.json b/src/ipa/raspberrypi/data/imx296_mono.json index e9fa30c6a08d..30965b4b8d61 100644 --- a/src/ipa/raspberrypi/data/imx296_mono.json +++ b/src/ipa/raspberrypi/data/imx296_mono.json @@ -228,9 +228,6 @@ "strength": 1.0, "limit": 0.18 } - }, - { - "rpi.focus": { } } ] } diff --git a/src/ipa/raspberrypi/data/imx477.json b/src/ipa/raspberrypi/data/imx477.json index bfc0774ffdfc..daffc268ff43 100644 --- a/src/ipa/raspberrypi/data/imx477.json +++ b/src/ipa/raspberrypi/data/imx477.json @@ -513,9 +513,6 @@ }, { "rpi.sharpen": { } - }, - { - "rpi.focus": { } } ] } \ No newline at end of file diff --git a/src/ipa/raspberrypi/data/imx477_noir.json b/src/ipa/raspberrypi/data/imx477_noir.json index dadd97bc3d78..52d7f072d0ce 100644 --- a/src/ipa/raspberrypi/data/imx477_noir.json +++ b/src/ipa/raspberrypi/data/imx477_noir.json @@ -424,9 +424,6 @@ }, { "rpi.sharpen": { } - }, - { - "rpi.focus": { } } ] } \ No newline at end of file diff --git a/src/ipa/raspberrypi/data/imx477_scientific.json b/src/ipa/raspberrypi/data/imx477_scientific.json index 17c4ed0a5e74..26c692fdbab9 100644 --- a/src/ipa/raspberrypi/data/imx477_scientific.json +++ b/src/ipa/raspberrypi/data/imx477_scientific.json @@ -474,9 +474,6 @@ }, { "rpi.sharpen": { } - }, - { - "rpi.focus": { } } ] } \ No newline at end of file diff --git a/src/ipa/raspberrypi/data/imx477_v1.json b/src/ipa/raspberrypi/data/imx477_v1.json index 5bcaac67069b..d64020091efa 100644 --- a/src/ipa/raspberrypi/data/imx477_v1.json +++ b/src/ipa/raspberrypi/data/imx477_v1.json @@ -511,9 +511,6 @@ }, { "rpi.sharpen": { } - }, - { - "rpi.focus": { } } ] } \ No newline at end of file diff --git a/src/ipa/raspberrypi/data/imx708.json b/src/ipa/raspberrypi/data/imx708.json index c38b2d4cf256..b9830a3bf692 100644 --- a/src/ipa/raspberrypi/data/imx708.json +++ b/src/ipa/raspberrypi/data/imx708.json @@ -512,9 +512,6 @@ { "rpi.sharpen": { } }, - { - "rpi.focus": { } - }, { "rpi.af": { diff --git a/src/ipa/raspberrypi/data/imx708_noir.json b/src/ipa/raspberrypi/data/imx708_noir.json index 082274e34c53..075f70355cec 100644 --- a/src/ipa/raspberrypi/data/imx708_noir.json +++ b/src/ipa/raspberrypi/data/imx708_noir.json @@ -512,9 +512,6 @@ { "rpi.sharpen": { } }, - { - "rpi.focus": { } - }, { "rpi.af": { diff --git a/src/ipa/raspberrypi/data/imx708_wide.json b/src/ipa/raspberrypi/data/imx708_wide.json index cdc61436995d..b772efee3b96 100644 --- a/src/ipa/raspberrypi/data/imx708_wide.json +++ b/src/ipa/raspberrypi/data/imx708_wide.json @@ -403,9 +403,6 @@ { "rpi.sharpen": { } }, - { - "rpi.focus": { } - }, { "rpi.af": { diff --git a/src/ipa/raspberrypi/data/imx708_wide_noir.json b/src/ipa/raspberrypi/data/imx708_wide_noir.json index 8a7f59910833..c5f6b53dca7a 100644 --- a/src/ipa/raspberrypi/data/imx708_wide_noir.json +++ b/src/ipa/raspberrypi/data/imx708_wide_noir.json @@ -403,9 +403,6 @@ { "rpi.sharpen": { } }, - { - "rpi.focus": { } - }, { "rpi.af": { diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build index 9230e17bca22..de78cbd80f9c 100644 --- a/src/ipa/raspberrypi/meson.build +++ b/src/ipa/raspberrypi/meson.build @@ -33,7 +33,6 @@ rpi_ipa_sources = files([ 'controller/rpi/awb.cpp', 'controller/rpi/sharpen.cpp', 'controller/rpi/black_level.cpp', - 'controller/rpi/focus.cpp', 'controller/rpi/geq.cpp', 'controller/rpi/noise.cpp', 'controller/rpi/lux.cpp', diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index d813b1b7ca61..c7b9b7007ce9 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -50,7 +50,6 @@ #include "denoise_algorithm.h" #include "denoise_status.h" #include "dpc_status.h" -#include "focus_status.h" #include "geq_status.h" #include "lux_status.h" #include "metadata.h" @@ -640,14 +639,18 @@ void IPARPi::reportMetadata(unsigned int ipaContext) static_cast(blackLevelStatus->blackLevelG), static_cast(blackLevelStatus->blackLevelB) }); - FocusStatus *focusStatus = rpiMetadata.getLocked("focus.status"); - if (focusStatus && focusStatus->num == 12) { + RPiController::FocusRegions *focusStatus = + rpiMetadata.getLocked("focus.status"); + if (focusStatus) { + libcamera::Size size = focusStatus->size(); /* * We get a 4x3 grid of regions by default. Calculate the average * FoM over the central two positions to give an overall scene FoM. * This can change later if it is not deemed suitable. */ - int32_t focusFoM = (focusStatus->focusMeasures[5] + focusStatus->focusMeasures[6]) / 2; + ASSERT(size == Size(4, 3)); + int32_t focusFoM = (focusStatus->get({ 1, 1 }).val + + focusStatus->get({ 2, 1 }).val) / 2; libcameraMetadata_.set(controls::FocusFoM, focusFoM); } @@ -1426,7 +1429,6 @@ RPiController::StatisticsPtr IPARPi::fillStatistics(bcm2835_isp_stats *stats) co statistics->focusRegions.set(i, { stats->focus_stats[i].contrast_val[1][1] / 1000, stats->focus_stats[i].contrast_val_num[1][1], stats->focus_stats[i].contrast_val_num[1][0] }); - return statistics; } @@ -1443,6 +1445,10 @@ void IPARPi::processStats(unsigned int bufferId, unsigned int ipaContext) Span mem = it->second.planes()[0]; bcm2835_isp_stats *stats = reinterpret_cast(mem.data()); RPiController::StatisticsPtr statistics = fillStatistics(stats); + + /* Save the focus stats in the metadata structure to report out later. */ + rpiMetadata_[ipaContext].set("focus.status", statistics->focusRegions); + helper_->process(statistics, rpiMetadata); controller_.process(statistics, &rpiMetadata);