From patchwork Thu Oct 22 15:48:30 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 28558 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 B84B6C3261 for ; Thu, 22 Oct 2026 15:48:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 792C068F73; Thu, 22 Oct 2026 17:48:55 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="V0aiQE+f"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9FD9968F6E for ; Thu, 22 Oct 2026 17:48:54 +0200 (CEST) Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c30:59f6:be2b:2877:6bc4:392]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 003538FD; Thu, 22 Oct 2026 17:46:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1792684006; bh=fNDDxSa/bu6Lzy3kfw7UyTCVSYdc1MBVf8HNjVGfl2U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=V0aiQE+fvFVaEEAihI2YUoyNM7oMAt45eRcO4wIpVBkyM7UtWsSRxJu7puNy0gqQ1 ZIClPwCIt4/LZaBp632OKiuubl3VPjokKkrv8tXm+rzlj0F2YVw+H1xgued34bHnZv Dvio8aiM5bq6PZ4aZ4oeQeXvfnMZg2lcSz9UBJnM= From: Jai Luthra Date: Thu, 22 Oct 2026 21:18:30 +0530 Subject: [PATCH v2 1/3] ipa: libipa: camera_sensor_helper: Match multiple sensors per helper MIME-Version: 1.0 Message-Id: <20261022-mainline-imx676-v2-1-0b839f1001c0@ideasonboard.com> References: <20261022-mainline-imx676-v2-0-0b839f1001c0@ideasonboard.com> In-Reply-To: <20261022-mainline-imx676-v2-0-0b839f1001c0@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Naushir Patuck , Laurent Pinchart , Kieran Bingham , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Dave Stevenson , Jai Luthra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=15681; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=fNDDxSa/bu6Lzy3kfw7UyTCVSYdc1MBVf8HNjVGfl2U=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBq2jBZ8n67uFwIvJSnBzfTfIFYWvfT+Sz+LRf1T sU8y3Zno4eJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCatowWQAKCRBD3pH5JJpx RdCBD/9mqFjUbSCTfkbEYAxgjPv74w+y+moeSAfACltSPm10zz8oLdmA+k+9833KpAym6kmC5V8 krjkvO77mobJLo1ixDtOQELZufgdJZn+wAWTTn/HaMla+mzWe5Et14h2vNrIdaYjxyFxFybZ/mZ 0ingimy7xt8jZ8yUyBPK4LUkcJ558OaorLbLznOoEUpPfrdSmKttpfBEgIX5jUWQqNb6/mPcl5M EqBgeatsFl/ri9mdAGr/oyCO4IUuW2CCVoYFW+/ZZ3P3Z3tbRVKs+KUPzAptdd4tk6slsC52yWd LR8criYPYWLToQ+IeFxhDU9iwvUY6+0J8qE0LjwJpNYMEwV9nwpEnqD1ec6BN/6+Eo1e50xqGUB A6NzV9tjL3Dp21f8Vy0ZpT7pvEao5VYtKWDbZ2Sj4KpLbSUvfEJfFTmvNDjc0B/Qs1LLTiQZUYD YES737ahq8lwG33q7+drBmkuVRsMyJALyK6YEWh31So+r1TD2mU5+R8V25F/hVSyEZZ1/8HYy/5 v1DiFndH5usm94YC/uvdvENEvOAORK/7jp71ENBgJfQg9F24h1A1adWBoC+ysFwRZtxFIZ3tSOH y9SvTAqBEHXbGKDB/u8fn4xDdJc2SGI12Hcfx0pTlGheSfNW/5s5z9AEWuoCAGiZuyWq13TgyFW SV3JwvCvUibXgag== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 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" Multiple sensors of the same family can often be supported by the same helper. Currently we have to duplicate this by defining a new child class and calling the REGISTER_CAMERA_SENSOR_HELPER macro again. Like below: class CameraSensorHelperImx327 : public CameraSensorHelperImx290 { }; REGISTER_CAMERA_SENSOR_HELPER("imx327", CameraSensorHelperImx327) Fix that by instead allowing registering the same camera sensor helper class for multiple sensor names. Also update the macro to accept >= 1 names using variadic args. Now that this is in place, convert the three users of CameraSensorHelperImx290 to use this. Signed-off-by: Jai Luthra Reviewed-by: Kieran Bingham --- src/ipa/libipa/camera_sensor_helper.cpp | 98 +++++++++++++++------------------ src/ipa/libipa/camera_sensor_helper.h | 12 ++-- 2 files changed, 51 insertions(+), 59 deletions(-) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index 359040ec7418..5fbeefaf5e90 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -241,15 +241,15 @@ double CameraSensorHelper::quantizeGain(double _gain, double *quantizationGain) /** * \brief Construct a camera sensor helper factory base - * \param[in] name Name of the camera sensor helper class + * \param[in] names Names of the camera sensors to match with the helper * * Creating an instance of the factory base registers it with the global list of * factories, accessible through the factories() function. * - * The factory \a name is used to look up factories and shall be unique. + * The factory \a names are used to look up factories and shall be unique. */ -CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(const std::string name) - : name_(name) +CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(std::initializer_list names) + : names_(names.begin(), names.end()) { registerType(this); } @@ -269,7 +269,8 @@ std::unique_ptr CameraSensorHelperFactoryBase::create(const CameraSensorHelperFactoryBase::factories(); for (const CameraSensorHelperFactoryBase *factory : factories) { - if (name != factory->name_) + const auto &names = factory->names_; + if (std::find(names.begin(), names.end(), name) == names.end()) continue; return factory->createInstance(); @@ -345,8 +346,9 @@ std::vector &CameraSensorHelperFactoryBase::fac /** * \def REGISTER_CAMERA_SENSOR_HELPER * \brief Register a camera sensor helper with the camera sensor helper factory - * \param[in] name Sensor model name used to register the class * \param[in] helper Class name of CameraSensorHelper derived class to register + * \param[in] name Sensor model name used to register the class + * \param[in] ... More sensor model names that can be matched to this helper * * Register a CameraSensorHelper subclass with the factory and make it available * to try and match sensors. @@ -468,7 +470,7 @@ public: return m * (1 << coarse) / (1.0 - (fine / d1) / d2); } }; -REGISTER_CAMERA_SENSOR_HELPER("ar0144", CameraSensorHelperAr0144) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperAr0144, "ar0144") class CameraSensorHelperAr0521 : public CameraSensorHelper { @@ -493,7 +495,7 @@ public: private: static constexpr double kStep_ = 16; }; -REGISTER_CAMERA_SENSOR_HELPER("ar0521", CameraSensorHelperAr0521) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperAr0521, "ar0521") class CameraSensorHelperGc05a2 : public CameraSensorHelper { @@ -505,7 +507,7 @@ public: gain_ = AnalogueGainLinear{ 100, 0, 0, 1024 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("gc05a2", CameraSensorHelperGc05a2) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperGc05a2, "gc05a2") class CameraSensorHelperGc08a3 : public CameraSensorHelper { @@ -517,7 +519,7 @@ public: gain_ = AnalogueGainLinear{ 100, 0, 0, 1024 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("gc08a3", CameraSensorHelperGc08a3) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperGc08a3, "gc08a3") class CameraSensorHelperHm1246 : public CameraSensorHelper { @@ -527,7 +529,7 @@ public: gain_ = AnalogueGainLinear{ 1, 16, 0, 16 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("hm1246", CameraSensorHelperHm1246) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperHm1246, "hm1246") class CameraSensorHelperImx214 : public CameraSensorHelper { @@ -539,7 +541,7 @@ public: gain_ = AnalogueGainLinear{ 0, 512, -1, 512 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx214", CameraSensorHelperImx214) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx214, "imx214") class CameraSensorHelperImx219 : public CameraSensorHelper { @@ -551,7 +553,7 @@ public: gain_ = AnalogueGainLinear{ 0, 256, -1, 256 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx219", CameraSensorHelperImx219) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx219, "imx219") class CameraSensorHelperImx258 : public CameraSensorHelper { @@ -563,7 +565,7 @@ public: gain_ = AnalogueGainLinear{ 0, 512, -1, 512 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx258", CameraSensorHelperImx258) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx258, "imx258") class CameraSensorHelperImx283 : public CameraSensorHelper { @@ -575,7 +577,7 @@ public: gain_ = AnalogueGainLinear{ 0, 2048, -1, 2048 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx283", CameraSensorHelperImx283) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx283, "imx283") class CameraSensorHelperImx290 : public CameraSensorHelper { @@ -587,7 +589,7 @@ public: gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx290", CameraSensorHelperImx290) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx290, "imx290", "imx327", "imx462") class CameraSensorHelperImx296 : public CameraSensorHelper { @@ -597,12 +599,7 @@ public: gain_ = AnalogueGainExp{ 1.0, expGainDb(0.1) }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx296", CameraSensorHelperImx296) - -class CameraSensorHelperImx327 : public CameraSensorHelperImx290 -{ -}; -REGISTER_CAMERA_SENSOR_HELPER("imx327", CameraSensorHelperImx327) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx296, "imx296") class CameraSensorHelperImx335 : public CameraSensorHelper { @@ -614,7 +611,7 @@ public: gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx335", CameraSensorHelperImx335) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx335, "imx335") class CameraSensorHelperImx355 : public CameraSensorHelper { @@ -626,7 +623,7 @@ public: gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx355", CameraSensorHelperImx355) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx355, "imx355") class CameraSensorHelperImx415 : public CameraSensorHelper { @@ -636,12 +633,7 @@ public: gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx415", CameraSensorHelperImx415) - -class CameraSensorHelperImx462 : public CameraSensorHelperImx290 -{ -}; -REGISTER_CAMERA_SENSOR_HELPER("imx462", CameraSensorHelperImx462) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx415, "imx415") class CameraSensorHelperImx471 : public CameraSensorHelper { @@ -654,7 +646,7 @@ public: gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx471", CameraSensorHelperImx471) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx471, "imx471") class CameraSensorHelperImx477 : public CameraSensorHelper { @@ -664,7 +656,7 @@ public: gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx477", CameraSensorHelperImx477) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx477, "imx477") class CameraSensorHelperImx662 : public CameraSensorHelper { @@ -676,7 +668,7 @@ public: gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx662", CameraSensorHelperImx662) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx662, "imx662") class CameraSensorHelperImx678 : public CameraSensorHelper { @@ -688,7 +680,7 @@ public: gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx678", CameraSensorHelperImx678) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx678, "imx678") class CameraSensorHelperImx708 : public CameraSensorHelper { @@ -699,7 +691,7 @@ public: gain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("imx708", CameraSensorHelperImx708) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx708, "imx708") class CameraSensorHelperOv01a10 : public CameraSensorHelper { @@ -711,7 +703,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 256 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov01a10", CameraSensorHelperOv01a10) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv01a10, "ov01a10") class CameraSensorHelperOv08d10 : public CameraSensorHelper { @@ -723,7 +715,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov08d10", CameraSensorHelperOv08d10) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv08d10, "ov08d10") class CameraSensorHelperOv08x40 : public CameraSensorHelper { @@ -734,7 +726,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov08x40", CameraSensorHelperOv08x40) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv08x40, "ov08x40") class CameraSensorHelperMira220 : public CameraSensorHelper { @@ -746,7 +738,7 @@ public: gain_ = AnalogueGainLinear{ 0, 2048, -1, 2048 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("mira220", CameraSensorHelperMira220) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperMira220, "mira220") class CameraSensorHelperOv2685 : public CameraSensorHelper { @@ -760,7 +752,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov2685", CameraSensorHelperOv2685) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv2685, "ov2685") class CameraSensorHelperOv2740 : public CameraSensorHelper { @@ -772,7 +764,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov2740", CameraSensorHelperOv2740) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv2740, "ov2740") class CameraSensorHelperOv4689 : public CameraSensorHelper { @@ -784,7 +776,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov4689", CameraSensorHelperOv4689) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv4689, "ov4689") class CameraSensorHelperOv5640 : public CameraSensorHelper { @@ -796,7 +788,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 16 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov5640", CameraSensorHelperOv5640) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv5640, "ov5640") class CameraSensorHelperOv5647 : public CameraSensorHelper { @@ -806,7 +798,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 16 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov5647", CameraSensorHelperOv5647) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv5647, "ov5647") class CameraSensorHelperOv5670 : public CameraSensorHelper { @@ -816,7 +808,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov5670", CameraSensorHelperOv5670) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv5670, "ov5670") class CameraSensorHelperOv5675 : public CameraSensorHelper { @@ -828,7 +820,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov5675", CameraSensorHelperOv5675) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv5675, "ov5675") class CameraSensorHelperOv5693 : public CameraSensorHelper { @@ -839,7 +831,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 16 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov5693", CameraSensorHelperOv5693) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv5693, "ov5693") class CameraSensorHelperOv64a40 : public CameraSensorHelper { @@ -849,7 +841,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov64a40", CameraSensorHelperOv64a40) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv64a40, "ov64a40") class CameraSensorHelperOv8858 : public CameraSensorHelper { @@ -865,7 +857,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov8858", CameraSensorHelperOv8858) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv8858, "ov8858") class CameraSensorHelperOv8865 : public CameraSensorHelper { @@ -875,7 +867,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov8865", CameraSensorHelperOv8865) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv8865, "ov8865") class CameraSensorHelperOv13858 : public CameraSensorHelper { @@ -885,7 +877,7 @@ public: gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("ov13858", CameraSensorHelperOv13858) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperOv13858, "ov13858") class CameraSensorHelperVd55g1 : public CameraSensorHelper { @@ -897,7 +889,7 @@ public: gain_ = AnalogueGainLinear{ 0, 32, -1, 32 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("vd55g1", CameraSensorHelperVd55g1) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperVd55g1, "vd55g1") class CameraSensorHelperVd56g3 : public CameraSensorHelper { @@ -909,7 +901,7 @@ public: gain_ = AnalogueGainLinear{ 0, 32, -1, 32 }; } }; -REGISTER_CAMERA_SENSOR_HELPER("vd56g3", CameraSensorHelperVd56g3) +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperVd56g3, "vd56g3") } /* namespace */ diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h index bd3d0beec77f..bc53f1bfc80c 100644 --- a/src/ipa/libipa/camera_sensor_helper.h +++ b/src/ipa/libipa/camera_sensor_helper.h @@ -54,7 +54,7 @@ private: class CameraSensorHelperFactoryBase { public: - CameraSensorHelperFactoryBase(const std::string name); + CameraSensorHelperFactoryBase(std::initializer_list names); virtual ~CameraSensorHelperFactoryBase() = default; static std::unique_ptr create(const std::string &name); @@ -68,15 +68,15 @@ private: virtual std::unique_ptr createInstance() const = 0; - std::string name_; + std::vector names_; }; template class CameraSensorHelperFactory final : public CameraSensorHelperFactoryBase { public: - CameraSensorHelperFactory(const char *name) - : CameraSensorHelperFactoryBase(name) + CameraSensorHelperFactory(std::initializer_list names) + : CameraSensorHelperFactoryBase(names) { } @@ -87,8 +87,8 @@ private: } }; -#define REGISTER_CAMERA_SENSOR_HELPER(name, helper) \ -static CameraSensorHelperFactory global_##helper##Factory(name); +#define REGISTER_CAMERA_SENSOR_HELPER(helper, name, ...) \ +static CameraSensorHelperFactory global_##helper##Factory({ name, __VA_ARGS__ }); } /* namespace ipa */ From patchwork Thu Oct 22 15:48:31 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 28559 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 9016FC3261 for ; Thu, 22 Oct 2026 15:49:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 40A6C68F81; Thu, 22 Oct 2026 17:49:02 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="nBrPwDrj"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 02C2268F6E for ; Thu, 22 Oct 2026 17:49:00 +0200 (CEST) Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c30:59f6:be2b:2877:6bc4:392]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5E4F6802; Thu, 22 Oct 2026 17:46:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1792684011; bh=abUnBFSbeCa+vIaYCVf+v4jWfSmR4LDo87jTnfroD7U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nBrPwDrjgjVvLbZOVra4B+w3cfp6fJRTRucqqiCPZjv7rExLElCT6Jj9ZI6upUo0D JEYmXSNZYdHOJyQ/tTujAoxEoOfKv/L4wCIEi4O2n01NbJv8QBq9fI4rYtjmZ0tEAN TY4ve8+R/Ldl2vXY68vIc5ohe9W6Mnq65/93CVAU= From: Jai Luthra Date: Thu, 22 Oct 2026 21:18:31 +0530 Subject: [PATCH v2 2/3] libcamera: camera_sensor: Add properties and helpers for Sony IMX585 and IMX676 MIME-Version: 1.0 Message-Id: <20261022-mainline-imx676-v2-2-0b839f1001c0@ideasonboard.com> References: <20261022-mainline-imx676-v2-0-0b839f1001c0@ideasonboard.com> In-Reply-To: <20261022-mainline-imx676-v2-0-0b839f1001c0@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Naushir Patuck , Laurent Pinchart , Kieran Bingham , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Dave Stevenson , Jai Luthra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3086; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=abUnBFSbeCa+vIaYCVf+v4jWfSmR4LDo87jTnfroD7U=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBq2jBakuDRKlJl+/hiTXiTZnttmSSo0tENSbRH5 vUSxPLKT5WJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCatowWgAKCRBD3pH5JJpx RYTbD/47/gOV0cm6M0Jn3Ve2OKXqLL44EPM4uoso1ZM3gW47L7qbZTIoWafQtFUH8vKoXoYeLO/ hR7fraC6uGwdw0C4Ge0KkhXKLo3RMD6hFDQrVneWvQ65qafmu3UXaRKuUHPLpMK1qA/3eGy6tRl fBS0PdYocusLHbPb49CAOzaDqcySS6GzxofbSqN4IfBjuMRgdPAC5JGYE89NA/9APOAM79JyJxR z+KlC3lTtKqACEFx2Z6NizJllPvSBFudgVqvucIHcMMZRXSlASNPQPtH6GyQQzNT4MPkq6F2MYN /mQqmAj4RLM49tmCEo02JsujphgQx4YKSrgIGoh1atNprQkL+23g875XhKnXeCrs87JPQBOBwqA a7EYDjVzsPFhAP1XLXV6SmVxHdzVE83LBAO7U4pv+MBbCwb46TmZmQ8ZxjGMbo5jvkXSS4IP0Wh ytN961gLTvB+uL0xGlMfbMPRynO1FGXLci5YtWlzgYw0BpcVHnwnQo5C+pB2+RGco8g2hRucDJG nlkbBx4fCMtBetnB8eD2Z/Q3vpCXE271bj2oT8wFYxYzHQeg5NGw01Gq48Af7DMim5CqoycKI3A YxIH8WjWqyjE2Hxh923ONeNq90b2SatuTH+hN4p1ZXe7LJjjYImHm8qaGZCgU15DtcMgyzDqX1y 0Hpbm4gKcucMbUw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 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" Sony IMX585 (8.4MP) and IMX676 (12.6MP) are Starvis 2 sensors. Add the camera sensor properties for both. To my knowledge, all Starvis 2 sensors have the same black level and gain models. So for the camera helper, combine the existing helpers for other sensors from the same family (IMX662, IMX678) and use it for IMX585 and IMX676 too. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- src/ipa/libipa/camera_sensor_helper.cpp | 19 ++++--------------- src/libcamera/sensor/camera_sensor_properties.cpp | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index 5fbeefaf5e90..d8a9fe63417c 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -658,29 +658,18 @@ public: }; REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx477, "imx477") -class CameraSensorHelperImx662 : public CameraSensorHelper +class CameraSensorHelperStarvis2: public CameraSensorHelper { public: - CameraSensorHelperImx662() - { - /* From datasheet: 0xc8 at 12bits. */ - blackLevel_ = 3200; - gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; - } -}; -REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx662, "imx662") - -class CameraSensorHelperImx678 : public CameraSensorHelper -{ -public: - CameraSensorHelperImx678() + CameraSensorHelperStarvis2() { /* From datasheet: 0x32 at 10bits. */ blackLevel_ = 3200; gain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) }; } }; -REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperImx678, "imx678") +REGISTER_CAMERA_SENSOR_HELPER(CameraSensorHelperStarvis2, "imx585", "imx662", + "imx676", "imx678") class CameraSensorHelperImx708 : public CameraSensorHelper { diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp index 20cfd0bc11a6..1916e905cb7c 100644 --- a/src/libcamera/sensor/camera_sensor_properties.cpp +++ b/src/libcamera/sensor/camera_sensor_properties.cpp @@ -340,6 +340,16 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen .hblankDelay = 3 }, } }, + { "imx585", { + .unitCellSize = { 2900, 2900 }, + .testPatternModes = {}, + .sensorDelays = { + .exposureDelay = 2, + .gainDelay = 2, + .vblankDelay = 2, + .hblankDelay = 2 + }, + } }, { "imx662", { .unitCellSize = { 2900, 2900 }, .testPatternModes = {}, @@ -350,6 +360,16 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen .hblankDelay = 2 }, } }, + { "imx676", { + .unitCellSize = { 2000, 2000 }, + .testPatternModes = {}, + .sensorDelays = { + .exposureDelay = 2, + .gainDelay = 2, + .vblankDelay = 2, + .hblankDelay = 2 + }, + } }, { "imx678", { .unitCellSize = { 2000, 2000 }, .testPatternModes = {}, From patchwork Thu Oct 22 15:48:32 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 28560 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 6DC0CC324C for ; Thu, 22 Oct 2026 15:49:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0F9D568F86; Thu, 22 Oct 2026 17:49:07 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="U3k45atQ"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3364468F6E for ; Thu, 22 Oct 2026 17:49:05 +0200 (CEST) Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c30:59f6:be2b:2877:6bc4:392]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8941A8FD; Thu, 22 Oct 2026 17:46:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1792684017; bh=HhcrD+vqQ1/ePZsavJkcir1wVWvtLI50mwwFLdEVJBs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=U3k45atQ/JBr7EhFUWu+nUX1y88AeywzNCeJCPhHqGZkVB9XfudhI9qX5k5s63ibM wSSnUdrwVtLTPHe2h3Iy8XetRLd3aGriuvWfwSg5R4OYoFW8LDfGKa2YInH2lGvTXh Gr9+Otbpr00kGI00N++HGtR+Y6uhG7BTjmtEPK+o= From: Jai Luthra Date: Thu, 22 Oct 2026 21:18:32 +0530 Subject: [PATCH v2 3/3] ipa: rpi: cam-helper: Support IMX585 and IMX676 MIME-Version: 1.0 Message-Id: <20261022-mainline-imx676-v2-3-0b839f1001c0@ideasonboard.com> References: <20261022-mainline-imx676-v2-0-0b839f1001c0@ideasonboard.com> In-Reply-To: <20261022-mainline-imx676-v2-0-0b839f1001c0@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Naushir Patuck , Laurent Pinchart , Kieran Bingham , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Dave Stevenson , Jai Luthra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2153; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=HhcrD+vqQ1/ePZsavJkcir1wVWvtLI50mwwFLdEVJBs=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBq2jBbAMYKqufO1iNb916boAN2DnMzvypDBIfuy PVCeqaKpDeJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCatowWwAKCRBD3pH5JJpx RSsDD/9MydgtUBmbGeEUSnBzCZkOlT1dof69sZ9UoQlUofErH7CUMTDxKOir0tde+b52o5osjD+ 0aeF7t0h5c1muZ4j6jziedd1L4oBZyB/iaP26Nrk76QQqPOwHFJTuhorzuOiMiZKUD7ZMm3Ok6M 04+a/zLieeFwtpxsp+7wi51+eE4ehaon99W7UPtXfVSuhX/hXsF9pmQn/MjDaJQUoEKN88AhT4J rasCxJqiyiRB05+X97p26X7nxS/1GzFB7q52mHovURZOTdDKL4hbV+PNmiRVRUmNATwSijMFfSm apxpVCe/7LJqeS4yrYrQ3IOgCy1IFI8Is1Jk8fqcbTzkSM4SUPa2GySNrATrZA4KwjNyxnLafUF P9LTYtjPlF95PcGckq0T+54o61k7hO3qqJHOdeNIwv86dXATW9NrVl/dASFP++Oqjj35mgC4iDu KtGlkAbCpuEVmpoMiToaPx5g+FXjimHyyW9fdwkM7qZjayxvuXHI3XISiSe7zx5YQ0UPkA9OHW7 NfvnF7iyMSW+QqXlkOg4qe1hcJZT77Izoj7mk8B59FaFE1sroTmZ+4GW4KKSygnM02vMD6pvutd yH+pvl9MHvQD4gYsG3y5sUXZxvYvh/NH/nAXRJ+y8mgjaqTUm9hjnlXnlJTbBzPnDxBGIB4LTvn A5VoyBbVzzRX9sw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 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" Sony IMX585 and IMX676 are also Starvis 2 sensors, with same gain model as rest of them. The integration time constraints are different, as the SRM specifies the shutter reigster minimum to be 8 (in units of 2H) as opposed to 4 (in units of 1H). Add support for both through the existing Starvis 2 helper, handling the integration time explicitly during registration. Reviewed-by: Kieran Bingham Signed-off-by: Jai Luthra --- src/ipa/rpi/cam_helper/cam_helper_starvis2.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ipa/rpi/cam_helper/cam_helper_starvis2.cpp b/src/ipa/rpi/cam_helper/cam_helper_starvis2.cpp index a2f01bbc8370..07e77b939ec2 100644 --- a/src/ipa/rpi/cam_helper/cam_helper_starvis2.cpp +++ b/src/ipa/rpi/cam_helper/cam_helper_starvis2.cpp @@ -17,7 +17,7 @@ using namespace RPiController; class CamHelperStarvis2 : public CamHelper { public: - CamHelperStarvis2(); + CamHelperStarvis2(unsigned int frameIntegrationDiff = kFrameIntegrationDiff); uint32_t gainCode(double gain) const override; double gain(uint32_t gainCode) const override; @@ -26,10 +26,10 @@ private: * Smallest difference between the frame length and integration time, * in units of lines. */ - static constexpr int frameIntegrationDiff = 4; + static constexpr unsigned int kFrameIntegrationDiff = 4; }; -CamHelperStarvis2::CamHelperStarvis2() +CamHelperStarvis2::CamHelperStarvis2(unsigned int frameIntegrationDiff) : CamHelper({}, frameIntegrationDiff) { } @@ -50,8 +50,16 @@ CamHelper *create() return new CamHelperStarvis2(); } +CamHelper *create585() +{ + /* IMX585 and IMX676 manuals specify the minimum for SHR0 as 8 lines */ + return new CamHelperStarvis2(8); +} + +RegisterCamHelper reg585("imx585", &create585); RegisterCamHelper reg662("imx662", &create); RegisterCamHelper reg675("imx675", &create); +RegisterCamHelper reg676("imx676", &create585); RegisterCamHelper reg678("imx678", &create); RegisterCamHelper reg832("imx832", &create);