[{"id":28706,"web_url":"https://patchwork.libcamera.org/comment/28706/","msgid":"<k7suqp2sz2hx32fj7nmfdgelm5agd645sk6d7gwgjucd3xbnq2@bgvjemkevlea>","date":"2024-02-21T10:00:15","subject":"Re: [PATCH v2 3/7] libcamera: rkisp1: Track request->sequence()\n\tinstead of frame_","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Dan\n\nOn Tue, Feb 20, 2024 at 04:43:13PM +0000, Daniel Scally wrote:\n> The rkisp1 pipeline handler currently tries to track the frame number\n> from V4L2 to provide an index to the IPA module's FCQueue - this is\n> not necessary, the Request's sequence does the same job perfectly\n> well.\n>\n> Note that the association of controls and calculated parameters with\n> specific frames is not affected here - the parameters are always\n> applied based on the most recently processed statistics, and the\n> applied controls are fetched separately using the V4L2 provided\n> buffer->metadata().sequence, which value is also internally tracked\n> by DelayedControls.\n\nConsidering that currently data->frame_ gets incremented only when a\nnew request is queued, this doesn't (in principle) change the\ncurrent behaviour if not for the removal of:\n\n\tif (data->frame_ <= buffer->metadata().sequence)\n\t\tdata->frame_ = buffer->metadata().sequence + 1;\n\nThe RkISP1 ISP driver has a global frame counter, shared by all video\ndevices, which is incremented at each vsync. Being the ISP in-line,\nthe sequence number in buffers coming from the video devices actually\nrepresent the sensor's frame sequence numbers.\n\nThe above lines adjust the frame_ value to the 'next' sensor's frame\nnumber in case of a request underrun from the application (ie\napplication does not provide requests fast enough to keep up with the\nframes produced by the sensor).\n\nNow, with your change we always index frames on the IPA FCQ with a\nconsecutive incresaing counter with no gaps in between (the request\nsequence number). How does this work in the context of\nper-frame-control ? Will we be able to detect request queueing\nunderrun and tell applications that they're late (the PFC error\ncondition we spoke when implementing FCQ) ?\n\nWith this change we lose the notion of \"which frame (as produced by\nthe sensor) a request is associated with\" and even if delayed controls\nhelps by tracking the sensor's controls separately, it's something which\nmight not have implications on the current non-PFC implementation, but\nwill have to be taken into account once we move in that direction ?\n\n(How is this patch related to the rest of the series ? Is it required\nto get rid of FrameInfo ?)\n\n>\n> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n> ---\n> Changes in v2:\n>\n> \t- In statReady() I no longer used request->sequence() to fetch from\n> \t  delayedCtrls_ - ensuring that we only use the V4L2 reported sequence\n> \t  there.\n>\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 23 +++++++++--------------\n>  1 file changed, 9 insertions(+), 14 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 586b46d6..d926c83c 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -88,7 +88,7 @@ class RkISP1CameraData : public Camera::Private\n>  public:\n>  \tRkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath,\n>  \t\t\t RkISP1SelfPath *selfPath)\n> -\t\t: Camera::Private(pipe), frame_(0), frameInfo_(pipe),\n> +\t\t: Camera::Private(pipe), frameInfo_(pipe),\n>  \t\t  mainPath_(mainPath), selfPath_(selfPath)\n>  \t{\n>  \t}\n> @@ -100,7 +100,6 @@ public:\n>  \tStream selfPathStream_;\n>  \tstd::unique_ptr<CameraSensor> sensor_;\n>  \tstd::unique_ptr<DelayedControls> delayedCtrls_;\n> -\tunsigned int frame_;\n>  \tstd::vector<IPABuffer> ipaBuffers_;\n>  \tRkISP1Frames frameInfo_;\n>\n> @@ -214,7 +213,7 @@ RkISP1Frames::RkISP1Frames(PipelineHandler *pipe)\n>  RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *request,\n>  \t\t\t\t      bool isRaw)\n>  {\n> -\tunsigned int frame = data->frame_;\n> +\tunsigned int frame = request->sequence();\n>\n>  \tFrameBuffer *paramBuffer = nullptr;\n>  \tFrameBuffer *statBuffer = nullptr;\n> @@ -235,6 +234,7 @@ RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *req\n>\n>  \t\tstatBuffer = pipe_->availableStatBuffers_.front();\n>  \t\tpipe_->availableStatBuffers_.pop();\n> +\t\tstatBuffer->_d()->setRequest(request);\n>  \t}\n>\n>  \tFrameBuffer *mainPathBuffer = request->findBuffer(&data->mainPathStream_);\n> @@ -935,8 +935,6 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL\n>  \t\treturn ret;\n>  \t}\n>\n> -\tdata->frame_ = 0;\n> -\n>  \tif (!isRaw_) {\n>  \t\tret = param_->streamOn();\n>  \t\tif (ret) {\n> @@ -1028,7 +1026,7 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n>  \tif (!info)\n>  \t\treturn -ENOENT;\n>\n> -\tdata->ipa_->queueRequest(data->frame_, request->controls());\n> +\tdata->ipa_->queueRequest(request->sequence(), request->controls());\n>  \tif (isRaw_) {\n>  \t\tif (info->mainPathBuffer)\n>  \t\t\tdata->mainPath_->queueBuffer(info->mainPathBuffer);\n> @@ -1036,12 +1034,10 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n>  \t\tif (data->selfPath_ && info->selfPathBuffer)\n>  \t\t\tdata->selfPath_->queueBuffer(info->selfPathBuffer);\n>  \t} else {\n> -\t\tdata->ipa_->fillParamsBuffer(data->frame_,\n> +\t\tdata->ipa_->fillParamsBuffer(request->sequence(),\n>  \t\t\t\t\t     info->paramBuffer->cookie());\n>  \t}\n>\n> -\tdata->frame_++;\n> -\n>  \treturn 0;\n>  }\n>\n> @@ -1276,7 +1272,8 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)\n>  \t\tif (isRaw_) {\n>  \t\t\tconst ControlList &ctrls =\n>  \t\t\t\tdata->delayedCtrls_->get(metadata.sequence);\n> -\t\t\tdata->ipa_->processStatsBuffer(info->frame, 0, ctrls);\n> +\t\t\tdata->ipa_->processStatsBuffer(request->sequence(),\n> +\t\t\t\t\t\t       0, ctrls);\n>  \t\t}\n>  \t} else {\n>  \t\tif (isRaw_)\n> @@ -1304,6 +1301,7 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)\n>  {\n>  \tASSERT(activeCamera_);\n>  \tRkISP1CameraData *data = cameraData(activeCamera_);\n> +\tRequest *request = buffer->request();\n>\n>  \tRkISP1FrameInfo *info = data->frameInfo_.find(buffer);\n>  \tif (!info)\n> @@ -1315,10 +1313,7 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)\n>  \t\treturn;\n>  \t}\n>\n> -\tif (data->frame_ <= buffer->metadata().sequence)\n> -\t\tdata->frame_ = buffer->metadata().sequence + 1;\n> -\n> -\tdata->ipa_->processStatsBuffer(info->frame, info->statBuffer->cookie(),\n> +\tdata->ipa_->processStatsBuffer(request->sequence(), info->statBuffer->cookie(),\n>  \t\t\t\t       data->delayedCtrls_->get(buffer->metadata().sequence));\n>  }\n>\n> --\n> 2.34.1\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 B41DDC0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 21 Feb 2024 10:00:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9876E6281A;\n\tWed, 21 Feb 2024 11:00:22 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A162C61CA1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 21 Feb 2024 11:00:20 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2001:b07:5d2e:52c9:cc1e:e404:491f:e6ea])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D09963F1;\n\tWed, 21 Feb 2024 11:00:12 +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=\"g1UoirDj\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1708509612;\n\tbh=IEzMh3IVmq8F8cfLpgNpAwkeL/Tt371OPdMVrrX/uwY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=g1UoirDj1jONhwAnqhrobFMe4+GFt51xd9/RmdprnHOe6CWC3FLd3zgdE0p7VBTd5\n\tnyWxGoN/elLH4iz5MFHpLYMaqtgoJw2d5OkzSOzhKrGsbbutvax7vISGYjastuWrRN\n\tbQzmeRNPlAvYqKg6Wo+Id9nmILzBCEmijRWT6hkk=","Date":"Wed, 21 Feb 2024 11:00:15 +0100","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Daniel Scally <dan.scally@ideasonboard.com>","Subject":"Re: [PATCH v2 3/7] libcamera: rkisp1: Track request->sequence()\n\tinstead of frame_","Message-ID":"<k7suqp2sz2hx32fj7nmfdgelm5agd645sk6d7gwgjucd3xbnq2@bgvjemkevlea>","References":"<20240220164317.998477-1-dan.scally@ideasonboard.com>\n\t<20240220164317.998477-4-dan.scally@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240220164317.998477-4-dan.scally@ideasonboard.com>","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","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":28707,"web_url":"https://patchwork.libcamera.org/comment/28707/","msgid":"<ee015508-9dad-4f76-9e31-021c55256af3@ideasonboard.com>","date":"2024-02-21T10:36:01","subject":"Re: [PATCH v2 3/7] libcamera: rkisp1: Track request->sequence()\n\tinstead of frame_","submitter":{"id":156,"url":"https://patchwork.libcamera.org/api/people/156/","name":"Dan Scally","email":"dan.scally@ideasonboard.com"},"content":"Hi Jacopo, thanks for the review\n\nOn 21/02/2024 10:00, Jacopo Mondi wrote:\n> Hi Dan\n>\n> On Tue, Feb 20, 2024 at 04:43:13PM +0000, Daniel Scally wrote:\n>> The rkisp1 pipeline handler currently tries to track the frame number\n>> from V4L2 to provide an index to the IPA module's FCQueue - this is\n>> not necessary, the Request's sequence does the same job perfectly\n>> well.\n>>\n>> Note that the association of controls and calculated parameters with\n>> specific frames is not affected here - the parameters are always\n>> applied based on the most recently processed statistics, and the\n>> applied controls are fetched separately using the V4L2 provided\n>> buffer->metadata().sequence, which value is also internally tracked\n>> by DelayedControls.\n> Considering that currently data->frame_ gets incremented only when a\n> new request is queued, this doesn't (in principle) change the\n> current behaviour if not for the removal of:\n>\n> \tif (data->frame_ <= buffer->metadata().sequence)\n> \t\tdata->frame_ = buffer->metadata().sequence + 1;\n>\n> The RkISP1 ISP driver has a global frame counter, shared by all video\n> devices, which is incremented at each vsync. Being the ISP in-line,\n> the sequence number in buffers coming from the video devices actually\n> represent the sensor's frame sequence numbers.\n>\n> The above lines adjust the frame_ value to the 'next' sensor's frame\n> number in case of a request underrun from the application (ie\n> application does not provide requests fast enough to keep up with the\n> frames produced by the sensor).\n>\n> Now, with your change we always index frames on the IPA FCQ with a\n> consecutive incresaing counter with no gaps in between (the request\n> sequence number). How does this work in the context of\n> per-frame-control ?\n\n\nI'm not really clear how that is envisioned to work, so I don't know.\n\n> Will we be able to detect request queueing\n> underrun and tell applications that they're late (the PFC error\n> condition we spoke when implementing FCQ) ?\n\n\nOn bufferComplete we will, because buffer->metadata().sequence will differ from \nbuffer->request()->sequence.\n\n>\n> With this change we lose the notion of \"which frame (as produced by\n> the sensor) a request is associated with\" and even if delayed controls\n> helps by tracking the sensor's controls separately, it's something which\n> might not have implications on the current non-PFC implementation, but\n> will have to be taken into account once we move in that direction ?\n>\n> (How is this patch related to the rest of the series ? Is it required\n> to get rid of FrameInfo ?)\n\n\nIt's required in the sense that by the time bufferReady()/statReady() is called the data->frame_ \nmember will have been advanced by a subsequent call to queueRequestDevice(), so we couldn't stick to \nthe current behaviour of using frame number to index the FCQ without somehow tracking the frame \nnumber for a particular request (currently that's done through info->frame which is set in \nqueueRequestDevice()). If we need to do that to maintain the current behaviour then let's just go \nwith your plan of deriving a pipeline specific Request::Private class so we can store it there.\n\n\nThanks\n\nDan\n\n>\n>> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n>> ---\n>> Changes in v2:\n>>\n>> \t- In statReady() I no longer used request->sequence() to fetch from\n>> \t  delayedCtrls_ - ensuring that we only use the V4L2 reported sequence\n>> \t  there.\n>>\n>>   src/libcamera/pipeline/rkisp1/rkisp1.cpp | 23 +++++++++--------------\n>>   1 file changed, 9 insertions(+), 14 deletions(-)\n>>\n>> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> index 586b46d6..d926c83c 100644\n>> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> @@ -88,7 +88,7 @@ class RkISP1CameraData : public Camera::Private\n>>   public:\n>>   \tRkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath,\n>>   \t\t\t RkISP1SelfPath *selfPath)\n>> -\t\t: Camera::Private(pipe), frame_(0), frameInfo_(pipe),\n>> +\t\t: Camera::Private(pipe), frameInfo_(pipe),\n>>   \t\t  mainPath_(mainPath), selfPath_(selfPath)\n>>   \t{\n>>   \t}\n>> @@ -100,7 +100,6 @@ public:\n>>   \tStream selfPathStream_;\n>>   \tstd::unique_ptr<CameraSensor> sensor_;\n>>   \tstd::unique_ptr<DelayedControls> delayedCtrls_;\n>> -\tunsigned int frame_;\n>>   \tstd::vector<IPABuffer> ipaBuffers_;\n>>   \tRkISP1Frames frameInfo_;\n>>\n>> @@ -214,7 +213,7 @@ RkISP1Frames::RkISP1Frames(PipelineHandler *pipe)\n>>   RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *request,\n>>   \t\t\t\t      bool isRaw)\n>>   {\n>> -\tunsigned int frame = data->frame_;\n>> +\tunsigned int frame = request->sequence();\n>>\n>>   \tFrameBuffer *paramBuffer = nullptr;\n>>   \tFrameBuffer *statBuffer = nullptr;\n>> @@ -235,6 +234,7 @@ RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *req\n>>\n>>   \t\tstatBuffer = pipe_->availableStatBuffers_.front();\n>>   \t\tpipe_->availableStatBuffers_.pop();\n>> +\t\tstatBuffer->_d()->setRequest(request);\n>>   \t}\n>>\n>>   \tFrameBuffer *mainPathBuffer = request->findBuffer(&data->mainPathStream_);\n>> @@ -935,8 +935,6 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL\n>>   \t\treturn ret;\n>>   \t}\n>>\n>> -\tdata->frame_ = 0;\n>> -\n>>   \tif (!isRaw_) {\n>>   \t\tret = param_->streamOn();\n>>   \t\tif (ret) {\n>> @@ -1028,7 +1026,7 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n>>   \tif (!info)\n>>   \t\treturn -ENOENT;\n>>\n>> -\tdata->ipa_->queueRequest(data->frame_, request->controls());\n>> +\tdata->ipa_->queueRequest(request->sequence(), request->controls());\n>>   \tif (isRaw_) {\n>>   \t\tif (info->mainPathBuffer)\n>>   \t\t\tdata->mainPath_->queueBuffer(info->mainPathBuffer);\n>> @@ -1036,12 +1034,10 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n>>   \t\tif (data->selfPath_ && info->selfPathBuffer)\n>>   \t\t\tdata->selfPath_->queueBuffer(info->selfPathBuffer);\n>>   \t} else {\n>> -\t\tdata->ipa_->fillParamsBuffer(data->frame_,\n>> +\t\tdata->ipa_->fillParamsBuffer(request->sequence(),\n>>   \t\t\t\t\t     info->paramBuffer->cookie());\n>>   \t}\n>>\n>> -\tdata->frame_++;\n>> -\n>>   \treturn 0;\n>>   }\n>>\n>> @@ -1276,7 +1272,8 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)\n>>   \t\tif (isRaw_) {\n>>   \t\t\tconst ControlList &ctrls =\n>>   \t\t\t\tdata->delayedCtrls_->get(metadata.sequence);\n>> -\t\t\tdata->ipa_->processStatsBuffer(info->frame, 0, ctrls);\n>> +\t\t\tdata->ipa_->processStatsBuffer(request->sequence(),\n>> +\t\t\t\t\t\t       0, ctrls);\n>>   \t\t}\n>>   \t} else {\n>>   \t\tif (isRaw_)\n>> @@ -1304,6 +1301,7 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)\n>>   {\n>>   \tASSERT(activeCamera_);\n>>   \tRkISP1CameraData *data = cameraData(activeCamera_);\n>> +\tRequest *request = buffer->request();\n>>\n>>   \tRkISP1FrameInfo *info = data->frameInfo_.find(buffer);\n>>   \tif (!info)\n>> @@ -1315,10 +1313,7 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)\n>>   \t\treturn;\n>>   \t}\n>>\n>> -\tif (data->frame_ <= buffer->metadata().sequence)\n>> -\t\tdata->frame_ = buffer->metadata().sequence + 1;\n>> -\n>> -\tdata->ipa_->processStatsBuffer(info->frame, info->statBuffer->cookie(),\n>> +\tdata->ipa_->processStatsBuffer(request->sequence(), info->statBuffer->cookie(),\n>>   \t\t\t\t       data->delayedCtrls_->get(buffer->metadata().sequence));\n>>   }\n>>\n>> --\n>> 2.34.1\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 ADFCEC0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 21 Feb 2024 10:36:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0D4FD62816;\n\tWed, 21 Feb 2024 11:36:06 +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 010F261CA1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 21 Feb 2024 11:36:03 +0100 (CET)","from [192.168.0.43]\n\t(cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1ECBB2B3;\n\tWed, 21 Feb 2024 11:35:56 +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=\"tRRxb5+Q\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1708511756;\n\tbh=GKc144avvkoCghJ/81rLkauhGKHsPlDiQMqRMEZeAhQ=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=tRRxb5+QsTLa9PmnopgUkip7+1xPPxHA2KirIxB0sIaCEmgmaoK0VBWBC4C9npyb0\n\tGizvxJqAUfO/0kkw/ejo86mkEWVLRTa3A2XpWbWwzHZYJbi2gduuDh+d4VLjSrKshd\n\tZctb00Lk8hAYWzX66L/Cj1vkE9bbeNQ8D1M9ajXk=","Message-ID":"<ee015508-9dad-4f76-9e31-021c55256af3@ideasonboard.com>","Date":"Wed, 21 Feb 2024 10:36:01 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 3/7] libcamera: rkisp1: Track request->sequence()\n\tinstead of frame_","Content-Language":"en-US","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","References":"<20240220164317.998477-1-dan.scally@ideasonboard.com>\n\t<20240220164317.998477-4-dan.scally@ideasonboard.com>\n\t<k7suqp2sz2hx32fj7nmfdgelm5agd645sk6d7gwgjucd3xbnq2@bgvjemkevlea>","From":"Dan Scally <dan.scally@ideasonboard.com>","Autocrypt":"addr=dan.scally@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<k7suqp2sz2hx32fj7nmfdgelm5agd645sk6d7gwgjucd3xbnq2@bgvjemkevlea>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]