From patchwork Tue Mar 14 14:48:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Semkowicz X-Patchwork-Id: 18395 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 99468C3263 for ; Tue, 14 Mar 2023 14:50:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1FF1D62722; Tue, 14 Mar 2023 15:50:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1678805402; bh=A2RCsHkfkpU7qUA8+y5Em7gqpmln87ljqcVoTTsnXK4=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=pDK/9K+q45pwhcmEO+tbxV+WDKklIcAAZ+2/RREc7bXgEzcZxLy8iyyJvEZ5wApiy n1ZXsQ+KJhkLunJaXWS8qz7gO3SLNJ8MyxJyMX/BNlBRxPjKl/qzq9jBrnIA9D5ZkB puME/t2xans3/CgVW/1ANGPrUy3F2erxOTFk2nluEhB0e5Kr47coFURyPQGPHdUo16 uirWbQZq8Nh8+E92LvMda6pMSHGiqxsr/mTi5NY7szTEKKNSeZqGniw7lfTaxC08Cd 4+xG/ctz3g9YLWIPvE+Pr+OatB+MsBJ8dfLwHtmVYGICZhZ+wqWdifW4SwBT33A8z3 64ffePNl41A8g== Received: from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com [IPv6:2a00:1450:4864:20::22c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E1A016270F for ; Tue, 14 Mar 2023 15:49:53 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=thaumatec-com.20210112.gappssmtp.com header.i=@thaumatec-com.20210112.gappssmtp.com header.b="12ILASIj"; dkim-atps=neutral Received: by mail-lj1-x22c.google.com with SMTP id b10so16321036ljr.0 for ; Tue, 14 Mar 2023 07:49:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=thaumatec-com.20210112.gappssmtp.com; s=20210112; t=1678805393; 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=I8Rq7qVe+BzRDOtVw2SyeCLk2jE0HIkmVbPuakObb0Q=; b=12ILASIj3zvIXYDJD0gdFF96NL3qNW+NNFVV+pt4Eaf8+xEmVxgcAbZzis056E6G1I /y75Ewi2WJpJneA/K25vj2dU5WLtggo2OHGYTckv3FXt33S8nVT+9mdT8d3qHQiCtk1R J1uqZpoBNHeszegSzf5YTOF+2tDB74K4zQse6SZB1TCxqiTVGtfEGP6bmiV/KuvcBoLa Qi6veLtju3Mcs4uIJ1Zer49TpniPCNhnnFEBH9MOL9B3s7qnwW/Ses3O0BgLe2xP0AIS EB3YrqP64WMpNpgLsYCt7tedmOf303pqmxe4nq5/mY/VAe11lrlFJ8LIRa0f95OIZd/Y 5kXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678805393; 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=I8Rq7qVe+BzRDOtVw2SyeCLk2jE0HIkmVbPuakObb0Q=; b=tgyCGFUOhuWBjcvpbAKPWX2+FEmEgaKtEXkr0dYbp54wwyxLA8DS881mJUwR/Dg2tH NpBhbyq5vx7hxgyJPViBx2oFkCdT+z37OuSnLkriiZ4Yz9TOIaBisORg7LT/5/fkTcAU jexu4LcV3kE3OZlWv8C0IzAZ0ALaBJPTlPB+jM7VTVGENIDD5jz7D+2RGy6RZOtZMTlA uHor2dLnd4ife6HLB23nJJ5+u6XttnE0PG3COi59t6Bf3rauw/6TQy2ik/MTNilzlpe8 5/Se5g+lcJqVlC9USUhCKTl9XvLkr685hFpv+xy4EdIl4iJ46uZfx/D18OY9djC6621I yWKQ== X-Gm-Message-State: AO0yUKUOz30Xpt4hkpQpStZ/F0xEVogKWx1tn1olrGIoeqNtm+fl0bun E6v96GX2XW4Kqn7NDK54lrFaOjHL9HUEfGvZm74= X-Google-Smtp-Source: AK7set+IuIfHpGhEAIaioBmEl5beCamarzFE5RiwE8MbVrafJUbK2Q2S7lOEh6BpniIzOQwMAt8x4Q== X-Received: by 2002:a2e:b8cb:0:b0:298:592e:113a with SMTP id s11-20020a2eb8cb000000b00298592e113amr12004257ljp.6.1678805393573; Tue, 14 Mar 2023 07:49:53 -0700 (PDT) Received: from localhost.localdomain ([91.90.166.178]) by smtp.gmail.com with ESMTPSA id q25-20020a2eb4b9000000b00295a35f30e1sm470961ljm.115.2023.03.14.07.49.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Mar 2023 07:49:53 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Tue, 14 Mar 2023 15:48:29 +0100 Message-Id: <20230314144834.85193-6-dse@thaumatec.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230314144834.85193-1-dse@thaumatec.com> References: <20230314144834.85193-1-dse@thaumatec.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 05/10] ipa: af_hill_climbing: Add "Windows" metering mode 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: Daniel Semkowicz via libcamera-devel From: Daniel Semkowicz Reply-To: Daniel Semkowicz Cc: jacopo.mondi@ideasonboard.com Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for setting user defined auto focus window in the AfHillClimbing. This enables usage of AfMetering and AfWindows controls. Each time, there is a need for changing the window configuration in the ISP, the signal is emitted. Platform layer that wants to use the "Windows" metering mode, needs to connect to this signal and configure the ISP on each emission. Currently only one window is supported. Signed-off-by: Daniel Semkowicz --- .../libipa/algorithms/af_hill_climbing.cpp | 52 +++++++++++++++++-- src/ipa/libipa/algorithms/af_hill_climbing.h | 12 ++++- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.cpp b/src/ipa/libipa/algorithms/af_hill_climbing.cpp index 2b99afef..3421f240 100644 --- a/src/ipa/libipa/algorithms/af_hill_climbing.cpp +++ b/src/ipa/libipa/algorithms/af_hill_climbing.cpp @@ -83,15 +83,28 @@ int AfHillClimbing::init(const YamlObject &tuningData) * \brief Configure the AfHillClimbing with sensor and lens information * \param[in] minFocusPosition Minimum position supported by camera lens * \param[in] maxFocusPosition Maximum position supported by camera lens + * \param[in] outputSize Camera sensor output size * * This method should be called in the libcamera::ipa::Algorithm::configure() * method of the platform layer. */ void AfHillClimbing::configure(int32_t minFocusPosition, - int32_t maxFocusPosition) + int32_t maxFocusPosition, + const Size &outputSize) { minLensPosition_ = minFocusPosition; maxLensPosition_ = maxFocusPosition; + + /* + * Default AF window of 3/4 size of the camera sensor output, + * placed at the center + */ + defaultWindow_ = Rectangle(outputSize.width / 8, + outputSize.height / 8, + 3 * outputSize.width / 4, + 3 * outputSize.height / 4); + + windowUpdateRequested.emit(defaultWindow_); } /** @@ -165,6 +178,14 @@ void AfHillClimbing::setFramesToSkip(uint32_t n) framesToSkip_ = n; } +/** + * \var AfHillClimbing::windowUpdateRequested + * \brief Signal emitted when change in AF window was requested + * + * Platform layer supporting AF windows should connect to this signal + * and configure the ISP with new window on each emition. + */ + void AfHillClimbing::setMode(controls::AfModeEnum mode) { if (mode == mode_) @@ -190,14 +211,35 @@ void AfHillClimbing::setSpeed([[maybe_unused]] controls::AfSpeedEnum speed) LOG(Af, Error) << __FUNCTION__ << " not implemented!"; } -void AfHillClimbing::setMeteringMode([[maybe_unused]] controls::AfMeteringEnum metering) +void AfHillClimbing::setMeteringMode(controls::AfMeteringEnum metering) { - LOG(Af, Error) << __FUNCTION__ << " not implemented!"; + if (metering == meteringMode_) + return; + + if (metering == controls::AfMeteringWindows) { + windowUpdateRequested.emit(userWindow_); + } else { + windowUpdateRequested.emit(defaultWindow_); + } + + meteringMode_ = metering; } -void AfHillClimbing::setWindows([[maybe_unused]] Span windows) +void AfHillClimbing::setWindows(Span windows) { - LOG(Af, Error) << __FUNCTION__ << " not implemented!"; + if (windows.size() != 1) { + LOG(Af, Error) << "Only one AF window is supported"; + return; + } + + /* \todo Check if window size is valid for ISP */ + + LOG(Af, Debug) << "setWindows: " << windows[0]; + + userWindow_ = windows[0]; + + if (meteringMode_ == controls::AfMeteringWindows) + windowUpdateRequested.emit(userWindow_); } void AfHillClimbing::setTrigger(controls::AfTriggerEnum trigger) diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.h b/src/ipa/libipa/algorithms/af_hill_climbing.h index b361e5a1..4f507010 100644 --- a/src/ipa/libipa/algorithms/af_hill_climbing.h +++ b/src/ipa/libipa/algorithms/af_hill_climbing.h @@ -10,6 +10,7 @@ #pragma once #include +#include #include "af.h" @@ -25,13 +26,16 @@ class AfHillClimbing : public Af { public: int init(const YamlObject &tuningData); - void configure(int32_t minFocusPosition, int32_t maxFocusPosition); + void configure(int32_t minFocusPosition, int32_t maxFocusPosition, + const Size &outputSize); int32_t process(double currentContrast); void setFramesToSkip(uint32_t n); controls::AfStateEnum state() final { return state_; } controls::AfPauseStateEnum pauseState() final { return pauseState_; } + Signal windowUpdateRequested; + private: void setMode(controls::AfModeEnum mode) final; void setRange(controls::AfRangeEnum range) final; @@ -54,6 +58,7 @@ private: controls::AfModeEnum mode_ = controls::AfModeManual; controls::AfStateEnum state_ = controls::AfStateIdle; controls::AfPauseStateEnum pauseState_ = controls::AfPauseStateRunning; + controls::AfMeteringEnum meteringMode_ = controls::AfMeteringAuto; /* VCM step configuration. It is the current setting of the VCM step. */ int32_t lensPosition_ = 0; @@ -87,6 +92,11 @@ private: /* Max ratio of variance change, 0.0 < maxChange_ < 1.0 */ double maxChange_; + + /* Default AF window */ + Rectangle defaultWindow_; + /* AF window set by user using AF_WINDOWS control */ + Rectangle userWindow_; }; } /* namespace ipa::common::algorithms */