[{"id":24189,"web_url":"https://patchwork.libcamera.org/comment/24189/","msgid":"<5d593e10-69f7-77c1-3949-e6c7b0d96d45@ideasonboard.com>","date":"2022-07-27T13:24:59","subject":"Re: [libcamera-devel] [PATCH v3 9/9] ipu3: Fixes frame delay","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hello,\n\nOn 6/29/22 16:00, Harvey Yang via libcamera-devel wrote:\n> Like the shipped ipu3 HAL, handle the frame delay with one extra input,\n\n\nCan you point to the shipped ipu3 HAL frame delay handling code here for \nreference?\n\n> needed for the first frame and StillCapture's non-sequential frame\n> requests.\n>\n> Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> ---\n>   src/libcamera/pipeline/ipu3/ipu3.cpp | 73 +++++++++++++++++++++++-----\n>   1 file changed, 62 insertions(+), 11 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index e26c2736..8689cf8b 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -90,6 +90,9 @@ public:\n>   \n>   \tControlInfoMap ipaControls_;\n>   \n> +\tbool firstRequest_ = true;\n> +\tint lastRequestSequence_ = -1;\n\n\nthis is only used under hasCapture so maybe lastCaptureRequestSeq_ is \nmore appropriate?\n\n> +\n>   private:\n>   \tvoid metadataReady(unsigned int id, const ControlList &metadata);\n>   \tvoid paramsBufferReady(unsigned int id);\n> @@ -565,6 +568,9 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)\n>   \tCIO2Device *cio2 = &data->cio2_;\n>   \tV4L2DeviceFormat outputFormat;\n>   \n> +\tdata->firstRequest_ = true;\n> +\tdata->lastRequestSequence_ = -1;\n> +\n\n\nDoes this needs to be reset on every start()/stop() cycles?\n\n>   \tImgUDevice::PipeConfig imguConfig1 = config->imguConfig1();\n>   \tuseImgu1_ = !imguConfig1.isNull();\n>   \n> @@ -1427,6 +1433,11 @@ void IPU3CameraData::paramsBufferReady(unsigned int id)\n>   \tif (!info)\n>   \t\treturn;\n>   \n> +\tint yuvCount = firstRequest_ ? 2 : 1;\n> +\tint stillCount = firstRequest_ || (lastRequestSequence_ + 1) != static_cast<int>(info->request->sequence()) ? 2 : 1;\n> +\n\n\nThis is getting a bit non-trivial to follow. Can you probably include a \nbrief comment here to explain some rationale?\n\nAs per my understanding, if the lastRequestSequence_ was a StillCapture, \nstillCount will be 1 for current request capture, and it will 2 for all \nother cases?\n\nWe need stillCount to be 2 (usually) because .... ?\n\n> +\tfirstRequest_ = false;\n> +\n>   \tbool hasYuv = false;\n>   \tbool hasCapture = false;\n>   \t/* Queue all buffers from the request aimed for the ImgU. */\n> @@ -1436,33 +1447,53 @@ void IPU3CameraData::paramsBufferReady(unsigned int id)\n>   \n>   \t\tif (stream == &outStream_) {\n>   \t\t\thasYuv = true;\n> -\t\t\timgu0_->output_->queueBuffer(outbuffer);\n> +\n> +\t\t\tfor (int i = 0; i < yuvCount; ++i) {\n> +\t\t\t\tbufferReturnCounters[outbuffer] += 1;\n> +\t\t\t\timgu0_->output_->queueBuffer(outbuffer);\n\n\nHave you checked / discussed what happens if you re-queue the same \nbuffer on videodevice twice (before even dequeuing it)? I am not sure, \nbecause the current documentation doesn't specify this case I think.\n\nI've asked around.\n\n> +\t\t\t}\n>   \t\t} else if (stream == &vfStream_) {\n>   \t\t\thasYuv = true;\n> -\t\t\timgu0_->viewfinder_->queueBuffer(outbuffer);\n> +\n> +\t\t\tfor (int i = 0; i < yuvCount; ++i) {\n> +\t\t\t\tbufferReturnCounters[outbuffer] += 1;\n> +\t\t\t\timgu0_->viewfinder_->queueBuffer(outbuffer);\n> +\t\t\t}\n>   \t\t} else if (stream == &outCaptureStream_) {\n>   \t\t\thasCapture = true;\n>   \n> -\t\t\timgu1_->output_->queueBuffer(outbuffer);\n> +\t\t\tfor (int i = 0; i < stillCount; ++i) {\n> +\t\t\t\tbufferReturnCounters[outbuffer] += 1;\n> +\t\t\t\timgu1_->output_->queueBuffer(outbuffer);\n> +\t\t\t}\n>   \t\t}\n>   \t}\n>   \n>   \tif (hasYuv) {\n> -\t\tbufferReturnCounters[info->rawBuffer] += 1;\n> -\n> -\t\timgu0_->param_->queueBuffer(info->paramBuffer);\n> -\t\timgu0_->stat_->queueBuffer(info->statBuffer);\n> -\t\timgu0_->input_->queueBuffer(info->rawBuffer);\n> +\t\tfor (int i = 0; i < yuvCount; ++i) {\n> +\t\t\tbufferReturnCounters[info->paramBuffer] += 1;\n> +\t\t\tbufferReturnCounters[info->statBuffer] += 1;\n> +\t\t\tbufferReturnCounters[info->rawBuffer] += 1;\n> +\n> +\t\t\timgu0_->param_->queueBuffer(info->paramBuffer);\n> +\t\t\timgu0_->stat_->queueBuffer(info->statBuffer);\n> +\t\t\timgu0_->input_->queueBuffer(info->rawBuffer);\n> +\t\t}\n>   \t} else {\n>   \t\tinfo->paramDequeued = true;\n>   \t\tinfo->metadataProcessed = true;\n>   \t}\n>   \n>   \tif (hasCapture) {\n> -\t\tbufferReturnCounters[info->rawBuffer] += 1;\n> +\t\tlastRequestSequence_ = info->request->sequence();\n>   \n> -\t\timgu1_->param_->queueBuffer(info->captureParamBuffer);\n> -\t\timgu1_->input_->queueBuffer(info->rawBuffer);\n> +\t\tfor (int i = 0; i < stillCount; ++i) {\n> +\t\t\tbufferReturnCounters[info->captureParamBuffer] += 1;\n> +\t\t\tbufferReturnCounters[info->rawBuffer] += 1;\n> +\n> +\t\t\timgu1_->param_->queueBuffer(info->captureParamBuffer);\n> +\t\t\timgu1_->input_->queueBuffer(info->rawBuffer);\n> +\t\t}\n>   \t} else {\n>   \t\tinfo->captureParamDequeued = true;\n>   \t}\n> @@ -1503,6 +1534,11 @@ void IPU3CameraData::tryReturnBuffer(FrameBuffer *buffer)\n>    */\n>   void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)\n>   {\n> +\tif (--bufferReturnCounters[buffer] > 0)\n> +\t\treturn;\n> +\n> +\tbufferReturnCounters.erase(buffer);\n> +\n>   \tIPU3Frames::Info *info = frameInfos_.find(buffer);\n>   \tif (!info)\n>   \t\treturn;\n> @@ -1569,6 +1605,11 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)\n>   \n>   void IPU3CameraData::paramBufferReady(FrameBuffer *buffer)\n>   {\n> +\tif (--bufferReturnCounters[buffer] > 0)\n> +\t\treturn;\n> +\n> +\tbufferReturnCounters.erase(buffer);\n> +\n>   \tIPU3Frames::Info *info = frameInfos_.find(buffer);\n>   \tif (!info)\n>   \t\treturn;\n> @@ -1589,6 +1630,11 @@ void IPU3CameraData::paramBufferReady(FrameBuffer *buffer)\n>   \n>   void IPU3CameraData::captureParamBufferReady(FrameBuffer *buffer)\n>   {\n> +\tif (--bufferReturnCounters[buffer] > 0)\n> +\t\treturn;\n> +\n> +\tbufferReturnCounters.erase(buffer);\n> +\n>   \tIPU3Frames::Info *info = frameInfos_.find(buffer);\n>   \tif (!info)\n>   \t\treturn;\n> @@ -1609,6 +1655,11 @@ void IPU3CameraData::captureParamBufferReady(FrameBuffer *buffer)\n>   \n>   void IPU3CameraData::statBufferReady(FrameBuffer *buffer)\n>   {\n> +\tif (--bufferReturnCounters[buffer] > 0)\n> +\t\treturn;\n> +\n> +\tbufferReturnCounters.erase(buffer);\n> +\n>   \tIPU3Frames::Info *info = frameInfos_.find(buffer);\n>   \tif (!info)\n>   \t\treturn;","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 922BCBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 27 Jul 2022 13:25:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 060BA63311;\n\tWed, 27 Jul 2022 15:25:07 +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 C17FE63309\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Jul 2022 15:25:05 +0200 (CEST)","from [IPV6:2401:4900:1f3e:f7a:bc8f:12ed:b45f:c35d] (unknown\n\t[IPv6:2401:4900:1f3e:f7a:bc8f:12ed:b45f:c35d])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 70D28A49;\n\tWed, 27 Jul 2022 15:25:04 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658928307;\n\tbh=CCcmztiRbnqLrZdMizO4dNsYFnZYcYyfxST9F3Zi5ck=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=DSSb/eR2gWbAXpJx5JixOWrI6aLkbfDioMhtGEy94immNRdTKjg0h5N5krwMNqkYA\n\t3AJhkeTpBHAHkL93Jrlr0FBuDERdqoHfNZQp3i9JQB2Gb6MITJ3/MrMYC7fYoCi2Sv\n\tX4RHhsCGXteUIMIwA6TJr13jMIWlNy4/JD73C+tbcrtQldQbbOEkqQt5JkHqpxETGH\n\tte+TybLzAK+LohRHrVxD3h+JlvTPOvu6fuVJTcivbL+kRGVoMGclT3j5qjIE2x2CYY\n\tlOZIKExyyp1nzcrt3RTGJcX8+E/HM55EKfhjQNO1f9aIrhEg4A+wg7IJDG13MGEK6t\n\t7/LzkShbkna0w==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658928305;\n\tbh=CCcmztiRbnqLrZdMizO4dNsYFnZYcYyfxST9F3Zi5ck=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=TzdbdWLeOJ5I43GEKgACEHw0Ksc0EamQIrrwqHR6ua6XYhQkD1beewzrH6arX17rv\n\tDC1n6S5adiS9wGpr3XB5e3/w1uqQu53Lpk88N76n3w6dStUuixFw2U/Ke6RIqbBt3r\n\tn0RaLcV8ph0yAozUxesr5hKUe/gez7wMoxG/vmP4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"TzdbdWLe\"; dkim-atps=neutral","Message-ID":"<5d593e10-69f7-77c1-3949-e6c7b0d96d45@ideasonboard.com>","Date":"Wed, 27 Jul 2022 18:54:59 +0530","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.4.1","Content-Language":"en-US","To":"Harvey Yang <chenghaoyang@chromium.org>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220629103018.4025635-1-chenghaoyang@google.com>\n\t<20220629103018.4025635-10-chenghaoyang@google.com>","In-Reply-To":"<20220629103018.4025635-10-chenghaoyang@google.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v3 9/9] ipu3: Fixes frame delay","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>","From":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Cc":"Harvey Yang <chenghaoyang@google.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24300,"web_url":"https://patchwork.libcamera.org/comment/24300/","msgid":"<CAEB1ahtQTDhJmoEkmzhJ0xVuNcdVzCWchhcA8DWzyPsjrSoVvQ@mail.gmail.com>","date":"2022-08-02T10:31:26","subject":"Re: [libcamera-devel] [PATCH v3 9/9] ipu3: Fixes frame delay","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Hi Umang,\n\nOn Wed, Jul 27, 2022 at 9:25 PM Umang Jain <umang.jain@ideasonboard.com>\nwrote:\n\n> Hello,\n>\n> On 6/29/22 16:00, Harvey Yang via libcamera-devel wrote:\n> > Like the shipped ipu3 HAL, handle the frame delay with one extra input,\n>\n>\n> Can you point to the shipped ipu3 HAL frame delay handling code here for\n> reference?\n>\n>\nSure. Added.\n\n\n> > needed for the first frame and StillCapture's non-sequential frame\n> > requests.\n> >\n> > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> > ---\n> >   src/libcamera/pipeline/ipu3/ipu3.cpp | 73 +++++++++++++++++++++++-----\n> >   1 file changed, 62 insertions(+), 11 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index e26c2736..8689cf8b 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -90,6 +90,9 @@ public:\n> >\n> >       ControlInfoMap ipaControls_;\n> >\n> > +     bool firstRequest_ = true;\n> > +     int lastRequestSequence_ = -1;\n>\n>\n> this is only used under hasCapture so maybe lastCaptureRequestSeq_ is\n> more appropriate?\n>\n>\nRight, thanks!\n\n\n> > +\n> >   private:\n> >       void metadataReady(unsigned int id, const ControlList &metadata);\n> >       void paramsBufferReady(unsigned int id);\n> > @@ -565,6 +568,9 @@ int PipelineHandlerIPU3::configure(Camera *camera,\n> CameraConfiguration *c)\n> >       CIO2Device *cio2 = &data->cio2_;\n> >       V4L2DeviceFormat outputFormat;\n> >\n> > +     data->firstRequest_ = true;\n> > +     data->lastRequestSequence_ = -1;\n> > +\n>\n>\n> Does this needs to be reset on every start()/stop() cycles?\n>\n>\nAh, right. Resetting them when start() should be enough.\n\n\n> >       ImgUDevice::PipeConfig imguConfig1 = config->imguConfig1();\n> >       useImgu1_ = !imguConfig1.isNull();\n> >\n> > @@ -1427,6 +1433,11 @@ void IPU3CameraData::paramsBufferReady(unsigned\n> int id)\n> >       if (!info)\n> >               return;\n> >\n> > +     int yuvCount = firstRequest_ ? 2 : 1;\n> > +     int stillCount = firstRequest_ || (lastRequestSequence_ + 1) !=\n> static_cast<int>(info->request->sequence()) ? 2 : 1;\n> > +\n>\n>\n> This is getting a bit non-trivial to follow. Can you probably include a\n> brief comment here to explain some rationale?\n>\n> As per my understanding, if the lastRequestSequence_ was a StillCapture,\n> stillCount will be 1 for current request capture, and it will 2 for all\n> other cases?\n>\n> We need stillCount to be 2 (usually) because .... ?\n>\n>\nIf it's the first request, or the StillCapture request doesn't come\nsequentially, we'll need to queue the buffers twice (i.e. |stillCount|\nbeing 2) to mitigate the frame delay.\nAdded a comment in the code. Please check :)\n\n\n> > +     firstRequest_ = false;\n> > +\n> >       bool hasYuv = false;\n> >       bool hasCapture = false;\n> >       /* Queue all buffers from the request aimed for the ImgU. */\n> > @@ -1436,33 +1447,53 @@ void IPU3CameraData::paramsBufferReady(unsigned\n> int id)\n> >\n> >               if (stream == &outStream_) {\n> >                       hasYuv = true;\n> > -                     imgu0_->output_->queueBuffer(outbuffer);\n> > +\n> > +                     for (int i = 0; i < yuvCount; ++i) {\n> > +                             bufferReturnCounters[outbuffer] += 1;\n> > +                             imgu0_->output_->queueBuffer(outbuffer);\n>\n>\n> Have you checked / discussed what happens if you re-queue the same\n> buffer on videodevice twice (before even dequeuing it)? I am not sure,\n> because the current documentation doesn't specify this case I think.\n>\n> I've asked around.\n>\n>\nYeah, I've tried it on soraka and discussed it with Han-lin & Laurent &\nTomasz. It's also the way that the shipped HAL is handling the frame delay.\nPlease check :)\n\n\n> > +                     }\n> >               } else if (stream == &vfStream_) {\n> >                       hasYuv = true;\n> > -                     imgu0_->viewfinder_->queueBuffer(outbuffer);\n> > +\n> > +                     for (int i = 0; i < yuvCount; ++i) {\n> > +                             bufferReturnCounters[outbuffer] += 1;\n> > +\n>  imgu0_->viewfinder_->queueBuffer(outbuffer);\n> > +                     }\n> >               } else if (stream == &outCaptureStream_) {\n> >                       hasCapture = true;\n> >\n> > -                     imgu1_->output_->queueBuffer(outbuffer);\n> > +                     for (int i = 0; i < stillCount; ++i) {\n> > +                             bufferReturnCounters[outbuffer] += 1;\n> > +                             imgu1_->output_->queueBuffer(outbuffer);\n> > +                     }\n> >               }\n> >       }\n> >\n> >       if (hasYuv) {\n> > -             bufferReturnCounters[info->rawBuffer] += 1;\n> > -\n> > -             imgu0_->param_->queueBuffer(info->paramBuffer);\n> > -             imgu0_->stat_->queueBuffer(info->statBuffer);\n> > -             imgu0_->input_->queueBuffer(info->rawBuffer);\n> > +             for (int i = 0; i < yuvCount; ++i) {\n> > +                     bufferReturnCounters[info->paramBuffer] += 1;\n> > +                     bufferReturnCounters[info->statBuffer] += 1;\n> > +                     bufferReturnCounters[info->rawBuffer] += 1;\n> > +\n> > +                     imgu0_->param_->queueBuffer(info->paramBuffer);\n> > +                     imgu0_->stat_->queueBuffer(info->statBuffer);\n> > +                     imgu0_->input_->queueBuffer(info->rawBuffer);\n> > +             }\n> >       } else {\n> >               info->paramDequeued = true;\n> >               info->metadataProcessed = true;\n> >       }\n> >\n> >       if (hasCapture) {\n> > -             bufferReturnCounters[info->rawBuffer] += 1;\n> > +             lastRequestSequence_ = info->request->sequence();\n> >\n> > -             imgu1_->param_->queueBuffer(info->captureParamBuffer);\n> > -             imgu1_->input_->queueBuffer(info->rawBuffer);\n> > +             for (int i = 0; i < stillCount; ++i) {\n> > +                     bufferReturnCounters[info->captureParamBuffer] +=\n> 1;\n> > +                     bufferReturnCounters[info->rawBuffer] += 1;\n> > +\n> > +\n>  imgu1_->param_->queueBuffer(info->captureParamBuffer);\n> > +                     imgu1_->input_->queueBuffer(info->rawBuffer);\n> > +             }\n> >       } else {\n> >               info->captureParamDequeued = true;\n> >       }\n> > @@ -1503,6 +1534,11 @@ void IPU3CameraData::tryReturnBuffer(FrameBuffer\n> *buffer)\n> >    */\n> >   void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)\n> >   {\n> > +     if (--bufferReturnCounters[buffer] > 0)\n> > +             return;\n> > +\n> > +     bufferReturnCounters.erase(buffer);\n> > +\n> >       IPU3Frames::Info *info = frameInfos_.find(buffer);\n> >       if (!info)\n> >               return;\n> > @@ -1569,6 +1605,11 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer\n> *buffer)\n> >\n> >   void IPU3CameraData::paramBufferReady(FrameBuffer *buffer)\n> >   {\n> > +     if (--bufferReturnCounters[buffer] > 0)\n> > +             return;\n> > +\n> > +     bufferReturnCounters.erase(buffer);\n> > +\n> >       IPU3Frames::Info *info = frameInfos_.find(buffer);\n> >       if (!info)\n> >               return;\n> > @@ -1589,6 +1630,11 @@ void IPU3CameraData::paramBufferReady(FrameBuffer\n> *buffer)\n> >\n> >   void IPU3CameraData::captureParamBufferReady(FrameBuffer *buffer)\n> >   {\n> > +     if (--bufferReturnCounters[buffer] > 0)\n> > +             return;\n> > +\n> > +     bufferReturnCounters.erase(buffer);\n> > +\n> >       IPU3Frames::Info *info = frameInfos_.find(buffer);\n> >       if (!info)\n> >               return;\n> > @@ -1609,6 +1655,11 @@ void\n> IPU3CameraData::captureParamBufferReady(FrameBuffer *buffer)\n> >\n> >   void IPU3CameraData::statBufferReady(FrameBuffer *buffer)\n> >   {\n> > +     if (--bufferReturnCounters[buffer] > 0)\n> > +             return;\n> > +\n> > +     bufferReturnCounters.erase(buffer);\n> > +\n> >       IPU3Frames::Info *info = frameInfos_.find(buffer);\n> >       if (!info)\n> >               return;\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 C2251BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  2 Aug 2022 10:31:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 798346330E;\n\tTue,  2 Aug 2022 12:31:39 +0200 (CEST)","from mail-lf1-x135.google.com (mail-lf1-x135.google.com\n\t[IPv6:2a00:1450:4864:20::135])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 01B766330E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  2 Aug 2022 12:31:38 +0200 (CEST)","by mail-lf1-x135.google.com with SMTP id d14so9430846lfl.13\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 02 Aug 2022 03:31:37 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659436299;\n\tbh=uH3q8tmuc4Ck8ALCWsn5aQGSoxedxFvaVpGwvXSGuEM=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=Wz+4nDw2ThpQJ5avxIynCuu8v4Zd+r7AQnRMEPOJSt2zKwR9xUyIh8opFBkCyBke6\n\tUq0Py7Fwtt3d+Ky+9Kz861kIUeiJstw/i4CJb4oSu1NgqICbBTV/Bo0jYqfpyXTTyz\n\tTcHgXqQtgRx2ww7N83VlFfe8kFoUTv6M9PAmgiqPpN1I6OUeVG5WIIRl027IKUrvvi\n\t1NQLxNUD0ojWWllf3YoOJBAoyEAetZyc0NF0A4zp1JkuYJ7tQwP/FW0IZv+Uu2N/0L\n\tdQeos9a4czq2lar8nP0WUpEbppYGDTj9FehTWZHlXBVvAMSWyyjW/fOLyBPp/VICk/\n\tLMSmS7RnlZB7w==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=zFZg7NvAtP7TpvcTqGTrVAsLKJsTL0aijkpLj0/jg88=;\n\tb=WLwemewH7td0YAP1Bn1V/CgiorQTj6me1/PmOdxuXB2wXs34974JywreA7f4K88mRF\n\tvER1T4DowURU8x7VblX3Qvt0B811tvbr9UjZwJgLAgvK0r+hp2JUGs0c177LJjijqwv6\n\tP/IbUSY0BwYhl++Ut8o/O5bHzgGJdYULiw99s="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=chromium.org\n\theader.i=@chromium.org header.b=\"WLwemewH\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=zFZg7NvAtP7TpvcTqGTrVAsLKJsTL0aijkpLj0/jg88=;\n\tb=EuwPR7OlRFv8P30P7GDrGcRvBRaRCW5EpDtZ1bPTYUXb/MEr8t7YWFpqjkHPIdJ3Tt\n\taFw3IwGqE+1WFYqLZbCOzRl3+ze5Mqbq7ux1XlgehDaOvPoSRC8Nil+/8wPdBU8PoKlH\n\tAwExW+8/LYCX0cQUWli1bT+gPSZNL/HQ6+Xam+jki7tqaGFxJTn4/XVr6abSggVVglLB\n\teDXf84swOYcsXA6lUL5L9opbFo9kgCHsKAkZol1XaJLKLKVvTULQ0C0JDGP37SbHbM0S\n\tekVMUKiAPaWN3+CggTOgIXeEba2IC0XjACvZeyw9akqBXWLputfB31GCLrX6lDAEd7sd\n\tyADQ==","X-Gm-Message-State":"AJIora9ctLOW7Yc/28fUpxa3jMYQKiLpgE5Z//45nb5XPRy/EyOFwRrX\n\t9ogJg10b3QMKp4M4fvhZenqCh5Ld69dIi301C3g2iQ==","X-Google-Smtp-Source":"AGRyM1v2QgCQny4udbCH5Fqa8wE1Rebs28/L2C8I8L/8EkZTQGl/oI33YnvQG6kAwdWcHow6rWE73vkKZVnaWJTHuHY=","X-Received":"by 2002:a05:6512:ad3:b0:489:ec0d:761e with SMTP id\n\tn19-20020a0565120ad300b00489ec0d761emr7850551lfu.2.1659436297401;\n\tTue, 02 Aug 2022 03:31:37 -0700 (PDT)","MIME-Version":"1.0","References":"<20220629103018.4025635-1-chenghaoyang@google.com>\n\t<20220629103018.4025635-10-chenghaoyang@google.com>\n\t<5d593e10-69f7-77c1-3949-e6c7b0d96d45@ideasonboard.com>","In-Reply-To":"<5d593e10-69f7-77c1-3949-e6c7b0d96d45@ideasonboard.com>","Date":"Tue, 2 Aug 2022 18:31:26 +0800","Message-ID":"<CAEB1ahtQTDhJmoEkmzhJ0xVuNcdVzCWchhcA8DWzyPsjrSoVvQ@mail.gmail.com>","To":"Umang Jain <umang.jain@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"00000000000008ccf105e53f9fe6\"","Subject":"Re: [libcamera-devel] [PATCH v3 9/9] ipu3: Fixes frame delay","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>","From":"Cheng-Hao Yang via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Cc":"Harvey Yang <chenghaoyang@google.com>,\n\tlibcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]