{"id":21708,"url":"https://patchwork.libcamera.org/api/1.1/patches/21708/?format=json","web_url":"https://patchwork.libcamera.org/patch/21708/","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":"<20241020152821.240726-4-mike.rudenko@gmail.com>","date":"2024-10-20T15:28:20","name":"[v2,3/4] rkisp1: synchronize sensor controls with IPA","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"a7bcac162ae3fa3c787c519f6019f189e9ab8583","submitter":{"id":146,"url":"https://patchwork.libcamera.org/api/1.1/people/146/?format=json","name":"Mikhail Rudenko","email":"mike.rudenko@gmail.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/21708/mbox/","series":[{"id":4728,"url":"https://patchwork.libcamera.org/api/1.1/series/4728/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4728","date":"2024-10-20T15:28:17","name":"Reduce rkisp1 flicker on first start","version":2,"mbox":"https://patchwork.libcamera.org/series/4728/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/21708/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/21708/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 259DCC3304\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 20 Oct 2024 15:28:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AEC8A65391;\n\tSun, 20 Oct 2024 17:28:49 +0200 (CEST)","from mail-lf1-x12e.google.com (mail-lf1-x12e.google.com\n\t[IPv6:2a00:1450:4864:20::12e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CAD856538D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 20 Oct 2024 17:28:40 +0200 (CEST)","by mail-lf1-x12e.google.com with SMTP id\n\t2adb3069b0e04-53a0c160b94so1523389e87.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 20 Oct 2024 08:28:40 -0700 (PDT)","from localhost.localdomain\n\t(static.40.223.216.95.clients.your-server.de. [95.216.223.40])\n\tby smtp.gmail.com with ESMTPSA id\n\t2adb3069b0e04-53a223efad4sm249040e87.67.2024.10.20.08.28.38\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 20 Oct 2024 08:28:38 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"Q71tmijn\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20230601; t=1729438119; x=1730042919;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=RZA4Fbi06ANAkJZDjKo3YmQxc3CPBlt20nPCs8P4ek8=;\n\tb=Q71tmijnrj+BNqzH4llfeK46Q9vjNzETTJ5n2GTZOudcG/8X6rpafvu0/iABVsG5zV\n\tkN23LgRGO3kK2xZ/yK+lQ1Ht5mYBD4gMDB/NuzktAO1yQcjrVRzK9kOzT7ZZJCeaIKq0\n\toLmFAGgZHw2GivIMeSIz0IPfUPpvtr4Zgam2XE0u2ZAyCDRqbxdVndl4z0hFHI3AsKKb\n\tjtqsAd+ITWc3H+uSo1Jqayd7C8Mnr4JEQqGhKdQocm9cZhz0SecWhaWbdIcmDvMgJdN8\n\tQBoeLameOIsbDQI/gKLm24nYjxGWvkRArMKCsG42M5v2+HvEu05GZlaoVh+6Ir4VMU9P\n\t/Cmg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1729438119; x=1730042919;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=RZA4Fbi06ANAkJZDjKo3YmQxc3CPBlt20nPCs8P4ek8=;\n\tb=k2fccAxVNgdrV+K8sXqxl5+q02sQO3IJfADh4uFV+2HrbbFRBg0O5QuOAJABdX0q88\n\tUn0uQsTdbtdpJQbOvofWv4eCafVUA4y+PrGOf+lx10FwqIPjoKZkGJUaidwsgm1FvuSC\n\tdQg+uHy2Em7aCF3CIH5XIqvszj4bZuFY3Vwz2dJnpgZWFVJiao0eoQaNskvpapyeeUwA\n\tyFlNpixBQ2wDEA57NN327s96oeCjQsN3gDG3br0kT0L4Cr1qVVBtPZijtyzKElBl+pvA\n\tGcmcxryIyYTANBagHPIsG4kvRVW8HLauixmMXKxbMF0WY5f31DfS7XrlwomKvXkRMIn2\n\tM5hg==","X-Gm-Message-State":"AOJu0YzW/CNgMd7Sj2yFKcnXWJD4YDb9S8LFCQAzhez1OvbA41jIvRxH\n\tF5eZoEbFGLQFmuDl8sME7IHrro1Bs2OkAGv6qqdzN+lcGHvy+Thg2Xu1sQ==","X-Google-Smtp-Source":"AGHT+IGKQ6bO1b06MR/GAadxCz0WBSNE02p8qQwapqRscOpQKcqikdpN0SrwnLDCaHGqMGWbHFDlOA==","X-Received":"by 2002:a05:6512:1582:b0:539:9f3c:3bfd with SMTP id\n\t2adb3069b0e04-53a154ab92amr4950134e87.58.1729438118613; \n\tSun, 20 Oct 2024 08:28:38 -0700 (PDT)","From":"Mikhail Rudenko <mike.rudenko@gmail.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tMikhail Rudenko <mike.rudenko@gmail.com>","Subject":"[PATCH v2 3/4] rkisp1: synchronize sensor controls with IPA","Date":"Sun, 20 Oct 2024 18:28:20 +0300","Message-ID":"<20241020152821.240726-4-mike.rudenko@gmail.com>","X-Mailer":"git-send-email 2.46.0","In-Reply-To":"<20241020152821.240726-1-mike.rudenko@gmail.com>","References":"<20241020152821.240726-1-mike.rudenko@gmail.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":"When IPA AGC active state is initialized in configure() method, it may\nfall out of sync with actual sensor controls and initial values in the\ndelayed controls. Fix this by sending updated controls to the pipeline\nhandler on first start() after configure(). Also reset delayedCtrls_\non start to make it capture the updated control values.\n\nSigned-off-by: Mikhail Rudenko <mike.rudenko@gmail.com>\n---\n include/libcamera/ipa/rkisp1.mojom       |  2 +-\n src/ipa/rkisp1/ipa_context.h             |  2 ++\n src/ipa/rkisp1/rkisp1.cpp                | 19 +++++++++++++++----\n src/libcamera/pipeline/rkisp1/rkisp1.cpp |  6 +++++-\n 4 files changed, 23 insertions(+), 6 deletions(-)","diff":"diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom\nindex 80d54a03..09900742 100644\n--- a/include/libcamera/ipa/rkisp1.mojom\n+++ b/include/libcamera/ipa/rkisp1.mojom\n@@ -20,7 +20,7 @@ interface IPARkISP1Interface {\n \t     libcamera.IPACameraSensorInfo sensorInfo,\n \t     libcamera.ControlInfoMap sensorControls)\n \t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls);\n-\tstart() => (int32 ret);\n+\tstart() => (int32 ret, libcamera.ControlList sensorControls);\n \tstop();\n \n \tconfigure(IPAConfigInfo configInfo,\ndiff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\nindex e274d9b0..e07a5cdb 100644\n--- a/src/ipa/rkisp1/ipa_context.h\n+++ b/src/ipa/rkisp1/ipa_context.h\n@@ -191,6 +191,8 @@ struct IPAContext {\n \n \t/* Interface to the Camera Helper */\n \tstd::unique_ptr<CameraSensorHelper> camHelper;\n+\n+\tbool sensorControlsNeedSync;\n };\n \n } /* namespace ipa::rkisp1 */\ndiff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\nindex 9e161cab..680a7eee 100644\n--- a/src/ipa/rkisp1/rkisp1.cpp\n+++ b/src/ipa/rkisp1/rkisp1.cpp\n@@ -55,7 +55,7 @@ public:\n \t\t const IPACameraSensorInfo &sensorInfo,\n \t\t const ControlInfoMap &sensorControls,\n \t\t ControlInfoMap *ipaControls) override;\n-\tint start() override;\n+\tint start(ControlList *sensorControls) override;\n \tvoid stop() override;\n \n \tint configure(const IPAConfigInfo &ipaConfig,\n@@ -124,7 +124,7 @@ const ControlInfoMap::Map rkisp1Controls{\n } /* namespace */\n \n IPARkISP1::IPARkISP1()\n-\t: context_({ {}, {}, {}, {}, { kMaxFrameContexts }, {}, {} })\n+\t: context_({ {}, {}, {}, {}, { kMaxFrameContexts }, {}, {}, false })\n {\n }\n \n@@ -208,10 +208,19 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n \treturn 0;\n }\n \n-int IPARkISP1::start()\n+int IPARkISP1::start(ControlList *sensorControls)\n {\n-\tsetControls(0);\n+\tif (context_.sensorControlsNeedSync) {\n+\t\tconst auto &agc = context_.activeState.agc;\n+\t\tuint32_t exposure = agc.automatic.exposure;\n+\t\tuint32_t gain = context_.camHelper->gainCode(agc.automatic.gain);\n \n+\t\t*sensorControls = ControlList{ sensorControls_ };\n+\t\tsensorControls->set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure));\n+\t\tsensorControls->set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain));\n+\n+\t\tcontext_.sensorControlsNeedSync = false;\n+\t}\n \treturn 0;\n }\n \n@@ -290,6 +299,8 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,\n \t\t\treturn ret;\n \t}\n \n+\tcontext_.sensorControlsNeedSync = true;\n+\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 42961c12..18d98547 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -943,6 +943,7 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL\n {\n \tRkISP1CameraData *data = cameraData(camera);\n \tutils::ScopeExitActions actions;\n+\tControlList sensorControls;\n \tint ret;\n \n \t/* Allocate buffers for internal pipeline usage. */\n@@ -951,7 +952,7 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL\n \t\treturn ret;\n \tactions += [&]() { freeBuffers(camera); };\n \n-\tret = data->ipa_->start();\n+\tret = data->ipa_->start(&sensorControls);\n \tif (ret) {\n \t\tLOG(RkISP1, Error)\n \t\t\t<< \"Failed to start IPA \" << camera->id();\n@@ -961,6 +962,9 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL\n \n \tdata->frame_ = 0;\n \n+\tdata->sensor_->setControls(&sensorControls);\n+\tdata->delayedCtrls_->reset();\n+\n \tif (!isRaw_) {\n \t\tret = param_->streamOn();\n \t\tif (ret) {\n","prefixes":["v2","3/4"]}