From patchwork Fri Oct 17 10:05:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 24699 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 35746C3259 for ; Fri, 17 Oct 2025 10:27:15 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F277A606CF; Fri, 17 Oct 2025 12:27:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="A1WenaEw"; dkim-atps=neutral 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 B3B08606BC for ; Fri, 17 Oct 2025 12:27:10 +0200 (CEST) Received: by mail-wm1-x32a.google.com with SMTP id 5b1f17b1804b1-471076f819bso14051735e9.3 for ; Fri, 17 Oct 2025 03:27:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1760696830; x=1761301630; darn=lists.libcamera.org; 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=pKNNxUkSF8/sGRxUgmWP5MlL22UtXQN5k0cv1bzA+DA=; b=A1WenaEw2ctVXVA5ZOwHnTRT/f2ecTiCMFr9/FHhZ0WHptTPPoVosR+5VovVQi6gm2 jSVyH8PyS9qM8KZHHh6x/T83Bf8QtTyuhti2F2wQwW7c/DPNm2szijrSLL50wxWIG1bQ eL0tDJoHoFFKs/nZKLmAarnIipU/rKwP5G9R+kvYgmlJv4zBTB79/esafkGPUnkHPAPV z0TNv85gF2NVIbzkw61Pf16dI+Hf0IGB+pwhOCp2M6MZ9fEieLZBiVJLatbnA1zZ7qJB Eyh6ZI/W+k9SAODsOwCC5lfamsE9fVc//RjfIi4yuHtS4FJa0jddwgz5OkvN39UpjIHv VFog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760696830; x=1761301630; 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=pKNNxUkSF8/sGRxUgmWP5MlL22UtXQN5k0cv1bzA+DA=; b=kWPCVW6qv5Gkw4+R96RgznCnMHkmm2JoPEf7vlCtaYzg0UNm+mZ4xS96CwTrm4SVUg 1yUayPr4hZwSHvkzmYZzbz57dBxYeQ4yiMiYZMQ94UiqWmAgDGJtiGHvy/Sh2GgNftzc FRhKV1RE3mP22g7sflifDQHz6hj2eEmDfX2s6oxdMCtElWp9CvGw84Np8HlkRTexUqO7 G2OhO+IFjr1YFJG9z4CVvWBYTGzTnVPZTlChMZpj1IL2dXcc1kn1ZPA2aFKrTZhLBqXD Ss5t9GCoccfuOQd4BkwCRn5zS8jvnxd9ZWqJuxArb7B9Qu+JA2Lz6oTf/xZ4klWtmf9a OITA== X-Gm-Message-State: AOJu0YyrZnR1vl50e4NpjREl/kse0iJcm99oOvRclhar6oLDoDjyaGx/ Gib5/tIYD06b+n5Ii/VAJK5BzyLffTIqnXMiaTKLuGm1k9Wvwm5se9f9p3Urj0WJyWZ2mNMUT3y IskrgQH0= X-Gm-Gg: ASbGncsffl6/0ceDv9Q4cEiN2Km3Eipm7wl9tRXuHIefWhRVow1S27LCGMl4QhpG2Jo 5NMhV8MXMClwshGvwbAWDkC4qGY0V6yXokGN9cgrxjnh7+IkYAlrKBMcFi6NBzzKjLhUPynk44V kqkyKK82ahVj+bFTT4FZ0C9Iigg9tWdmcr/x88SsM/2ydER191SHqmd0YGcLvDQd4OMdNzllnHv wioOnD2o/K3NtbYC9cAQk09Sf233u8BkfadT0SrgRAkm5SNn2z27cLQk8TOsKTeVnS3WTmaonB0 GUG1YmgBQUbJZZ7eow2D7dL1fKDo5G0gkf/2044JGh1cvmg5j4ZXATcW/mvIurHvVEMmF9a7ztp 4owA8+kj+7QsTDNJk3WUAsRFPPdH7bH4LVxyb7k4caFkt+p/wvDMVJjCJkRTSW2ay2w76AZrnt/ pVBEfZiSGHqXlh//kthOcc8vmxKhokLFbminKPfY6QB07CID/m/cWd5ynLOH9tnJtJmtrdFu+2b rKoSNhDMm8TtEYG8ofx6CakWA== X-Google-Smtp-Source: AGHT+IFfYc1mqR4NiLC709TaAhNKT3kJ+Otw0BEw+UfcqttmE2hwaeNBPquditJDc7txpmengn/Yzw== X-Received: by 2002:a05:600c:444d:b0:46e:1f86:aeba with SMTP id 5b1f17b1804b1-471178ad982mr20822585e9.17.1760696829626; Fri, 17 Oct 2025 03:27:09 -0700 (PDT) Received: from localhost.localdomain ([2a06:61c0:f337:0:8aba:2a85:b765:a23e]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47114428dedsm73811905e9.7.2025.10.17.03.27.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Oct 2025 03:27:08 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Cc: David Plowman Subject: [PATCH 2/5] ipa: rpi: lux: Handle camera mode sensitivity correctly Date: Fri, 17 Oct 2025 11:05:38 +0100 Message-ID: <20251017102704.3887-3-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251017102704.3887-1-david.plowman@raspberrypi.com> References: <20251017102704.3887-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 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" The camera mode sensitivity needs to be taken into account for the lux calculation. For example, the IMX708 binned mode (with a sensitivity of 2.0) would otherwise show double the correct lux value. Signed-off-by: David Plowman Reviewed-by: Stefan Klug Reviewed-by: Naushir Patuck --- src/ipa/rpi/controller/rpi/lux.cpp | 13 +++++++++++-- src/ipa/rpi/controller/rpi/lux.h | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/ipa/rpi/controller/rpi/lux.cpp b/src/ipa/rpi/controller/rpi/lux.cpp index 27b89a8f..acaa6e57 100644 --- a/src/ipa/rpi/controller/rpi/lux.cpp +++ b/src/ipa/rpi/controller/rpi/lux.cpp @@ -20,7 +20,7 @@ LOG_DEFINE_CATEGORY(RPiLux) #define NAME "rpi.lux" Lux::Lux(Controller *controller) - : Algorithm(controller) + : Algorithm(controller), sensitivity_(1.0) { /* * Put in some defaults as there will be no meaningful values until @@ -68,6 +68,13 @@ void Lux::setCurrentAperture(double aperture) currentAperture_ = aperture; } +void Lux::switchMode(CameraMode const &cameraMode, [[maybe_unused]] Metadata *metadata) +{ + /* We will need to compensate for the camera sensitivity. */ + ASSERT(cameraMode.sensitivity); + sensitivity_ = cameraMode.sensitivity; +} + void Lux::prepare(Metadata *imageMetadata) { std::unique_lock lock(mutex_); @@ -88,10 +95,12 @@ void Lux::process(StatisticsPtr &stats, Metadata *imageMetadata) double yRatio = currentY * (65536 / stats->yHist.bins()) / referenceY_; double estimatedLux = exposureTimeRatio * gainRatio * apertureRatio * apertureRatio * - yRatio * referenceLux_; + yRatio * referenceLux_ / sensitivity_; + LuxStatus status; status.lux = estimatedLux; status.aperture = currentAperture; + LOG(RPiLux, Debug) << ": estimated lux " << estimatedLux; { std::unique_lock lock(mutex_); diff --git a/src/ipa/rpi/controller/rpi/lux.h b/src/ipa/rpi/controller/rpi/lux.h index da007fe9..db2227e4 100644 --- a/src/ipa/rpi/controller/rpi/lux.h +++ b/src/ipa/rpi/controller/rpi/lux.h @@ -10,6 +10,7 @@ #include +#include "../camera_mode.h" #include "../lux_status.h" #include "../algorithm.h" @@ -23,6 +24,7 @@ public: Lux(Controller *controller); char const *name() const override; int read(const libcamera::YamlObject ¶ms) override; + void switchMode(CameraMode const &cameraMode, Metadata *metadata) override; void prepare(Metadata *imageMetadata) override; void process(StatisticsPtr &stats, Metadata *imageMetadata) override; void setCurrentAperture(double aperture); @@ -40,6 +42,7 @@ private: double currentAperture_; LuxStatus status_; std::mutex mutex_; + double sensitivity_; }; } /* namespace RPiController */