Show a patch.

GET /api/1.1/patches/24947/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 24947,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/24947/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/24947/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20251102-rkisp1-vblank-v1-1-d2d6458696aa@ideasonboard.com>",
    "date": "2025-11-02T19:19:52",
    "name": "libcamera: delayed_controls: Make VBLANK priority by default",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "6b66f48d992e0ceb9c371df37fa15a8cae2ad519",
    "submitter": {
        "id": 143,
        "url": "https://patchwork.libcamera.org/api/1.1/people/143/?format=api",
        "name": "Jacopo Mondi",
        "email": "jacopo.mondi@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/24947/mbox/",
    "series": [
        {
            "id": 5553,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5553/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5553",
            "date": "2025-11-02T19:19:52",
            "name": "libcamera: delayed_controls: Make VBLANK priority by default",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5553/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/24947/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/24947/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 044D7BDE4C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun,  2 Nov 2025 19:20:04 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E4E8F606E6;\n\tSun,  2 Nov 2025 20:20:03 +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 2A318606E6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun,  2 Nov 2025 20:20:02 +0100 (CET)",
            "from [100.93.44.16] (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9FE928D4;\n\tSun,  2 Nov 2025 20:18:09 +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=\"rUEt2Gcj\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1762111089;\n\tbh=M21vn7FHVpALK/Varxs4WBCQvWvgLRxqZat6h2i57YQ=;\n\th=From:Date:Subject:To:Cc:From;\n\tb=rUEt2GcjG4DmHMC1apCaKANGCAZqpX40QMViPHsxSufGGuyB6dZSgDVIfaRnR18N3\n\td8fgQRoprplvAR1AE1njtGL5MuOu0FM2TGDii5FjnHa2t2khUT633I9v5Ssvtw2xp9\n\tC+CRrtGzmX96s9tUM4BttVZThllPEtKve08pMDf4=",
        "From": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>",
        "Date": "Sun, 02 Nov 2025 20:19:52 +0100",
        "Subject": "[PATCH] libcamera: delayed_controls: Make VBLANK priority by default",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "7bit",
        "Message-Id": "<20251102-rkisp1-vblank-v1-1-d2d6458696aa@ideasonboard.com>",
        "X-B4-Tracking": "v=1; b=H4sIANeuB2kC/x3MQQqAIBBA0avIrBNUzKKrRAutqQbDQkEC8e5Jy\n\t7f4v0DCSJhgYgUiZkp0hwbZMVhPGw7ktDWDEqqXUigePaVH8uwuGzx3VolRG22cHaA1T8Sd3v8\n\t3L7V+WKuUoV8AAAA=",
        "X-Change-ID": "20251102-rkisp1-vblank-ba2084646ba7",
        "To": "libcamera-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=12042;\n\ti=jacopo.mondi@ideasonboard.com; h=from:subject:message-id;\n\tbh=M21vn7FHVpALK/Varxs4WBCQvWvgLRxqZat6h2i57YQ=;\n\tb=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpB67hXV9cNYGIOuYUaLAE6L27P62psKDKJ3CUF\n\tJUKaO4udAeJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaQeu4QAKCRByNAaPFqFW\n\tPNqSEACN/6qA6h0tmJcLd81EdT3yxB3xxALLTF6BZh0nDzypPMJqwIgSacgM1MwZGawPaXPvbp1\n\thkliBqTKgVKg5MD8KoBEKrBuKYYYM3vo7FuAnqtIHLmzfq3NNDSqYqVu6wwiOhdAzwACEULa8yP\n\tsnjmlwZDSmezHyjFYPsjQLEvmHM6UlIaEspOwOGvfPPF+Vq+1YMIl/Suvt/zRdbn15VxZ4ClecM\n\tcqobFuH963I28+LcBRG9FBVgDU5kG8CiUIIvJHKN2hYCh8NJMvjTSHk8CBl5Xa3icKWUkO3WLwb\n\tHecF5EXNBaCGcoUUdQj6sG3JcQtz+09bYnnd40XEsGNSz4mxXWEGLwjaMdzOrmjM5lmDL3YTaSY\n\tXBsZmgDU6ECrSNRVIIyTa1DfeLxQwkj/TLIjmGePlUW27EjDYZR4UPH1tD5clpmzJ4H40Rjtg4S\n\tVsUBjxGQV2vRBOJWsGJx8oLuZlc2E8nP0kLIPM4Qs1Hxzi+1q9WmeHATwYBpfIUJF+nDm+SgkSy\n\t0y5XB82rV3DWmVIvgLQqAZDZsrAPYlOMeeVQTNhPpj3Jt8mpvqMhgBSrS84PKo91W//Fe+wlb8K\n\tjTKNtFN38yjclWVMfvzdhExqemUKM+kNr7RgBH4yGjPXgd0tgzSLV8qY9JZiB6Es445zpNVfCDd\n\tFb/M7OQAujQVYCw==",
        "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": "The DelayedControls class works around a limitation of the V4L2\ncontrols API by assigning to controls that modify the limits of\nother controls a 'priority' flag.\n\n'Priority' controls are written to the device before others\nto make sure the limits of dependent controls are correctly\nupdated.\n\nA typical example of a priority control is VBLANK, whose value changes\nthe limits of the EXPOSURE control. This doesn't apply to a specific\nhardware platform but to all V4L2 sensors.\n\nIt's currently up to users of delayed controls to apply to\neach control the correct flag by populating a ControlParams instance.\nHowever, this is error prone, and the RkISP1 pipeline handler\nwrongly sets the VBLANK priority to false.\n\nInstead of simply fixing the RkISP1 implementation, change how the\npriorty flag is set, by making DelayedControls automatically flag\nVBLANK as priority.\n\nThis limits what controls the pipelines can set as priority, but so\nfar only VBLANK needs that flag to be set.\n\nSplit the ControlParams type into an external one that only associates\ndelays to control ids and an internal one that is populated at class\ncreation time.\n\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n---\nTested on rkisp1:\ndelayed_controls.cpp:100 Set a delay of 2 and priority write flag 1 for Vertical Blanking\n---\n include/libcamera/internal/delayed_controls.h | 14 ++++++---\n src/libcamera/delayed_controls.cpp            | 41 +++++++++++++--------------\n src/libcamera/pipeline/ipu3/ipu3.cpp          |  6 ++--\n src/libcamera/pipeline/mali-c55/mali-c55.cpp  |  6 ++--\n src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 10 +++----\n src/libcamera/pipeline/simple/simple.cpp      |  6 ++--\n test/delayed_controls.cpp                     | 20 ++++++-------\n 7 files changed, 53 insertions(+), 50 deletions(-)\n\n\n---\nbase-commit: b1f09c013a01a82c739f0e30b71fd8d000ef5655\nchange-id: 20251102-rkisp1-vblank-ba2084646ba7\n\nBest regards,",
    "diff": "diff --git a/include/libcamera/internal/delayed_controls.h b/include/libcamera/internal/delayed_controls.h\nindex b64d8bba7cf73e10491d13d64bb4b3f7db80681b..c966fbedb1b832bcb50d0931204a011a334e6514 100644\n--- a/include/libcamera/internal/delayed_controls.h\n+++ b/include/libcamera/internal/delayed_controls.h\n@@ -21,13 +21,14 @@ class V4L2Device;\n class DelayedControls : public Object\n {\n public:\n-\tstruct ControlParams {\n+\tstruct Controls {\n+\t\tuint32_t id;\n \t\tunsigned int delay;\n-\t\tbool priorityWrite;\n \t};\n \n-\tDelayedControls(V4L2Device *device,\n-\t\t\tconst std::unordered_map<uint32_t, ControlParams> &controlParams);\n+\tusing Params = std::vector<Controls>;\n+\n+\tDelayedControls(V4L2Device *device, const Params &controlParams);\n \n \tvoid reset();\n \n@@ -37,6 +38,11 @@ public:\n \tvoid applyControls(uint32_t sequence);\n \n private:\n+\tstruct ControlParams {\n+\t\tunsigned int delay;\n+\t\tbool priorityWrite;\n+\t};\n+\n \tclass Info : public ControlValue\n \t{\n \tpublic:\ndiff --git a/src/libcamera/delayed_controls.cpp b/src/libcamera/delayed_controls.cpp\nindex 94d0a575b01b72416bdf05ea595f1c8e0ab6082c..f3092481ed804077dedd2cce0cda72f22d3563f8 100644\n--- a/src/libcamera/delayed_controls.cpp\n+++ b/src/libcamera/delayed_controls.cpp\n@@ -39,40 +39,35 @@ LOG_DEFINE_CATEGORY(DelayedControls)\n  */\n \n /**\n- * \\struct DelayedControls::ControlParams\n- * \\brief Parameters associated with controls handled by the \\a DelayedControls\n+ * \\struct DelayedControls::Controls\n+ * \\brief Delays associated with controls handled by the \\a DelayedControls\n  * helper class\n  *\n- * \\var ControlParams::delay\n+ * \\var Controls::id\n+ * \\brief The control id\n+ *\n+ * \\var Controls::delay\n  * \\brief Frame delay from setting the control on a sensor device to when it is\n  * consumed during framing.\n- *\n- * \\var ControlParams::priorityWrite\n- * \\brief Flag to indicate that this control must be applied ahead of, and\n- * separately from the other controls.\n- *\n- * Typically set for the \\a V4L2_CID_VBLANK control so that the device driver\n- * does not reject \\a V4L2_CID_EXPOSURE control values that may be outside of\n- * the existing vertical blanking specified bounds, but are within the new\n- * blanking bounds.\n+ */\n+\n+/**\n+ * \\typedef DelayedControls::Params\n+ * \\brief Vector of DelayedControls::Controls\n  */\n \n /**\n  * \\brief Construct a DelayedControls instance\n  * \\param[in] device The V4L2 device the controls have to be applied to\n- * \\param[in] controlParams Map of the numerical V4L2 control ids to their\n- * associated control parameters.\n+ * \\param[in] controlParams Control ids and delays\n  *\n- * The control parameters comprise of delays (in frames) and a priority write\n- * flag. If this flag is set, the relevant control is written separately from,\n- * and ahead of the rest of the batched controls.\n+ * The control parameters associate a delay (in frames) to control ids.\n  *\n  * Only controls specified in \\a controlParams are handled. If it's desired to\n  * mix delayed controls and controls that take effect immediately the immediate\n  * controls must be listed in the \\a controlParams map with a delay value of 0.\n  */\n-DelayedControls::DelayedControls(V4L2Device *device,\n-\t\t\t\t const std::unordered_map<uint32_t, ControlParams> &controlParams)\n+DelayedControls::DelayedControls(V4L2Device *device, const Params &controlParams)\n \t: device_(device), maxDelay_(0)\n {\n \tconst ControlInfoMap &controls = device_->controls();\n@@ -82,11 +77,11 @@ DelayedControls::DelayedControls(V4L2Device *device,\n \t * device.\n \t */\n \tfor (auto const &param : controlParams) {\n-\t\tauto it = controls.find(param.first);\n+\t\tauto it = controls.find(param.id);\n \t\tif (it == controls.end()) {\n \t\t\tLOG(DelayedControls, Error)\n \t\t\t\t<< \"Delay request for control id \"\n-\t\t\t\t<< utils::hex(param.first)\n+\t\t\t\t<< utils::hex(param.id)\n \t\t\t\t<< \" but control is not exposed by device \"\n \t\t\t\t<< device_->deviceNode();\n \t\t\tcontinue;\n@@ -94,7 +89,9 @@ DelayedControls::DelayedControls(V4L2Device *device,\n \n \t\tconst ControlId *id = it->first;\n \n-\t\tcontrolParams_[id] = param.second;\n+\t\tcontrolParams_[id].delay = param.delay;\n+\t\tif (param.id == V4L2_CID_VBLANK)\n+\t\t\tcontrolParams_[id].priorityWrite = true;\n \n \t\tLOG(DelayedControls, Debug)\n \t\t\t<< \"Set a delay of \" << controlParams_[id].delay\ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex d6b7edcb5a7f9fcb4083d4105a193978e265ef67..0d6d2e30065e03defbc47ae45fd67a22f6bff25a 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -1083,9 +1083,9 @@ int PipelineHandlerIPU3::registerCameras()\n \t\t\tcontinue;\n \n \t\tconst CameraSensorProperties::SensorDelays &delays = cio2->sensor()->sensorDelays();\n-\t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n-\t\t\t{ V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n-\t\t\t{ V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n+\t\tDelayedControls::Params params = {\n+\t\t\t{ V4L2_CID_ANALOGUE_GAIN, delays.gainDelay },\n+\t\t\t{ V4L2_CID_EXPOSURE, delays.exposureDelay },\n \t\t};\n \n \t\tdata->delayedCtrls_ =\ndiff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\nindex 38bdc6138ed167a2c05f43ca30e60ed549fd953c..85f87ab979b23117c47bda4ca9418e4cb50c878d 100644\n--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n@@ -1607,9 +1607,9 @@ bool PipelineHandlerMaliC55::registerSensorCamera(MediaLink *ispLink)\n \t\tdata->properties_ = data->sensor_->properties();\n \n \t\tconst CameraSensorProperties::SensorDelays &delays = data->sensor_->sensorDelays();\n-\t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n-\t\t\t{ V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n-\t\t\t{ V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n+\t\tDelayedControls::Params params = {\n+\t\t\t{ V4L2_CID_ANALOGUE_GAIN, delays.gainDelay },\n+\t\t\t{ V4L2_CID_EXPOSURE, delays.exposureDelay },\n \t\t};\n \n \t\tdata->delayedCtrls_ =\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex ecd13831539fdf5cb79da2ea4b33a353514328ae..525c8be6f19282e96df47ead602b67f6a74a8f96 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -1345,12 +1345,12 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n \tscalerMaxCrop_ = Rectangle(data->sensor_->resolution());\n \n \tconst CameraSensorProperties::SensorDelays &delays = data->sensor_->sensorDelays();\n-\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n-\t\t{ V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n-\t\t{ V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n-\t\t{ V4L2_CID_VBLANK, { delays.vblankDelay, false } },\n-\t};\n+\tDelayedControls::Params params = {\n+\t\t{ V4L2_CID_ANALOGUE_GAIN, delays.gainDelay },\n+\t\t{ V4L2_CID_EXPOSURE, delays.exposureDelay },\n+\t\t{ V4L2_CID_VBLANK, delays.vblankDelay },\n \n+\t};\n \tdata->delayedCtrls_ =\n \t\tstd::make_unique<DelayedControls>(data->sensor_->device(),\n \t\t\t\t\t\t  params);\ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex 91715b7f8afd2058c42856ef38144847f81bd7b0..617ffa8eef490a1301920b3f30ab1f13b3ff62ff 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -553,9 +553,9 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,\n \t\treturn;\n \n \tconst CameraSensorProperties::SensorDelays &delays = sensor_->sensorDelays();\n-\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n-\t\t{ V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n-\t\t{ V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n+\tDelayedControls::Params params = {\n+\t\t{ V4L2_CID_ANALOGUE_GAIN, delays.gainDelay },\n+\t\t{ V4L2_CID_EXPOSURE, delays.exposureDelay },\n \t};\n \tdelayedCtrls_ = std::make_unique<DelayedControls>(sensor_->device(), params);\n \ndiff --git a/test/delayed_controls.cpp b/test/delayed_controls.cpp\nindex 7bd30e7aead87f9350f1e0b48203f32804cfeef0..88425abc829a83ab7212775a8cab2165692a0a52 100644\n--- a/test/delayed_controls.cpp\n+++ b/test/delayed_controls.cpp\n@@ -72,8 +72,8 @@ protected:\n \n \tint singleControlNoDelay()\n \t{\n-\t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> delays = {\n-\t\t\t{ V4L2_CID_BRIGHTNESS, { 0, false } },\n+\t\tDelayedControls::Params delays = {\n+\t\t\t{ V4L2_CID_BRIGHTNESS, 0 },\n \t\t};\n \t\tstd::unique_ptr<DelayedControls> delayed =\n \t\t\tstd::make_unique<DelayedControls>(dev_.get(), delays);\n@@ -113,8 +113,8 @@ protected:\n \n \tint singleControlWithDelay()\n \t{\n-\t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> delays = {\n-\t\t\t{ V4L2_CID_BRIGHTNESS, { 1, false } },\n+\t\tDelayedControls::Params delays = {\n+\t\t\t{ V4L2_CID_BRIGHTNESS, 1 },\n \t\t};\n \t\tstd::unique_ptr<DelayedControls> delayed =\n \t\t\tstd::make_unique<DelayedControls>(dev_.get(), delays);\n@@ -159,9 +159,9 @@ protected:\n \t{\n \t\tstatic const unsigned int maxDelay = 2;\n \n-\t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> delays = {\n-\t\t\t{ V4L2_CID_BRIGHTNESS, { 1, false } },\n-\t\t\t{ V4L2_CID_CONTRAST, { maxDelay, false } },\n+\t\tDelayedControls::Params delays = {\n+\t\t\t{ V4L2_CID_BRIGHTNESS, 1 },\n+\t\t\t{ V4L2_CID_CONTRAST, maxDelay },\n \t\t};\n \t\tstd::unique_ptr<DelayedControls> delayed =\n \t\t\tstd::make_unique<DelayedControls>(dev_.get(), delays);\n@@ -210,9 +210,9 @@ protected:\n \t{\n \t\tstatic const unsigned int maxDelay = 2;\n \n-\t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> delays = {\n-\t\t\t{ V4L2_CID_BRIGHTNESS, { 1, false } },\n-\t\t\t{ V4L2_CID_CONTRAST, { maxDelay, false } }\n+\t\tDelayedControls::Params delays = {\n+\t\t\t{ V4L2_CID_BRIGHTNESS, 1 },\n+\t\t\t{ V4L2_CID_CONTRAST, maxDelay }\n \t\t};\n \t\tstd::unique_ptr<DelayedControls> delayed =\n \t\t\tstd::make_unique<DelayedControls>(dev_.get(), delays);\n",
    "prefixes": []
}