[{"id":34233,"web_url":"https://patchwork.libcamera.org/comment/34233/","msgid":"<174716324176.233090.18356144490810947936@pyrite.rasen.tech>","date":"2025-05-13T19:07:21","subject":"Re: [PATCH] [RFC] libcamera: pipeline: Add h/v blanking delays","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Kieran Bingham (2025-05-13 19:43:12)\n> The HBLANK and VBLANK control delays are not being accounted for in all\n> of the libipa platforms. Update their delayed controls instantiation\n> accordingly.\n\nI thought hblank was a generally a read-only control?\n\n> \n> In particular, update the RKISP1 VBLANK control delay to be marked as a\n> priority control as well as setting the correct delay to align with the\n> existing Raspberry Pi implementation.\n\nGiven that the priorityWrite docs says \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\nI suppose we do want this.\n\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n> \n> Marking this as RFC because I haven't tested this or explored it yet -\n> but as I was reviewing other parts of the code base - I noted that these\n> are inconsistent across pipeline handlers - so lets figure out why and\n> make sure all the pipeline handlers operate in the same way where\n> possible.\n> \n>  src/libcamera/pipeline/ipu3/ipu3.cpp         | 2 ++\n>  src/libcamera/pipeline/mali-c55/mali-c55.cpp | 2 ++\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 3 ++-\n>  src/libcamera/pipeline/simple/simple.cpp     | 2 ++\n>  4 files changed, 8 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index e31e3879dcc9..4cec22b01940 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -1082,6 +1082,8 @@ int PipelineHandlerIPU3::registerCameras()\n>                 std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n>                         { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n>                         { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> +                       { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> +                       { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n>                 };\n>  \n>                 data->delayedCtrls_ =\n> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> index a05e11fccf8d..7d052263b34d 100644\n> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> @@ -1607,6 +1607,8 @@ bool PipelineHandlerMaliC55::registerSensorCamera(MediaLink *ispLink)\n>                 std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n>                         { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n>                         { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> +                       { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> +                       { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n>                 };\n>  \n>                 data->delayedCtrls_ =\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 52633fe3cb85..6c5b81b9a2ba 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -1325,7 +1325,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n>         std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n>                 { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n>                 { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> -               { V4L2_CID_VBLANK, { 1, false } },\n\n(This probably won't apply upstream as it was recently fixed to\n{ V4L2_CID_VBLANK, { delays.vblankDelay, false } }, )\n\n\nPaul\n\n> +               { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> +               { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n>         };\n>  \n>         data->delayedCtrls_ =\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index efb07051b175..fc88efc7a716 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -546,6 +546,8 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,\n>         std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n>                 { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n>                 { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> +               { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> +               { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n>         };\n>         delayedCtrls_ = std::make_unique<DelayedControls>(sensor_->device(), params);\n>  \n> -- \n> 2.49.0\n>","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 96A30C3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 13 May 2025 19:07:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 769DA68B64;\n\tTue, 13 May 2025 21:07:25 +0200 (CEST)","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 5B09F68B40\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 May 2025 21:07:24 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2001:861:3a80:3300:4f2f:8c2c:b3ef:17d4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 546CA1D5;\n\tTue, 13 May 2025 21:07:08 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Luge9HSX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1747163228;\n\tbh=bUSEzAIgr/4ifYEYL5fGO5x+e44x724J4x9mJeEr40k=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Luge9HSX2gPEOpGqaq9j9zQB+EjdKiRZY8XEBlYD4joUmlirs5RWwnM5yz0dQI8nA\n\t1TAjHAeSIOnk0J33uudQPFgTzdbAEg4whD45Y9ySMFyhCJul6ar99K4gStOBknzq2/\n\tHkav8oeCXF/bjf+Jlc/8yPNTR9Skxt/Vpy+rrgCc=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250513174312.106676-1-kieran.bingham@ideasonboard.com>","References":"<20250513174312.106676-1-kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH] [RFC] libcamera: pipeline: Add h/v blanking delays","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Date":"Tue, 13 May 2025 21:07:21 +0200","Message-ID":"<174716324176.233090.18356144490810947936@pyrite.rasen.tech>","User-Agent":"alot/0.0.0","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>"}},{"id":34234,"web_url":"https://patchwork.libcamera.org/comment/34234/","msgid":"<174717374305.636336.16897441475602401771@ping.linuxembedded.co.uk>","date":"2025-05-13T22:02:23","subject":"Re: [PATCH] [RFC] libcamera: pipeline: Add h/v blanking delays","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Paul Elder (2025-05-13 20:07:21)\n> Quoting Kieran Bingham (2025-05-13 19:43:12)\n> > The HBLANK and VBLANK control delays are not being accounted for in all\n> > of the libipa platforms. Update their delayed controls instantiation\n> > accordingly.\n> \n> I thought hblank was a generally a read-only control?\n\nGenerally perhaps - but not always - it can be a read-only or a\nwriteable control for devices that can set it. So we should consider it\nwhen possible. It will give a better configuration range on exposure and\nframe duration if we have sensors with hblank controls.\n\nBut yes, some sensors are read only here.\n\n> > In particular, update the RKISP1 VBLANK control delay to be marked as a\n> > priority control as well as setting the correct delay to align with the\n> > existing Raspberry Pi implementation.\n> \n> Given that the priorityWrite docs says \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> I suppose we do want this.\n> \n> > \n> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > ---\n> > \n> > Marking this as RFC because I haven't tested this or explored it yet -\n> > but as I was reviewing other parts of the code base - I noted that these\n> > are inconsistent across pipeline handlers - so lets figure out why and\n> > make sure all the pipeline handlers operate in the same way where\n> > possible.\n> > \n> >  src/libcamera/pipeline/ipu3/ipu3.cpp         | 2 ++\n> >  src/libcamera/pipeline/mali-c55/mali-c55.cpp | 2 ++\n> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 3 ++-\n> >  src/libcamera/pipeline/simple/simple.cpp     | 2 ++\n> >  4 files changed, 8 insertions(+), 1 deletion(-)\n> > \n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index e31e3879dcc9..4cec22b01940 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -1082,6 +1082,8 @@ int PipelineHandlerIPU3::registerCameras()\n> >                 std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> >                         { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> >                         { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > +                       { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > +                       { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> >                 };\n> >  \n> >                 data->delayedCtrls_ =\n> > diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> > index a05e11fccf8d..7d052263b34d 100644\n> > --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> > +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> > @@ -1607,6 +1607,8 @@ bool PipelineHandlerMaliC55::registerSensorCamera(MediaLink *ispLink)\n> >                 std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> >                         { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> >                         { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > +                       { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > +                       { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> >                 };\n> >  \n> >                 data->delayedCtrls_ =\n> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > index 52633fe3cb85..6c5b81b9a2ba 100644\n> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > @@ -1325,7 +1325,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n> >         std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> >                 { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> >                 { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > -               { V4L2_CID_VBLANK, { 1, false } },\n> \n> (This probably won't apply upstream as it was recently fixed to\n> { V4L2_CID_VBLANK, { delays.vblankDelay, false } }, )\n> \n\nOoops - I hadn't realised I wasn't on a mainline branch...\n\nSo I'll rebase and update - but seems like it is the right thing to do\nfor each pipeline ... which makes me wonder if we should just put a\nhelper somewhere common (V4L2Device given it's V4L2Specific? or pipeline\nhandler base, or common utils ?) that can parse the delayed controls\ndelays in the same way for each...\n\n> \n> Paul\n> \n> > +               { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > +               { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> >         };\n> >  \n> >         data->delayedCtrls_ =\n> > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> > index efb07051b175..fc88efc7a716 100644\n> > --- a/src/libcamera/pipeline/simple/simple.cpp\n> > +++ b/src/libcamera/pipeline/simple/simple.cpp\n> > @@ -546,6 +546,8 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,\n> >         std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> >                 { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> >                 { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > +               { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > +               { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> >         };\n> >         delayedCtrls_ = std::make_unique<DelayedControls>(sensor_->device(), params);\n> >  \n> > -- \n> > 2.49.0\n> >","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 28EE3C3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 13 May 2025 22:02:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 22C2768B64;\n\tWed, 14 May 2025 00:02:29 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A341C614E3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 14 May 2025 00:02:26 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 618522EC;\n\tWed, 14 May 2025 00:02:10 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Hi06ooK3\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1747173730;\n\tbh=2SorBwHt2TpmnzF9HRQht33nFQW9aMASYx86uPIYPIE=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Hi06ooK3ml4XeUL3efLjjOv7FRH7MAZE2Mr8b4Eqa6Pn59OYW3w2BPGjNM+RbWaWx\n\t7LdI4fzp13aHIemxfF/lSjOyUKfb0CC9MojlFGyWnicO1KQ+RBA31HsCF+o1bRYMc1\n\tniOqhZHbiIP6oKc00whTCNftX0TI+enpYycjHJsg=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<174716324176.233090.18356144490810947936@pyrite.rasen.tech>","References":"<20250513174312.106676-1-kieran.bingham@ideasonboard.com>\n\t<174716324176.233090.18356144490810947936@pyrite.rasen.tech>","Subject":"Re: [PATCH] [RFC] libcamera: pipeline: Add h/v blanking delays","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"","To":"Paul Elder <paul.elder@ideasonboard.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Date":"Tue, 13 May 2025 23:02:23 +0100","Message-ID":"<174717374305.636336.16897441475602401771@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","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>"}},{"id":34235,"web_url":"https://patchwork.libcamera.org/comment/34235/","msgid":"<174724224899.62151.6975557949928238226@calcite>","date":"2025-05-14T17:04:08","subject":"Re: [PATCH] [RFC] libcamera: pipeline: Add h/v blanking delays","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Kieran Bingham (2025-05-14 00:02:23)\n> Quoting Paul Elder (2025-05-13 20:07:21)\n> > Quoting Kieran Bingham (2025-05-13 19:43:12)\n> > > The HBLANK and VBLANK control delays are not being accounted for in all\n> > > of the libipa platforms. Update their delayed controls instantiation\n> > > accordingly.\n> > \n> > I thought hblank was a generally a read-only control?\n> \n> Generally perhaps - but not always - it can be a read-only or a\n> writeable control for devices that can set it. So we should consider it\n> when possible. It will give a better configuration range on exposure and\n> frame duration if we have sensors with hblank controls.\n> \n> But yes, some sensors are read only here.\n> \n> > > In particular, update the RKISP1 VBLANK control delay to be marked as a\n> > > priority control as well as setting the correct delay to align with the\n> > > existing Raspberry Pi implementation.\n> > \n> > Given that the priorityWrite docs says \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> > I suppose we do want this.\n> > \n> > > \n> > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > > ---\n> > > \n> > > Marking this as RFC because I haven't tested this or explored it yet -\n> > > but as I was reviewing other parts of the code base - I noted that these\n> > > are inconsistent across pipeline handlers - so lets figure out why and\n> > > make sure all the pipeline handlers operate in the same way where\n> > > possible.\n> > > \n> > >  src/libcamera/pipeline/ipu3/ipu3.cpp         | 2 ++\n> > >  src/libcamera/pipeline/mali-c55/mali-c55.cpp | 2 ++\n> > >  src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 3 ++-\n> > >  src/libcamera/pipeline/simple/simple.cpp     | 2 ++\n> > >  4 files changed, 8 insertions(+), 1 deletion(-)\n> > > \n> > > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > > index e31e3879dcc9..4cec22b01940 100644\n> > > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > > @@ -1082,6 +1082,8 @@ int PipelineHandlerIPU3::registerCameras()\n> > >                 std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> > >                         { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> > >                         { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > > +                       { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > > +                       { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> > >                 };\n> > >  \n> > >                 data->delayedCtrls_ =\n> > > diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> > > index a05e11fccf8d..7d052263b34d 100644\n> > > --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> > > +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> > > @@ -1607,6 +1607,8 @@ bool PipelineHandlerMaliC55::registerSensorCamera(MediaLink *ispLink)\n> > >                 std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> > >                         { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> > >                         { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > > +                       { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > > +                       { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> > >                 };\n> > >  \n> > >                 data->delayedCtrls_ =\n> > > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > > index 52633fe3cb85..6c5b81b9a2ba 100644\n> > > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > > @@ -1325,7 +1325,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n> > >         std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> > >                 { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> > >                 { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > > -               { V4L2_CID_VBLANK, { 1, false } },\n> > \n> > (This probably won't apply upstream as it was recently fixed to\n> > { V4L2_CID_VBLANK, { delays.vblankDelay, false } }, )\n> > \n> \n> Ooops - I hadn't realised I wasn't on a mainline branch...\n> \n> So I'll rebase and update - but seems like it is the right thing to do\n> for each pipeline ... which makes me wonder if we should just put a\n> helper somewhere common (V4L2Device given it's V4L2Specific? or pipeline\n> handler base, or common utils ?) that can parse the delayed controls\n> delays in the same way for each...\n\nGiven that it's guaranteed to be duplicated between all IPAs, it might\nindeed be a good idea to move it somewhere else common. Athough it's\nslightly not the focus of this patch, might we also want to do the same\nwith exposure and gain?\n\n\nPaul\n\n> \n> > \n> > > +               { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > > +               { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> > >         };\n> > >  \n> > >         data->delayedCtrls_ =\n> > > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> > > index efb07051b175..fc88efc7a716 100644\n> > > --- a/src/libcamera/pipeline/simple/simple.cpp\n> > > +++ b/src/libcamera/pipeline/simple/simple.cpp\n> > > @@ -546,6 +546,8 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,\n> > >         std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n> > >                 { V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n> > >                 { V4L2_CID_EXPOSURE, { delays.exposureDelay, false } },\n> > > +               { V4L2_CID_HBLANK, { delays.hblankDelay, false } },\n> > > +               { V4L2_CID_VBLANK, { delays.vblankDelay, true } },\n> > >         };\n> > >         delayedCtrls_ = std::make_unique<DelayedControls>(sensor_->device(), params);\n> > >  \n> > > -- \n> > > 2.49.0\n> > >","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 9F1BDC3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 14 May 2025 17:04:16 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A95AC68B63;\n\tWed, 14 May 2025 19:04:15 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CF6806175B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 14 May 2025 19:04:13 +0200 (CEST)","from pyrite.rasen.tech\n\t(2a01cb09d0176c2eacc6ca2d272645d4.ipv6.abo.wanadoo.fr\n\t[IPv6:2a01:cb09:d017:6c2e:acc6:ca2d:2726:45d4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0BD2E6A6;\n\tWed, 14 May 2025 19:03:56 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"NJuhpmPk\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1747242237;\n\tbh=SymTpkgI9qzNChbeH0G6vbQv5z2RM4trgoZl9/68nFs=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=NJuhpmPkdIdttlKtUzy+htT2OQJla76U9tfm86iU72gFt3BAVoy6tRvZlGpfXmmmD\n\twvkHuWb3+EjQf3FzhWF4SJaJncDrphDf108emu2lnk7WkFQ6Vmu6HEF01Ng5GNVDsH\n\trNJH/ubP4/Wq9jC29z1/f/JPM6H/yrE/bA+LfmQA=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<174717374305.636336.16897441475602401771@ping.linuxembedded.co.uk>","References":"<20250513174312.106676-1-kieran.bingham@ideasonboard.com>\n\t<174716324176.233090.18356144490810947936@pyrite.rasen.tech>\n\t<174717374305.636336.16897441475602401771@ping.linuxembedded.co.uk>","Subject":"Re: [PATCH] [RFC] libcamera: pipeline: Add h/v blanking delays","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Date":"Wed, 14 May 2025 19:04:08 +0200","Message-ID":"<174724224899.62151.6975557949928238226@calcite>","User-Agent":"alot/0.10","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>"}}]