From patchwork Mon Mar 28 12:03:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 15572 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 5F872C3265 for ; Mon, 28 Mar 2022 12:03:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6B29865637; Mon, 28 Mar 2022 14:03:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1648469024; bh=dCdO5KC0qS8Expo4HQ/g6DfXtFRZn5qq3lY+qK221lI=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=yR1doETy88D3/GdlI2yru0WiRWmyNFSAFoMNAySMsBTezLtMG0qf3IGO5zxc7F6ZS k7e69nJBc3bbnDsfDnxztv3N6PSjCmkp+XXE5rd8BzELAPXd1ZC6eW41EFwNEKUSme T54nmGz5JtM7TFiquI0vXvYTv942CAMbywlqsxXJxh2KhQrqTsdeo9BrxFEDo7VLW6 tiKxu0J6fszEvYfFZJnW+MhNCEEgWln1BCroMwPEF070+E+hjOxE2VSFLMCS3G6n5U /qcpMomQhCSZzObNITGNOFpqnru/bveOojC5nl+TWqVfuA5WwwPhD/yG+w0v0qKiVj Qa7mYarYHD/ww== 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 2602B601F5 for ; Mon, 28 Mar 2022 14:03:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="dPgpZ8AE"; dkim-atps=neutral Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C2A8FE0A for ; Mon, 28 Mar 2022 14:03:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1648469021; bh=dCdO5KC0qS8Expo4HQ/g6DfXtFRZn5qq3lY+qK221lI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=dPgpZ8AEwIsQRhJ6WSfN8dHqwZBo422ts/4ReCjuP/ZD72mIKns4YwlFKESZi5E96 aTxWjvsFeNqD5ybMlgIYH4ditLfOP/pqoQL+ciB3Gm4QohqR2yipgAB66shySArQHN 1vJA9Rwh63MF1Lk5yzREwEa8/BqfB72wQv7pE5DE= To: libcamera-devel@lists.libcamera.org Date: Mon, 28 Mar 2022 15:03:33 +0300 Message-Id: <20220328120336.10834-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220328120336.10834-1-laurent.pinchart@ideasonboard.com> References: <20220328120336.10834-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/4] libipa: camera_sensor_helper: Reorganize gain constants 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: Laurent Pinchart via libcamera-devel From: Laurent Pinchart Reply-To: Laurent Pinchart Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" To prepare for other gain models than the linear model, store the gain constants in a union with per-model members. Due to the lack of designated initializer support in gcc with C++17, initializing a single complex structure that includes a union will be difficult. Split the gain model type to a separate variable to work around this issue. Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi Reviewed-by: Umang Jain Reviewed-by: Paul Elder --- src/ipa/libipa/camera_sensor_helper.cpp | 102 ++++++++++++++---------- src/ipa/libipa/camera_sensor_helper.h | 10 ++- 2 files changed, 65 insertions(+), 47 deletions(-) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index c953def04fd7..714cd86f039f 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -58,11 +58,13 @@ namespace ipa { */ uint32_t CameraSensorHelper::gainCode(double gain) const { - ASSERT(analogueGainConstants_.m0 == 0 || analogueGainConstants_.m1 == 0); - ASSERT(analogueGainConstants_.type == AnalogueGainLinear); + const AnalogueGainConstants &k = gainConstants_; - return (analogueGainConstants_.c0 - analogueGainConstants_.c1 * gain) / - (analogueGainConstants_.m1 * gain - analogueGainConstants_.m0); + ASSERT(gainType_ == AnalogueGainLinear); + ASSERT(k.linear.m0 == 0 || k.linear.m1 == 0); + + return (k.linear.c0 - k.linear.c1 * gain) / + (k.linear.m1 * gain - k.linear.m0); } /** @@ -80,11 +82,13 @@ uint32_t CameraSensorHelper::gainCode(double gain) const */ double CameraSensorHelper::gain(uint32_t gainCode) const { - ASSERT(analogueGainConstants_.m0 == 0 || analogueGainConstants_.m1 == 0); - ASSERT(analogueGainConstants_.type == AnalogueGainLinear); + const AnalogueGainConstants &k = gainConstants_; - return (analogueGainConstants_.m0 * static_cast(gainCode) + analogueGainConstants_.c0) / - (analogueGainConstants_.m1 * static_cast(gainCode) + analogueGainConstants_.c1); + ASSERT(gainType_ == AnalogueGainLinear); + ASSERT(k.linear.m0 == 0 || k.linear.m1 == 0); + + return (k.linear.m0 * static_cast(gainCode) + k.linear.c0) / + (k.linear.m1 * static_cast(gainCode) + k.linear.c1); } /** @@ -127,42 +131,45 @@ double CameraSensorHelper::gain(uint32_t gainCode) const * \todo not implemented in libipa */ +/** + * \struct CameraSensorHelper::AnalogueGainLinearConstants + * \brief Analogue gain constants for the linear gain model + * + * \var CameraSensorHelper::AnalogueGainLinearConstants::m0 + * \brief Constant used in the linear gain coding/decoding + * + * \note Either m0 or m1 shall be zero. + * + * \var CameraSensorHelper::AnalogueGainLinearConstants::c0 + * \brief Constant used in the linear gain coding/decoding + * + * \var CameraSensorHelper::AnalogueGainLinearConstants::m1 + * \brief Constant used in the linear gain coding/decoding + * + * \note Either m0 or m1 shall be zero. + * + * \var CameraSensorHelper::AnalogueGainLinearConstants::c1 + * \brief Constant used in the linear gain coding/decoding + */ + /** * \struct CameraSensorHelper::AnalogueGainConstants - * \brief Analogue gain constants used for gain calculation - */ - -/** - * \var CameraSensorHelper::AnalogueGainConstants::type - * \brief Analogue gain calculation mode - */ - -/** - * \var CameraSensorHelper::AnalogueGainConstants::m0 - * \brief Constant used in the analogue Gain coding/decoding + * \brief Analogue gain model constants * - * \note Either m0 or m1 shall be zero. - */ - -/** - * \var CameraSensorHelper::AnalogueGainConstants::c0 - * \brief Constant used in the analogue gain coding/decoding - */ - -/** - * \var CameraSensorHelper::AnalogueGainConstants::m1 - * \brief Constant used in the analogue gain coding/decoding + * This union stores the constants used to calculate the analogue gain. The + * CameraSensorHelper::gainType_ variable selects which union member is valid. * - * \note Either m0 or m1 shall be zero. + * \var CameraSensorHelper::AnalogueGainConstants::linear + * \brief Constants for the linear gain model */ /** - * \var CameraSensorHelper::AnalogueGainConstants::c1 - * \brief Constant used in the analogue gain coding/decoding + * \var CameraSensorHelper::gainType_ + * \brief The analogue gain model type */ /** - * \var CameraSensorHelper::analogueGainConstants_ + * \var CameraSensorHelper::gainConstants_ * \brief The analogue gain parameters used for calculation * * The analogue gain is calculated through a formula, and its parameters are @@ -290,7 +297,8 @@ class CameraSensorHelperImx219 : public CameraSensorHelper public: CameraSensorHelperImx219() { - analogueGainConstants_ = { AnalogueGainLinear, 0, 256, -1, 256 }; + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 0, 256, -1, 256 }; } }; REGISTER_CAMERA_SENSOR_HELPER("imx219", CameraSensorHelperImx219) @@ -298,10 +306,11 @@ REGISTER_CAMERA_SENSOR_HELPER("imx219", CameraSensorHelperImx219) class CameraSensorHelperImx258 : public CameraSensorHelper { public: - CameraSensorHelperImx258() - { - analogueGainConstants_ = { AnalogueGainLinear, 0, 512, -1, 512 }; - } + CameraSensorHelperImx258() + { + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 0, 512, -1, 512 }; + } }; REGISTER_CAMERA_SENSOR_HELPER("imx258", CameraSensorHelperImx258) @@ -310,7 +319,8 @@ class CameraSensorHelperOv2740 : public CameraSensorHelper public: CameraSensorHelperOv2740() { - analogueGainConstants_ = { AnalogueGainLinear, 1, 0, 0, 128 }; + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 1, 0, 0, 128 }; } }; REGISTER_CAMERA_SENSOR_HELPER("ov2740", CameraSensorHelperOv2740) @@ -320,7 +330,8 @@ class CameraSensorHelperOv5670 : public CameraSensorHelper public: CameraSensorHelperOv5670() { - analogueGainConstants_ = { AnalogueGainLinear, 1, 0, 0, 128 }; + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 1, 0, 0, 128 }; } }; REGISTER_CAMERA_SENSOR_HELPER("ov5670", CameraSensorHelperOv5670) @@ -330,7 +341,8 @@ class CameraSensorHelperOv5693 : public CameraSensorHelper public: CameraSensorHelperOv5693() { - analogueGainConstants_ = { AnalogueGainLinear, 1, 0, 0, 16 }; + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 1, 0, 0, 16 }; } }; REGISTER_CAMERA_SENSOR_HELPER("ov5693", CameraSensorHelperOv5693) @@ -340,7 +352,8 @@ class CameraSensorHelperOv8865 : public CameraSensorHelper public: CameraSensorHelperOv8865() { - analogueGainConstants_ = { AnalogueGainLinear, 1, 0, 0, 128 }; + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 1, 0, 0, 128 }; } }; REGISTER_CAMERA_SENSOR_HELPER("ov8865", CameraSensorHelperOv8865) @@ -350,7 +363,8 @@ class CameraSensorHelperOv13858 : public CameraSensorHelper public: CameraSensorHelperOv13858() { - analogueGainConstants_ = { AnalogueGainLinear, 1, 0, 0, 128 }; + gainType_ = AnalogueGainLinear; + gainConstants_.linear = { 1, 0, 0, 128 }; } }; REGISTER_CAMERA_SENSOR_HELPER("ov13858", CameraSensorHelperOv13858) diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h index 26adfcb5955f..6b96520ba601 100644 --- a/src/ipa/libipa/camera_sensor_helper.h +++ b/src/ipa/libipa/camera_sensor_helper.h @@ -34,15 +34,19 @@ protected: AnalogueGainExponential, }; - struct AnalogueGainConstants { - AnalogueGainType type; + struct AnalogueGainLinearConstants { int16_t m0; int16_t c0; int16_t m1; int16_t c1; }; - AnalogueGainConstants analogueGainConstants_; + union AnalogueGainConstants { + AnalogueGainLinearConstants linear; + }; + + AnalogueGainType gainType_; + AnalogueGainConstants gainConstants_; private: LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorHelper)