{"id":21831,"url":"https://patchwork.libcamera.org/api/1.1/patches/21831/?format=json","web_url":"https://patchwork.libcamera.org/patch/21831/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20241107102508.48322-6-dan.scally@ideasonboard.com>","date":"2024-11-07T10:25:07","name":"[v2,5/6] libcamera: camera_sensor_properties: Add sensor control delays","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"dd1ecf16b69f6ffb0442aff57fc5c2ca672372a8","submitter":{"id":156,"url":"https://patchwork.libcamera.org/api/1.1/people/156/?format=json","name":"Dan Scally","email":"dan.scally@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/21831/mbox/","series":[{"id":4775,"url":"https://patchwork.libcamera.org/api/1.1/series/4775/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4775","date":"2024-11-07T10:25:03","name":"Centralise common functions in IPA modules","version":2,"mbox":"https://patchwork.libcamera.org/series/4775/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/21831/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/21831/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 C9709C324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  7 Nov 2024 10:25:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 21FA36546E;\n\tThu,  7 Nov 2024 11:25:32 +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 AA7CC65467\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 Nov 2024 11:25:25 +0100 (CET)","from mail.ideasonboard.com\n\t(cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CC7CD792;\n\tThu,  7 Nov 2024 11:25:16 +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=\"Vgh3LcMr\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1730975117;\n\tbh=xErutYYSFE5aZCXFTDbJyYTMpCr/FyXfb7qIk7oPCA4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Vgh3LcMrW1i8hOwmzykMsbMrb0HnDALpUIuLTOYpluRPoe7tq4Hy7JOT7jhzUplpT\n\tN8snvYcO5HOsIqoNpNeOITKk9CPjOQ/1rGVx5Ez7N9q0fYxgIWwQguVDgeRu5KsuNl\n\tF+aKVWSYrRJskGb0fwzIZEjyBEAA2Zno3EGiRfsY=","From":"Daniel Scally <dan.scally@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"mike.rudenko@gmail.com,\n\tDaniel Scally <dan.scally@ideasonboard.com>","Subject":"[PATCH v2 5/6] libcamera: camera_sensor_properties: Add sensor\n\tcontrol delays","Date":"Thu,  7 Nov 2024 10:25:07 +0000","Message-Id":"<20241107102508.48322-6-dan.scally@ideasonboard.com>","X-Mailer":"git-send-email 2.34.1","In-Reply-To":"<20241107102508.48322-1-dan.scally@ideasonboard.com>","References":"<20241107102508.48322-1-dan.scally@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","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":"Add properties covering the sensor control application delays to both\nthe list of control values and the static CameraSensorProperties\ndefinitions. The values used are the defaults that're in use across\nthe library, with deviations from that taken from Raspberry Pi's\nCamHelper class definitions.\n\nSigned-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n---\nChanges in v2:\n\n\t- Rather than adding the delays to the properties ControlList, added a\n\t  new function in CameraSensor that allows PipelineHandlers to retreive\n\t  the delay values.\n\n include/libcamera/internal/camera_sensor.h    |   2 +\n .../internal/camera_sensor_properties.h       |   9 +\n src/libcamera/sensor/camera_sensor.cpp        |  33 ++++\n .../sensor/camera_sensor_properties.cpp       | 167 ++++++++++++++++++\n 4 files changed, 211 insertions(+)","diff":"diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\nindex a42c15fa..cdfbf051 100644\n--- a/include/libcamera/internal/camera_sensor.h\n+++ b/include/libcamera/internal/camera_sensor.h\n@@ -79,6 +79,8 @@ public:\n \t\treturn testPatternModes_;\n \t}\n \tint setTestPatternMode(controls::draft::TestPatternModeEnum mode);\n+\tvoid getSensorDelays(uint8_t &exposureDelay, uint8_t &gainDelay,\n+\t\t\t     uint8_t &vblankDelay, uint8_t &hblankDelay);\n \n protected:\n \tstd::string logPrefix() const override;\ndiff --git a/include/libcamera/internal/camera_sensor_properties.h b/include/libcamera/internal/camera_sensor_properties.h\nindex 480ac121..56d5c15d 100644\n--- a/include/libcamera/internal/camera_sensor_properties.h\n+++ b/include/libcamera/internal/camera_sensor_properties.h\n@@ -10,6 +10,8 @@\n #include <map>\n #include <string>\n \n+#include <stdint.h>\n+\n #include <libcamera/control_ids.h>\n #include <libcamera/geometry.h>\n \n@@ -20,6 +22,13 @@ struct CameraSensorProperties {\n \n \tSize unitCellSize;\n \tstd::map<controls::draft::TestPatternModeEnum, int32_t> testPatternModes;\n+\n+\tstruct {\n+\t\tuint8_t exposureDelay;\n+\t\tuint8_t gainDelay;\n+\t\tuint8_t vblankDelay;\n+\t\tuint8_t hblankDelay;\n+\t} sensorDelays;\n };\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp\nindex 1b224f19..5d26f3df 100644\n--- a/src/libcamera/sensor/camera_sensor.cpp\n+++ b/src/libcamera/sensor/camera_sensor.cpp\n@@ -391,6 +391,39 @@ void CameraSensor::initStaticProperties()\n \tinitTestPatternModes();\n }\n \n+/**\n+ * \\brief Fetch the sensor delay values\n+ * \\param[out] exposureDelay A variable to set the exposure delay to\n+ * \\param[out] gainDelay A variable to set the gain delay to\n+ * \\param[out] vblankDelay A variable to set the vblank delay to\n+ * \\param[out] hblankDelay A variable to set the hblank delay to\n+ *\n+ * This function fills in sensor control delays for pipeline handlers to use to\n+ * inform the DelayedControls. If no static properties are available it fills in\n+ * some widely applicable default values.\n+ */\n+void CameraSensor::getSensorDelays(uint8_t &exposureDelay, uint8_t &gainDelay,\n+\t\t\t\t   uint8_t &vblankDelay, uint8_t &hblankDelay)\n+{\n+\t/*\n+\t * These defaults are applicable to many sensors, however more specific\n+\t * values can be added to the CameraSensorProperties for a sensor if\n+\t * required.\n+\t */\n+\tif (!staticProps_) {\n+\t\texposureDelay = 2;\n+\t\tgainDelay = 1;\n+\t\tvblankDelay = 2;\n+\t\thblankDelay = 2;\n+\t\treturn;\n+\t}\n+\n+\texposureDelay = staticProps_->sensorDelays.exposureDelay;\n+\tgainDelay = staticProps_->sensorDelays.gainDelay;\n+\tvblankDelay = staticProps_->sensorDelays.vblankDelay;\n+\thblankDelay = staticProps_->sensorDelays.hblankDelay;\n+}\n+\n void CameraSensor::initTestPatternModes()\n {\n \tconst auto &v4l2TestPattern = controls().find(V4L2_CID_TEST_PATTERN);\ndiff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp\nindex 6d4136d0..60d59f79 100644\n--- a/src/libcamera/sensor/camera_sensor_properties.cpp\n+++ b/src/libcamera/sensor/camera_sensor_properties.cpp\n@@ -41,6 +41,11 @@ LOG_DEFINE_CATEGORY(CameraSensorProperties)\n  * \\brief Map that associates the TestPattern control value with the indexes of\n  * the corresponding sensor test pattern modes as returned by\n  * V4L2_CID_TEST_PATTERN.\n+ *\n+ * \\var CameraSensorProperties::sensorDelays\n+ * \\brief struct holding the number of frames delay between a control value\n+ * set and taking effect for each of exposure, gain, vertical blanking and\n+ * horizontal blanking.\n  */\n \n /**\n@@ -60,6 +65,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 2 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ar0521\", {\n \t\t\t.unitCellSize = { 2200, 2200 },\n@@ -69,6 +80,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 2 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"hi846\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -87,6 +104,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * 9: \"Resolution Pattern\"\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx214\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -97,6 +120,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },\n \t\t\t\t{ controls::draft::TestPatternModePn9, 4 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx219\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -107,6 +136,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },\n \t\t\t\t{ controls::draft::TestPatternModePn9, 4 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx258\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -117,34 +152,82 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },\n \t\t\t\t{ controls::draft::TestPatternModePn9, 4 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx283\", {\n \t\t\t.unitCellSize = { 2400, 2400 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx290\", {\n \t\t\t.unitCellSize = { 2900, 2900 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx296\", {\n \t\t\t.unitCellSize = { 3450, 3450 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx327\", {\n \t\t\t.unitCellSize = { 2900, 2900 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx335\", {\n \t\t\t.unitCellSize = { 2000, 2000 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx415\", {\n \t\t\t.unitCellSize = { 1450, 1450 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx477\", {\n \t\t\t.unitCellSize = { 1550, 1550 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 3,\n+\t\t\t\t.hblankDelay = 3\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx519\", {\n \t\t\t.unitCellSize = { 1220, 1220 },\n@@ -157,6 +240,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * these two patterns do not comply with MIPI CCS v1.1 (Section 10.1).\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 3,\n+\t\t\t\t.hblankDelay = 3\n+\t\t\t},\n \t\t} },\n \t\t{ \"imx708\", {\n \t\t\t.unitCellSize = { 1400, 1400 },\n@@ -167,6 +256,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeColorBarsFadeToGray, 3 },\n \t\t\t\t{ controls::draft::TestPatternModePn9, 4 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 3,\n+\t\t\t\t.hblankDelay = 3\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov2685\", {\n \t\t\t.unitCellSize = { 1750, 1750 },\n@@ -181,6 +276,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * 5: \"Color Square\"\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov2740\", {\n \t\t\t.unitCellSize = { 1400, 1400 },\n@@ -188,6 +289,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeOff, 0 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 1},\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov4689\", {\n \t\t\t.unitCellSize = { 2000, 2000 },\n@@ -201,6 +308,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * colorBarType2 and colorBarType3.\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov5640\", {\n \t\t\t.unitCellSize = { 1400, 1400 },\n@@ -208,10 +321,22 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeOff, 0 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 1 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov5647\", {\n \t\t\t.unitCellSize = { 1400, 1400 },\n \t\t\t.testPatternModes = {},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov5670\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -219,6 +344,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeOff, 0 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 1 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov5675\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -226,6 +357,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeOff, 0 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 1 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov5693\", {\n \t\t\t.unitCellSize = { 1400, 1400 },\n@@ -238,6 +375,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * Rolling Bar\".\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov64a40\", {\n \t\t\t.unitCellSize = { 1008, 1008 },\n@@ -251,6 +394,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * 4: \"Vertical Color Bar Type 4\"\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 2,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov8858\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -264,6 +413,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * 4: \"Vertical Color Bar Type 4\"\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov8865\", {\n \t\t\t.unitCellSize = { 1400, 1400 },\n@@ -278,6 +433,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t * 5: \"Color squares with rolling bar\"\n \t\t\t\t */\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t\t{ \"ov13858\", {\n \t\t\t.unitCellSize = { 1120, 1120 },\n@@ -285,6 +446,12 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen\n \t\t\t\t{ controls::draft::TestPatternModeOff, 0 },\n \t\t\t\t{ controls::draft::TestPatternModeColorBars, 1 },\n \t\t\t},\n+\t\t\t.sensorDelays = {\n+\t\t\t\t.exposureDelay = 2,\n+\t\t\t\t.gainDelay = 1,\n+\t\t\t\t.vblankDelay = 2,\n+\t\t\t\t.hblankDelay = 2\n+\t\t\t},\n \t\t} },\n \t};\n \n","prefixes":["v2","5/6"]}