[{"id":13575,"web_url":"https://patchwork.libcamera.org/comment/13575/","msgid":"<CAEmqJPrx1TjtthPWzoKmreVOHwj8m4iDmpCPaRNmXgvg1w0ewA@mail.gmail.com>","date":"2020-11-03T10:37:24","subject":"Re: [libcamera-devel] [PATCH 4/9] libcamera: raspberrypi: Switch to\n\tDelayedControls","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Niklas,\n\nThank you for your patch.\n\nOn Wed, 28 Oct 2020 at 01:01, Niklas Söderlund <\nniklas.soderlund@ragnatech.se> wrote:\n\n> Use the libcamera core helper DelayedControls instead of the local\n> StaggeredCtrl. The new helper is modeled after the StaggeredCtrl\n> implementation and behaves the same.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 44 +++++++++----------\n>  1 file changed, 20 insertions(+), 24 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index a48013d8c27b98eb..4087985f1e66c940 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -25,6 +25,7 @@\n>\n>  #include \"libcamera/internal/bayer_format.h\"\n>  #include \"libcamera/internal/camera_sensor.h\"\n> +#include \"libcamera/internal/delayed_controls.h\"\n>  #include \"libcamera/internal/device_enumerator.h\"\n>  #include \"libcamera/internal/ipa_manager.h\"\n>  #include \"libcamera/internal/media_device.h\"\n> @@ -35,7 +36,6 @@\n>\n>  #include \"dma_heaps.h\"\n>  #include \"rpi_stream.h\"\n> -#include \"staggered_ctrl.h\"\n>\n>  namespace libcamera {\n>\n> @@ -169,8 +169,7 @@ public:\n>         RPi::DmaHeap dmaHeap_;\n>         FileDescriptor lsTable_;\n>\n> -       RPi::StaggeredCtrl staggeredCtrl_;\n> -       uint32_t expectedSequence_;\n> +       std::unique_ptr<DelayedControls> delayedCtrls_;\n>         bool sensorMetadata_;\n>\n>         /*\n> @@ -773,10 +772,7 @@ int PipelineHandlerRPi::start(Camera *camera)\n>          * starting. First check that the staggered ctrl has been\n> initialised\n>          * by configure().\n>          */\n> -       ASSERT(data->staggeredCtrl_);\n> -       data->staggeredCtrl_.reset();\n> -       data->staggeredCtrl_.write();\n> -       data->expectedSequence_ = 0;\n> +       data->delayedCtrls_->reset();\n>\n>         data->state_ = RPiCameraData::State::Idle;\n>\n> @@ -1107,7 +1103,7 @@ void RPiCameraData::frameStarted(uint32_t sequence)\n>         LOG(RPI, Debug) << \"frame start \" << sequence;\n>\n>         /* Write any controls for the next frame as soon as we can. */\n> -       staggeredCtrl_.write();\n> +       delayedCtrls_->frameStart(sequence);\n>  }\n>\n>  int RPiCameraData::loadIPA()\n> @@ -1185,18 +1181,22 @@ int RPiCameraData::configureIPA(const\n> CameraConfiguration *config)\n>                  * Setup our staggered control writer with the sensor\n> default\n>                  * gain and exposure delays.\n>                  */\n> -               if (!staggeredCtrl_) {\n> -                       staggeredCtrl_.init(unicam_[Unicam::Image].dev(),\n> -                                           { { V4L2_CID_ANALOGUE_GAIN,\n> result.data[resultIdx++] },\n> -                                             { V4L2_CID_EXPOSURE,\n> result.data[resultIdx++] } });\n> +\n> +               if (!delayedCtrls_) {\n> +                       std::unordered_map<uint32_t, unsigned int> delays\n> = {\n> +                               { V4L2_CID_ANALOGUE_GAIN,\n> result.data[resultIdx++] },\n> +                               { V4L2_CID_EXPOSURE,\n> result.data[resultIdx++] }\n> +                       };\n> +\n> +                       delayedCtrls_ =\n> std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays);\n> +\n>                         sensorMetadata_ = result.data[resultIdx++];\n>                 }\n>         }\n>\n>         if (result.operation & RPi::IPA_CONFIG_SENSOR) {\n> -               const ControlList &ctrls = result.controls[0];\n> -               if (!staggeredCtrl_.set(ctrls))\n> -                       LOG(RPI, Error) << \"V4L2 staggered set failed\";\n> +               ControlList ctrls = result.controls[0];\n> +               delayedCtrls_->reset(&ctrls);\n>         }\n>\n>         if (result.operation & RPi::IPA_CONFIG_DROP_FRAMES) {\n> @@ -1230,8 +1230,8 @@ void\n> RPiCameraData::queueFrameAction([[maybe_unused]] unsigned int frame,\n>         switch (action.operation) {\n>         case RPi::IPA_ACTION_V4L2_SET_STAGGERED: {\n>                 const ControlList &controls = action.controls[0];\n> -               if (!staggeredCtrl_.set(controls))\n> -                       LOG(RPI, Error) << \"V4L2 staggered set failed\";\n> +               if (!delayedCtrls_->push(controls))\n> +                       LOG(RPI, Error) << \"V4L2 delay set failed\";\n>                 goto done;\n>         }\n>\n> @@ -1335,11 +1335,7 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer\n> *buffer)\n>         } else {\n>                 embeddedQueue_.push(buffer);\n>\n> -               std::unordered_map<uint32_t, int32_t> ctrl;\n> -               int offset = buffer->metadata().sequence -\n> expectedSequence_;\n> -               staggeredCtrl_.get(ctrl, offset);\n> -\n> -               expectedSequence_ = buffer->metadata().sequence + 1;\n> +               ControlList ctrl =\n> delayedCtrls_->get(buffer->metadata().sequence);\n>\n\nJust to confirm my understanding is correct, insead of tracking\nexpectedSequence_ and calculating offset to account for any number of frame\ndrops, we use the buffer->metadata().sequence directly to do the same\nthing?  If so, this is a great simplification.\n\nRegards,\nNaush\n\n\n\n>\n>                 /*\n>                  * Sensor metadata is unavailable, so put the expected ctrl\n> @@ -1352,8 +1348,8 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer\n> *buffer)\n>\n>  PROT_READ | PROT_WRITE,\n>\n>  MAP_SHARED,\n>\n>  fb.planes()[0].fd.fd(), 0));\n> -                       mem[0] = ctrl[V4L2_CID_EXPOSURE];\n> -                       mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN];\n> +                       mem[0] =\n> ctrl.get(V4L2_CID_EXPOSURE).get<int32_t>();\n> +                       mem[1] =\n> ctrl.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>();\n>                         munmap(mem, fb.planes()[0].length);\n>                 }\n>         }\n> --\n> 2.29.1\n>\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 570DDBDB1E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  3 Nov 2020 10:37:43 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CE1F562BDA;\n\tTue,  3 Nov 2020 11:37:42 +0100 (CET)","from mail-lj1-x232.google.com (mail-lj1-x232.google.com\n\t[IPv6:2a00:1450:4864:20::232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0632062B91\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  3 Nov 2020 11:37:41 +0100 (CET)","by mail-lj1-x232.google.com with SMTP id x6so18483551ljd.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 03 Nov 2020 02:37:40 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"DV4dctsk\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=ooKkjFlSvCFkeES7N0UVjqwF5NzCve5cr47c0glM//Y=;\n\tb=DV4dctsk/ueZGHLpjqOUlIMreafUjRqI/x4rVkUCCMpyjFZAPnwEcmt5Qif3yNXWgg\n\tgpT0PICq4uIo9VmsySBGbt5N/2gzmlxE9fpIQuBIxhgdeOaaht0B02r3Gfpk7vzGcKyo\n\tJn5YIYrc+D0YOH3v4GBePj8fmJ6gk5Mx+aXBA6foATmSC8X8RAa1Lfb8cv1zUSCZ2kiS\n\ta6dSfVhsZpWaIzV4k9/azmC1HElcd5U/UnTz7BN9JOuZj8CeXmEyDB+QlignAwXhl+sM\n\tRBizWeYVXQ8nWT+rIwJfHG0Ui3z+Jfd5bQ0o3/my5FlIxiu2d6sHAXhbPKP+3YGyiJNJ\n\t9sdw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=ooKkjFlSvCFkeES7N0UVjqwF5NzCve5cr47c0glM//Y=;\n\tb=megLubHCs26rI43F589k19bj1tjzKbWRD9JRjo1aozVAQ9L90mPxhGpiamQacTxWro\n\tD7Yf6AOL/cqWhf3tknWEOiIlvBsk+ql9ZK98JhLgWA3kWCl1cXwhZs3K/q6YStWh/i/W\n\txUXcNpinepFd8qaQ/wqnMjtMhL1jTNbfuxFdOq4JnQ1W3qf2vsobV2vKObv4jhlXSaY0\n\tH010eJ9FFh4CAv71t/F7hQrdaE7GKcNCdrALoD8HNYgZqePHS+xRQLn0zx+/sp7iBLet\n\t8t9MJq2ouK5CUac3ctgNK7ka1hmCUU0f39NoyZo4cwJuElnmp3rRXQKJv4JvBZbtewYH\n\tWwSg==","X-Gm-Message-State":"AOAM532YlmlLJjODRsi6mtXLIIlSdKaTACozx9JBKNFzfU2+lJreocu3\n\tCosU0qBSUdH0C4IclskotHzhq9RAnsp236egHYSDouOjs5EpCw==","X-Google-Smtp-Source":"ABdhPJyJfwl83AWLXdIwMOK2+p7KBZlgeBhGJQCib/eHUoXFl4yVqiq870eM9SVQX94Q7v2BRmy3gvXdpm+511zBmgY=","X-Received":"by 2002:a2e:84c7:: with SMTP id q7mr8308827ljh.415.1604399860458;\n\tTue, 03 Nov 2020 02:37:40 -0800 (PST)","MIME-Version":"1.0","References":"<20201028010051.3830668-1-niklas.soderlund@ragnatech.se>\n\t<20201028010051.3830668-5-niklas.soderlund@ragnatech.se>","In-Reply-To":"<20201028010051.3830668-5-niklas.soderlund@ragnatech.se>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Tue, 3 Nov 2020 10:37:24 +0000","Message-ID":"<CAEmqJPrx1TjtthPWzoKmreVOHwj8m4iDmpCPaRNmXgvg1w0ewA@mail.gmail.com>","To":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Subject":"Re: [libcamera-devel] [PATCH 4/9] libcamera: raspberrypi: Switch to\n\tDelayedControls","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"multipart/mixed;\n\tboundary=\"===============2524086188918901238==\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13629,"web_url":"https://patchwork.libcamera.org/comment/13629/","msgid":"<20201106144549.GG3195686@oden.dyn.berto.se>","date":"2020-11-06T14:45:49","subject":"Re: [libcamera-devel] [PATCH 4/9] libcamera: raspberrypi: Switch to\n\tDelayedControls","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Naushir,\n\nThanks for your feedback.\n\nOn 2020-11-03 10:37:24 +0000, Naushir Patuck wrote:\n> Hi Niklas,\n> \n> Thank you for your patch.\n> \n> On Wed, 28 Oct 2020 at 01:01, Niklas Söderlund <\n> niklas.soderlund@ragnatech.se> wrote:\n> \n> > Use the libcamera core helper DelayedControls instead of the local\n> > StaggeredCtrl. The new helper is modeled after the StaggeredCtrl\n> > implementation and behaves the same.\n> >\n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 44 +++++++++----------\n> >  1 file changed, 20 insertions(+), 24 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index a48013d8c27b98eb..4087985f1e66c940 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -25,6 +25,7 @@\n> >\n> >  #include \"libcamera/internal/bayer_format.h\"\n> >  #include \"libcamera/internal/camera_sensor.h\"\n> > +#include \"libcamera/internal/delayed_controls.h\"\n> >  #include \"libcamera/internal/device_enumerator.h\"\n> >  #include \"libcamera/internal/ipa_manager.h\"\n> >  #include \"libcamera/internal/media_device.h\"\n> > @@ -35,7 +36,6 @@\n> >\n> >  #include \"dma_heaps.h\"\n> >  #include \"rpi_stream.h\"\n> > -#include \"staggered_ctrl.h\"\n> >\n> >  namespace libcamera {\n> >\n> > @@ -169,8 +169,7 @@ public:\n> >         RPi::DmaHeap dmaHeap_;\n> >         FileDescriptor lsTable_;\n> >\n> > -       RPi::StaggeredCtrl staggeredCtrl_;\n> > -       uint32_t expectedSequence_;\n> > +       std::unique_ptr<DelayedControls> delayedCtrls_;\n> >         bool sensorMetadata_;\n> >\n> >         /*\n> > @@ -773,10 +772,7 @@ int PipelineHandlerRPi::start(Camera *camera)\n> >          * starting. First check that the staggered ctrl has been\n> > initialised\n> >          * by configure().\n> >          */\n> > -       ASSERT(data->staggeredCtrl_);\n> > -       data->staggeredCtrl_.reset();\n> > -       data->staggeredCtrl_.write();\n> > -       data->expectedSequence_ = 0;\n> > +       data->delayedCtrls_->reset();\n> >\n> >         data->state_ = RPiCameraData::State::Idle;\n> >\n> > @@ -1107,7 +1103,7 @@ void RPiCameraData::frameStarted(uint32_t sequence)\n> >         LOG(RPI, Debug) << \"frame start \" << sequence;\n> >\n> >         /* Write any controls for the next frame as soon as we can. */\n> > -       staggeredCtrl_.write();\n> > +       delayedCtrls_->frameStart(sequence);\n> >  }\n> >\n> >  int RPiCameraData::loadIPA()\n> > @@ -1185,18 +1181,22 @@ int RPiCameraData::configureIPA(const\n> > CameraConfiguration *config)\n> >                  * Setup our staggered control writer with the sensor\n> > default\n> >                  * gain and exposure delays.\n> >                  */\n> > -               if (!staggeredCtrl_) {\n> > -                       staggeredCtrl_.init(unicam_[Unicam::Image].dev(),\n> > -                                           { { V4L2_CID_ANALOGUE_GAIN,\n> > result.data[resultIdx++] },\n> > -                                             { V4L2_CID_EXPOSURE,\n> > result.data[resultIdx++] } });\n> > +\n> > +               if (!delayedCtrls_) {\n> > +                       std::unordered_map<uint32_t, unsigned int> delays\n> > = {\n> > +                               { V4L2_CID_ANALOGUE_GAIN,\n> > result.data[resultIdx++] },\n> > +                               { V4L2_CID_EXPOSURE,\n> > result.data[resultIdx++] }\n> > +                       };\n> > +\n> > +                       delayedCtrls_ =\n> > std::make_unique<DelayedControls>(unicam_[Unicam::Image].dev(), delays);\n> > +\n> >                         sensorMetadata_ = result.data[resultIdx++];\n> >                 }\n> >         }\n> >\n> >         if (result.operation & RPi::IPA_CONFIG_SENSOR) {\n> > -               const ControlList &ctrls = result.controls[0];\n> > -               if (!staggeredCtrl_.set(ctrls))\n> > -                       LOG(RPI, Error) << \"V4L2 staggered set failed\";\n> > +               ControlList ctrls = result.controls[0];\n> > +               delayedCtrls_->reset(&ctrls);\n> >         }\n> >\n> >         if (result.operation & RPi::IPA_CONFIG_DROP_FRAMES) {\n> > @@ -1230,8 +1230,8 @@ void\n> > RPiCameraData::queueFrameAction([[maybe_unused]] unsigned int frame,\n> >         switch (action.operation) {\n> >         case RPi::IPA_ACTION_V4L2_SET_STAGGERED: {\n> >                 const ControlList &controls = action.controls[0];\n> > -               if (!staggeredCtrl_.set(controls))\n> > -                       LOG(RPI, Error) << \"V4L2 staggered set failed\";\n> > +               if (!delayedCtrls_->push(controls))\n> > +                       LOG(RPI, Error) << \"V4L2 delay set failed\";\n> >                 goto done;\n> >         }\n> >\n> > @@ -1335,11 +1335,7 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer\n> > *buffer)\n> >         } else {\n> >                 embeddedQueue_.push(buffer);\n> >\n> > -               std::unordered_map<uint32_t, int32_t> ctrl;\n> > -               int offset = buffer->metadata().sequence -\n> > expectedSequence_;\n> > -               staggeredCtrl_.get(ctrl, offset);\n> > -\n> > -               expectedSequence_ = buffer->metadata().sequence + 1;\n> > +               ControlList ctrl =\n> > delayedCtrls_->get(buffer->metadata().sequence);\n> >\n> \n> Just to confirm my understanding is correct, insead of tracking\n> expectedSequence_ and calculating offset to account for any number of frame\n> drops, we use the buffer->metadata().sequence directly to do the same\n> thing?  If so, this is a great simplification.\n\nYes that is the idea.\n\nThe other part is the call to 'delayedCtrls_->frameStart(sequence);' \nabove at SOE. This syncs the offset and increments seq number inside the \nDelayedControls hopefully making the API a bit easier to use as the \npipeline as you noticed does not need to store expectedSequence_ and \ncalculate offsets themself.\n\nThe SOE event is emitted by the CSI-2 receiver we don't truly know if \nthe sensor have dropped a frame or of the CSI-2 transmitter or receiver \nencounter an error and dropped a frame. But we have the same problem \nwith the expectedSequence_ solution as the DMA engine won't increment \nthe sequence number if the CSI-2 receiver don't receive the frame and \nthis also emits the SOE ;-)\n\n> \n> Regards,\n> Naush\n> \n> \n> \n> >\n> >                 /*\n> >                  * Sensor metadata is unavailable, so put the expected ctrl\n> > @@ -1352,8 +1348,8 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer\n> > *buffer)\n> >\n> >  PROT_READ | PROT_WRITE,\n> >\n> >  MAP_SHARED,\n> >\n> >  fb.planes()[0].fd.fd(), 0));\n> > -                       mem[0] = ctrl[V4L2_CID_EXPOSURE];\n> > -                       mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN];\n> > +                       mem[0] =\n> > ctrl.get(V4L2_CID_EXPOSURE).get<int32_t>();\n> > +                       mem[1] =\n> > ctrl.get(V4L2_CID_ANALOGUE_GAIN).get<int32_t>();\n> >                         munmap(mem, fb.planes()[0].length);\n> >                 }\n> >         }\n> > --\n> > 2.29.1\n> >\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 F05F3BDB89\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  6 Nov 2020 14:45:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7FBCE629A6;\n\tFri,  6 Nov 2020 15:45:52 +0100 (CET)","from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com\n\t[IPv6:2a00:1450:4864:20::12d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4BB03622AA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  6 Nov 2020 15:45:51 +0100 (CET)","by mail-lf1-x12d.google.com with SMTP id f9so2297478lfq.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 06 Nov 2020 06:45:51 -0800 (PST)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tr3sm187173lfc.85.2020.11.06.06.45.49\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 06 Nov 2020 06:45:50 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"GDmR89Nq\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=+Ed1wwkx2Un7NBYNQ+amxFNqBKyyjcwgsr4kCD5UALY=;\n\tb=GDmR89NqWl725KoOe0Ng01vFZy3TEvrkK2RYUWni21iFyPBNRIe5j5OTvZZgAiEOpV\n\tPWEAvTlbX4FqNSTlWR5wb2hnsd45zzv6/WFtt4gtjB7RZx0m/8IrbrWBJQWPo9Dfbq7J\n\tN+NNOLkDnTg7NipqRLFjeLOdJI+yLODXg4AdBFOBRLOD6xHYlbDkWoiJrZnl/5ShrYYl\n\tIJDlAQRZ3C6D7u6GrVzpLQSpSFvwJ+CaI/oCaBKhbvRmW+O8BNR5UTJSwylyiHDbuesN\n\tUvBBI/K/oYBB+va9CtzjAPG8gs20ffZQwOx/djD6dx3SEefi+k3L/1fR/UoGwb77Cd8a\n\t2VDg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=+Ed1wwkx2Un7NBYNQ+amxFNqBKyyjcwgsr4kCD5UALY=;\n\tb=NkWYA+d3jk/dJnQOH+EmMuMuNZ1CViXiDUrkDs/Wc+dPRqtGW9m3TNfzRnFNPmPIGV\n\tCtlTgApfuYe6ZD5WYU34qCncp2TcX4rJRMl5jOUUOhXOHnx163M/AO9n733yk1fngx8C\n\tp39fsEVYsSrhYs64+cf9Y3nABWM/KLyCMcSByhDWdd5CvI2iVE0agJhKEXsSm8BcgtbR\n\tD56UZrORBpUzBoxsTgn7vUhqXZzIPlWBWW+782jRKCDxUMBwCtg9f2D6wSb4ycm8sjhV\n\tBgoRK6OsV0K3I6qBXEtgJFWwGHAKKUqarKbCAM/keWL4HEDbSWJ4pw+ACxZ+BToV/U06\n\t0bkQ==","X-Gm-Message-State":"AOAM531IPKoeDlV8SX04YQAeMVMOi47wb0GcMkkKZOKrHi+q05o8/y/8\n\t9Q6FH55f2tS3sRhrW4elAvDc5A==","X-Google-Smtp-Source":"ABdhPJxCLUzsiohy5QayMmyD+TW7iJB0x8sYemCsNORIt9JX/Q4YbCxo0fw/GXNKt8kV+WLFer7ZYw==","X-Received":"by 2002:ac2:5edb:: with SMTP id d27mr972962lfq.404.1604673950655;\n\tFri, 06 Nov 2020 06:45:50 -0800 (PST)","Date":"Fri, 6 Nov 2020 15:45:49 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20201106144549.GG3195686@oden.dyn.berto.se>","References":"<20201028010051.3830668-1-niklas.soderlund@ragnatech.se>\n\t<20201028010051.3830668-5-niklas.soderlund@ragnatech.se>\n\t<CAEmqJPrx1TjtthPWzoKmreVOHwj8m4iDmpCPaRNmXgvg1w0ewA@mail.gmail.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<CAEmqJPrx1TjtthPWzoKmreVOHwj8m4iDmpCPaRNmXgvg1w0ewA@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH 4/9] libcamera: raspberrypi: Switch to\n\tDelayedControls","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]