From patchwork Wed Oct 21 07:59:45 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 28541 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 851D0C324C for ; Wed, 21 Oct 2026 08:00:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E010A68F38; Wed, 21 Oct 2026 10:00:23 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="jFFBFAyW"; 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 C1C4D68F2C for ; Wed, 21 Oct 2026 10:00:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1792569615; 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=1+EO1z2ZdGvuOu5qiMOAacEXBuwGww69M1w/V9JAwOk=; b=jFFBFAyWBZRLjNXHhMIJgK4hnQuoAnUn+bwv7sV4/QxZF1tpBu8uiO+lJgx8IOI8AoNMsO kF9ff04b4zxjO5RxTnA0P3C2EvClbAAwXa2QFRripTGWrzCoqZwrlpTxJLcHJpadEZhreE m7ikP9PgwPpG5wCtEYC1KD/mqJIxltU= Received: from mx-prod-mc-03.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-385-CnXcP1QAMTu6z2gTlqZZgw-1; Wed, 21 Oct 2026 08:00:14 +0000 X-MC-Unique: CnXcP1QAMTu6z2gTlqZZgw-1 X-Mimecast-MFC-AGG-ID: CnXcP1QAMTu6z2gTlqZZgw_1792569613 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 27CEF195606F for ; Wed, 21 Oct 2026 08:00:13 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.43.17.75]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5C1C8180029C; Wed, 21 Oct 2026 08:00:12 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal Subject: [RFC PATCH 5/7] ipa: softisp: Add Af algorithm Date: Wed, 21 Oct 2026 09:59:45 +0200 Message-ID: <20261021080000.16624-6-mzamazal@redhat.com> In-Reply-To: <20261021080000.16624-1-mzamazal@redhat.com> References: <20261021080000.16624-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: OeiEyaB3TIIp-DucgrukIjaAKOUlVWKlRQxKZo7A1DM_1792569613 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 Af algorithm, which is mostly a proxy to the libipa Af. The only special feature is setting afEnabled flag to prevent attempting lens movements when the algorithm is not enabled. The algorithm is not enabled yet because there are no autofocus stats computed. Signed-off-by: Milan Zamazal --- src/ipa/softisp/algorithms/af.cpp | 53 ++++++++++++++++++++++++++ src/ipa/softisp/algorithms/af.h | 39 +++++++++++++++++++ src/ipa/softisp/algorithms/meson.build | 1 + src/ipa/softisp/data/uncalibrated.yaml | 1 + src/ipa/softisp/ipa_context.h | 3 ++ 5 files changed, 97 insertions(+) create mode 100644 src/ipa/softisp/algorithms/af.cpp create mode 100644 src/ipa/softisp/algorithms/af.h diff --git a/src/ipa/softisp/algorithms/af.cpp b/src/ipa/softisp/algorithms/af.cpp new file mode 100644 index 000000000..557cca004 --- /dev/null +++ b/src/ipa/softisp/algorithms/af.cpp @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2026 Red Hat Inc. + * + * Autofocus + */ + +#include "af.h" + +#include + +#include + +#include "libcamera/internal/software_isp/swisp_stats.h" + +namespace libcamera { + +namespace ipa::softisp::algorithms { + +LOG_DEFINE_CATEGORY(IPASoftIspAf) + +int Af::init(IPAContext &context, [[maybe_unused]] const ValueNode &tuningData) +{ + /* Informs that lens controls can get focus data */ + context.afEnabled = true; + + return 0; +} + +int Af::configure(IPAContext &context, + [[maybe_unused]] const IPAConfigInfo &configInfo) +{ + afAlgo_.configure(context.activeState.af); + + return 0; +} + +void Af::process(IPAContext &context, + [[maybe_unused]] const uint32_t frame, + [[maybe_unused]] IPAFrameContext &frameContext, + const SwIspStats *stats, + [[maybe_unused]] ControlList &metadata) +{ + const double variance = stats->variance; + LOG(IPASoftIspAf, Debug) << "Focus stats: " << variance; + afAlgo_.process(context.activeState.af, variance); +} + +REGISTER_IPA_ALGORITHM(Af, "Af") + +} /* namespace ipa::softisp::algorithms */ + +} /* namespace libcamera */ diff --git a/src/ipa/softisp/algorithms/af.h b/src/ipa/softisp/algorithms/af.h new file mode 100644 index 000000000..881cb4475 --- /dev/null +++ b/src/ipa/softisp/algorithms/af.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2026 Red Hat Inc. + * + * Autofocus + */ + +#pragma once + +#include "libipa/af.h" + +#include "algorithm.h" +#include "ipa_context.h" + +namespace libcamera { + +namespace ipa::softisp::algorithms { + +class Af : public Algorithm +{ +public: + Af() = default; + ~Af() = default; + + int init(IPAContext &context, const ValueNode &tuningData) override; + int configure(IPAContext &context, + const IPAConfigInfo &configInfo) override; + void process(IPAContext &context, const uint32_t frame, + IPAFrameContext &frameContext, + const SwIspStats *stats, + ControlList &metadata) override; + +private: + AfAlgorithm afAlgo_; +}; + +} /* namespace ipa::softisp::algorithms */ + +} /* namespace libcamera */ diff --git a/src/ipa/softisp/algorithms/meson.build b/src/ipa/softisp/algorithms/meson.build index d240409e5..a386401db 100644 --- a/src/ipa/softisp/algorithms/meson.build +++ b/src/ipa/softisp/algorithms/meson.build @@ -2,6 +2,7 @@ softisp_ipa_algorithms = files([ 'adjust.cpp', + 'af.cpp', 'awb.cpp', 'agc.cpp', 'blc.cpp', diff --git a/src/ipa/softisp/data/uncalibrated.yaml b/src/ipa/softisp/data/uncalibrated.yaml index fc90ca526..53d3792a2 100644 --- a/src/ipa/softisp/data/uncalibrated.yaml +++ b/src/ipa/softisp/data/uncalibrated.yaml @@ -4,6 +4,7 @@ version: 1 algorithms: - BlackLevel: + # - Af: - Awb: # Color correction matrices can be defined here. The CCM algorithm # has a significant performance impact, and should only be enabled diff --git a/src/ipa/softisp/ipa_context.h b/src/ipa/softisp/ipa_context.h index 05643296e..8546dedd8 100644 --- a/src/ipa/softisp/ipa_context.h +++ b/src/ipa/softisp/ipa_context.h @@ -20,6 +20,7 @@ #include #include #include +#include "libipa/af.h" #include "core_ipa_interface.h" @@ -38,6 +39,7 @@ struct IPAActiveState { ipa::awb::ActiveState awb; ipa::ccm::ActiveState ccm; ipa::agc::ActiveState agc; + ipa::af::ActiveState af; struct { uint8_t level; @@ -84,6 +86,7 @@ struct IPAContext { FCQueue frameContexts; ControlInfoMap::Map ctrlMap; bool ccmEnabled = false; + bool afEnabled = false; }; } /* namespace ipa::softisp */