From 17ee3b608989ace6b2435655f745d624019be842 Mon Sep 17 00:00:00 2001 From: David Plowman Date: Thu, 23 Oct 2025 12:49:14 +0100 Subject: [PATCH] ipa: rpi: lux: Handle camera mode sensitivity correctly 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 Signed-off-by: Kieran Bingham --- 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 */