Patch Detail
Show a patch.
GET /api/patches/24839/?format=api
{ "id": 24839, "url": "https://patchwork.libcamera.org/api/patches/24839/?format=api", "web_url": "https://patchwork.libcamera.org/patch/24839/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20251028-exposure-limits-v2-1-a8b5a318323e@ideasonboard.com>", "date": "2025-10-28T09:31:47", "name": "[v2,01/10] ipa: camera_sensor_helper: Introduce exposureMargin()", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "2ebc158e7844f0cfd2e592ce19e1a0043e4cec1b", "submitter": { "id": 143, "url": "https://patchwork.libcamera.org/api/people/143/?format=api", "name": "Jacopo Mondi", "email": "jacopo.mondi@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/24839/mbox/", "series": [ { "id": 5536, "url": "https://patchwork.libcamera.org/api/series/5536/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5536", "date": "2025-10-28T09:31:46", "name": "libipa: agc: Calculate exposure limits", "version": 2, "mbox": "https://patchwork.libcamera.org/series/5536/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/24839/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/24839/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id BCB92BE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 28 Oct 2025 09:32:15 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 96A92607AC;\n\tTue, 28 Oct 2025 10:32:10 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 940DD6078C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Oct 2025 10:32:07 +0100 (CET)", "from [192.168.0.172] (mob-5-90-58-13.net.vodafone.it [5.90.58.13])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 023BB1AED; \n\tTue, 28 Oct 2025 10:30:18 +0100 (CET)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"nBWJxX4T\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761643819;\n\tbh=f1o89u6CDxBXPdsmF5cTswP56ZrdhO4N8GFN23yudhs=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=nBWJxX4Tc/xWe8mbaaphnE+P1I3KULZMgYla7m+K3sMl0UL1YYslcTJ9l9lxJFY0h\n\tAFRFLeJ7qBYx8Ftzd6DTFM5+rzu6jh//nEG5huuQADGElfO0x/ibbLIwZsIE+NR9cj\n\t3xDce1UqQ/X67sJAq+mhwiEU+WH+BTY264JqTTi4=", "From": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>", "Date": "Tue, 28 Oct 2025 10:31:47 +0100", "Subject": "[PATCH v2 01/10] ipa: camera_sensor_helper: Introduce\n\texposureMargin()", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "7bit", "Message-Id": "<20251028-exposure-limits-v2-1-a8b5a318323e@ideasonboard.com>", "References": "<20251028-exposure-limits-v2-0-a8b5a318323e@ideasonboard.com>", "In-Reply-To": "<20251028-exposure-limits-v2-0-a8b5a318323e@ideasonboard.com>", "To": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>,\n\tRobert Mader <robert.mader@collabora.com>, \n\tlibcamera-devel@lists.libcamera.org", "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>", "X-Mailer": "b4 0.14.2", "X-Developer-Signature": "v=1; a=openpgp-sha256; l=10952;\n\ti=jacopo.mondi@ideasonboard.com; h=from:subject:message-id;\n\tbh=f1o89u6CDxBXPdsmF5cTswP56ZrdhO4N8GFN23yudhs=;\n\tb=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpAI2UmaJ3xkBUY+rbq9+3+XPWhBT9vYPyEaH36\n\tffqn+GoceqJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaQCNlAAKCRByNAaPFqFW\n\tPJzREADD0byAlRv4NwvJ7Yxx1UKyaFilxaAdffovMWqO7lM0MUMuJNyokDMN1zxKrVGBu9V9HCt\n\t+sSn0UWQNqXf2RdXo1TcHESjWShMgYh2tnojafpkb6AFdKqxh9zyxn8ovshi9eVzakGw/QNvxji\n\tgr0rymhEZUH8ZNQQ+jZbVhQQh8VW+dRG2UgSF7OdpZZYtn9QyE5mnBJe2Fu/44obDDAr1d0mAel\n\tCXyOoAPYSHNJW7hVk6NEeI0aK/Orte6t2I1SrorYCkfPCiqhuY1xRzoGrxArW+MI46i5VO2PLpC\n\tUulgksuw6cwitUVBD9hPkg6MtYQfq73nwHjTZf0prZgstwgzmuYHf4wcQFsQRWUmvIT6MCRYhdH\n\t6W0ZGrsprcgvOxK3RgWNmmd82m8P8Z47YGipL6rMkShC2LwBCWu6Wcp/5TsikwdTlwK4ImxJ7Jj\n\tUtLYr+iQy6Mxno/U8HMcxA1h2PH6dTbuDJZYN5owB9CH+BnNmoGyV/P8VSPSuJreMbXBqVl0bef\n\tC3odpikrGHHhRGSbZQKV1aPcXxbAQH37VktNeppgyNsMCHdGKvXf1L12yuG9iewuWe6XwYvK6j7\n\tPNyKkSZEc1PtDQGPPTYBgMKfK76cbw9jeU3loiMcYbbD5khyWsFAllMHqnEMHE/UfCU0Jynt00S\n\thqVDgA41rJcb86w==", "X-Developer-Key": "i=jacopo.mondi@ideasonboard.com; a=openpgp;\n\tfpr=72392EDC88144A65C701EA9BA5826A2587AD026B", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "There is a margin between the maximum achievable exposure time\nand the frame length. The value is sensor-dependent and should\nbe used to adjust the maximum achievable exposure time whenever\nthe frame length changes.\n\nIntroduce in the CameraSensorHelper an exposureMargin() function\nthat returns a std::optional<> with the sensor-specific margin.\nUse a std::optional<> to easily identify CameraSensorHelper\nimplementations that do not populate exposureMargin_ and warn\nabout possibly sub-optimal results in exposure time calculations.\n\nThis feature is already implemented in the RPi CamHelper class\nhierarchy with the name of frameIntegrationDiff.\n\nPopulate the CameraSensorHelper instances with an\nexposureMargin_. The value of the exposure margin comes from\nthe mainline driver version of each sensor, and it has been\ncompared with the frameIntegrationDiff_ value in the rpi\ncamera helpers.\n\nThe only outliner is the Vd56g3 sensor, whose exposure margin from\nthe driver differs from the RPi camera helper.\n\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n---\n src/ipa/libipa/camera_sensor_helper.cpp | 72 +++++++++++++++++++++++++++++++++\n src/ipa/libipa/camera_sensor_helper.h | 2 +\n 2 files changed, 74 insertions(+)", "diff": "diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp\nindex ef3bd0d621e6bead2b3f8a7fe6988f642e4791f7..6d14405657903704d6ffee72eb336ec8b78db1cd 100644\n--- a/src/ipa/libipa/camera_sensor_helper.cpp\n+++ b/src/ipa/libipa/camera_sensor_helper.cpp\n@@ -154,6 +154,18 @@ double CameraSensorHelper::quantizeGain(double _gain, double *quantizationGain)\n \treturn g;\n }\n \n+/**\n+ * \\fn CameraSensorHelper::exposureMargin()\n+ * \\brief Fetch the integration time margin\n+ *\n+ * This function returns the number of lines that represent the minimum\n+ * difference between the frame length and the maximum achievable integration\n+ * time. If it is unknown an empty optional is returned.\n+ *\n+ * \\return The minimum difference between the exposure time and the frame\n+ * length in lines, or an empty optional\n+ */\n+\n /**\n * \\struct CameraSensorHelper::AnalogueGainLinear\n * \\brief Analogue gain constants for the linear gain model\n@@ -229,6 +241,13 @@ double CameraSensorHelper::quantizeGain(double _gain, double *quantizationGain)\n * sensor specific. Use this variable to store the values at init time.\n */\n \n+/**\n+ * \\var CameraSensorHelper::exposureMargin_\n+ * \\brief The smallest margin between the integration time and the frame lenght\n+ * in lines\n+ * \\sa CameraSensorHelper::exposureMargin()\n+ */\n+\n /**\n * \\class CameraSensorHelperFactoryBase\n * \\brief Base class for camera sensor helper factories\n@@ -385,6 +404,7 @@ public:\n \t{\n \t\t/* Power-on default value: 168 at 12bits. */\n \t\tblackLevel_ = 2688;\n+\t\texposureMargin_ = 4;\n \t}\n \n \tuint32_t gainCode(double gain) const override\n@@ -474,6 +494,11 @@ REGISTER_CAMERA_SENSOR_HELPER(\"ar0144\", CameraSensorHelperAr0144)\n class CameraSensorHelperAr0521 : public CameraSensorHelper\n {\n public:\n+\tCameraSensorHelperAr0521()\n+\t{\n+\t\texposureMargin_ = 4;\n+\t}\n+\n \tuint32_t gainCode(double gain) const override\n \t{\n \t\tgain = std::clamp(gain, 1.0, 15.5);\n@@ -504,6 +529,7 @@ public:\n \t\t/* From datasheet: 64 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 100, 0, 0, 1024 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"gc05a2\", CameraSensorHelperGc05a2)\n@@ -516,6 +542,7 @@ public:\n \t\t/* From datasheet: 64 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 100, 0, 0, 1024 };\n+\t\texposureMargin_ = 16;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"gc08a3\", CameraSensorHelperGc08a3)\n@@ -526,6 +553,7 @@ public:\n \tCameraSensorHelperHm1246()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 16, 0, 16 };\n+\t\texposureMargin_ = 2;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"hm1246\", CameraSensorHelperHm1246)\n@@ -538,6 +566,7 @@ public:\n \t\t/* From datasheet: 64 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 0, 512, -1, 512 };\n+\t\texposureMargin_ = 10;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx214\", CameraSensorHelperImx214)\n@@ -550,6 +579,7 @@ public:\n \t\t/* From datasheet: 64 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 0, 256, -1, 256 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx219\", CameraSensorHelperImx219)\n@@ -562,6 +592,7 @@ public:\n \t\t/* From datasheet: 0x40 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 0, 512, -1, 512 };\n+\t\texposureMargin_ = 10;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx258\", CameraSensorHelperImx258)\n@@ -574,6 +605,7 @@ public:\n \t\t/* From datasheet: 0x32 at 10bits. */\n \t\tblackLevel_ = 3200;\n \t\tgain_ = AnalogueGainLinear{ 0, 2048, -1, 2048 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx283\", CameraSensorHelperImx283)\n@@ -586,6 +618,7 @@ public:\n \t\t/* From datasheet: 0xf0 at 12bits. */\n \t\tblackLevel_ = 3840;\n \t\tgain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) };\n+\t\texposureMargin_ = 2;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx290\", CameraSensorHelperImx290)\n@@ -596,6 +629,11 @@ public:\n \tCameraSensorHelperImx296()\n \t{\n \t\tgain_ = AnalogueGainExp{ 1.0, expGainDb(0.1) };\n+\t\t/*\n+\t\t * The driver doesn't apply any margin. Use the value\n+\t\t * in RPi's CamHelper.\n+\t\t */\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx296\", CameraSensorHelperImx296)\n@@ -613,6 +651,7 @@ public:\n \t\t/* From datasheet: 0x32 at 10bits. */\n \t\tblackLevel_ = 3200;\n \t\tgain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) };\n+\t\texposureMargin_ = 9;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx335\", CameraSensorHelperImx335)\n@@ -623,6 +662,7 @@ public:\n \tCameraSensorHelperImx415()\n \t{\n \t\tgain_ = AnalogueGainExp{ 1.0, expGainDb(0.3) };\n+\t\texposureMargin_ = 8;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx415\", CameraSensorHelperImx415)\n@@ -638,6 +678,7 @@ public:\n \tCameraSensorHelperImx477()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 0, 1024, -1, 1024 };\n+\t\texposureMargin_ = 22;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"imx477\", CameraSensorHelperImx477)\n@@ -652,6 +693,7 @@ public:\n \t\t * This has been validated with some empirical testing only.\n \t\t */\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov2685\", CameraSensorHelperOv2685)\n@@ -662,6 +704,7 @@ public:\n \tCameraSensorHelperOv2740()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 8;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov2740\", CameraSensorHelperOv2740)\n@@ -674,6 +717,7 @@ public:\n \t\t/* From datasheet: 0x40 at 12bits. */\n \t\tblackLevel_ = 1024;\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov4689\", CameraSensorHelperOv4689)\n@@ -686,6 +730,14 @@ public:\n \t\t/* From datasheet: 0x10 at 10bits. */\n \t\tblackLevel_ = 1024;\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 16 };\n+\t\t/*\n+\t\t * Very convoluted in the driver that however applies a margin\n+\t\t * of 4 lines when setting vts.\n+\t\t *\n+\t\t * \tcap_vts = cap_shutter + 4;\n+\t\t * \tret = ov5640_set_vts(sensor, cap_vts);\n+\t\t */\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov5640\", CameraSensorHelperOv5640)\n@@ -696,6 +748,7 @@ public:\n \tCameraSensorHelperOv5647()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 16 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov5647\", CameraSensorHelperOv5647)\n@@ -706,6 +759,7 @@ public:\n \tCameraSensorHelperOv5670()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 8;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov5670\", CameraSensorHelperOv5670)\n@@ -718,6 +772,7 @@ public:\n \t\t/* From Linux kernel driver: 0x40 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov5675\", CameraSensorHelperOv5675)\n@@ -728,6 +783,7 @@ public:\n \tCameraSensorHelperOv5693()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 16 };\n+\t\texposureMargin_ = 8;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov5693\", CameraSensorHelperOv5693)\n@@ -738,6 +794,7 @@ public:\n \tCameraSensorHelperOv64a40()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 32;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov64a40\", CameraSensorHelperOv64a40)\n@@ -754,6 +811,7 @@ public:\n \t\t * See: https://patchwork.linuxtv.org/project/linux-media/patch/20221106171129.166892-2-nicholas@rothemail.net/#142267\n \t\t */\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 4;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov8858\", CameraSensorHelperOv8858)\n@@ -764,6 +822,7 @@ public:\n \tCameraSensorHelperOv8865()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 8;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov8865\", CameraSensorHelperOv8865)\n@@ -774,6 +833,7 @@ public:\n \tCameraSensorHelperOv13858()\n \t{\n \t\tgain_ = AnalogueGainLinear{ 1, 0, 0, 128 };\n+\t\texposureMargin_ = 8;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"ov13858\", CameraSensorHelperOv13858)\n@@ -786,6 +846,7 @@ public:\n \t\t/* From datasheet: 0x40 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 0, 32, -1, 32 };\n+\t\texposureMargin_ = 64;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"vd55g1\", CameraSensorHelperVd55g1)\n@@ -798,6 +859,17 @@ public:\n \t\t/* From datasheet: 0x40 at 10bits. */\n \t\tblackLevel_ = 4096;\n \t\tgain_ = AnalogueGainLinear{ 0, 32, -1, 32 };\n+\t\t/*\n+\t\t * The mainline driver version has\n+\t\t * #define VD56G3_EXPOSURE_MARGIN\t\t75\n+\t\t * while the frameIntegrationDiff value in the RPi cam\n+\t\t * helper for this sensor has\n+\t\t * static constexpr int frameIntegrationDiff = 61;\n+\t\t *\n+\t\t * Trust the driver and report 75 which is also larger and\n+\t\t * hence \"safer\"\n+\t\t */\n+\t\texposureMargin_ = 75;\n \t}\n };\n REGISTER_CAMERA_SENSOR_HELPER(\"vd56g3\", CameraSensorHelperVd56g3)\ndiff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h\nindex bd3d0beec77f006b68fecf45eee850c5283fefa5..57dd4c37ed76733710f1673a98e82ae47475baa7 100644\n--- a/src/ipa/libipa/camera_sensor_helper.h\n+++ b/src/ipa/libipa/camera_sensor_helper.h\n@@ -30,6 +30,7 @@ public:\n \tvirtual uint32_t gainCode(double gain) const;\n \tvirtual double gain(uint32_t gainCode) const;\n \tdouble quantizeGain(double gain, double *quantizationGain) const;\n+\tstd::optional<uint32_t> exposureMargin() const { return exposureMargin_; }\n \n protected:\n \tstruct AnalogueGainLinear {\n@@ -46,6 +47,7 @@ protected:\n \n \tstd::optional<int16_t> blackLevel_;\n \tstd::variant<std::monostate, AnalogueGainLinear, AnalogueGainExp> gain_;\n+\tstd::optional<uint32_t> exposureMargin_;\n \n private:\n \tLIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorHelper)\n", "prefixes": [ "v2", "01/10" ] }