[{"id":32887,"web_url":"https://patchwork.libcamera.org/comment/32887/","msgid":"<RbcaTNvATNfVUu101pubDigsqcSI8pI6icKv6YzKx4eCec3eHFge6i4u2U8O0DJDBq4UOkt1ePcxEPK7GHAfMq6EXX6SFunQhAvHAou0QEY=@protonmail.com>","date":"2024-12-19T21:50:05","subject":"Re: [PATCH v2 1/5] libcamera: software_isp: Track frames and\n\trequests","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"content":"Hi\n\n\n2024. december 19., csütörtök 22:10 keltezéssel, Milan Zamazal <mzamazal@redhat.com> írta:\n\n> Hardware pipelines track requests and other information related to\n> particular frames.  This hasn't been needed in software ISP so far.  But\n> in order to be able to track metadata corresponding to a given frame,\n> frame-request tracking mechanism starts being useful.  This patch\n> introduces the basic tracking structure, actual metadata handling is\n> added in the following patch.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/libcamera/pipeline/simple/simple.cpp | 87 ++++++++++++++++++++++--\n>  1 file changed, 82 insertions(+), 5 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 8ac24e6e..07c1cf1f 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -181,6 +181,70 @@ LOG_DEFINE_CATEGORY(SimplePipeline)\n> \n>  class SimplePipelineHandler;\n> \n> +struct SimpleFrameInfo {\n> +\tuint32_t frame;\n> +\tRequest *request;\n> +};\n> +\n> +class SimpleFrames\n> +{\n> +public:\n> +\tvoid create(Request *request);\n> +\tvoid destroy(uint32_t frame);\n> +\tvoid clear();\n> +\n> +\tSimpleFrameInfo *find(uint32_t frame);\n> +\tSimpleFrameInfo *find(Request *request);\n> +\n> +private:\n> +\tstd::map<uint32_t, SimpleFrameInfo *> frameInfo_;\n> +};\n> +\n> +void SimpleFrames::create(Request *request)\n> +{\n> +\tuint32_t frame = request->sequence();\n> +\tSimpleFrameInfo *info = new SimpleFrameInfo;\n\nAny reason for dynamic allocation? I took a cursory look over the later changes\nand didn't see anything. If there is indeed no reason, please do the following:\n\n  std::map<uint32_t, SimpleFrameInfo> frameInfo_;\n  ...\n  auto [it, inserted] = frameInfo_.try_emplace(request->sequence());\n  ASSERT(inserted); // or whatever is appropriate when the sequence number already exists\n  \n  it->second.... = ...;\n\n\nRegards,\nBarnabás Pőcze\n\n\n> +\tinfo->frame = frame;\n> +\tinfo->request = request;\n> +\tframeInfo_[frame] = info;\n> +}\n> +\n> +void SimpleFrames::destroy(uint32_t frame)\n> +{\n> +\tSimpleFrameInfo *info = find(frame);\n> +\tif (!info)\n> +\t\treturn;\n> +\tdelete info;\n> +\tframeInfo_.erase(frame);\n> +}\n> +\n> +void SimpleFrames::clear()\n> +{\n> +\tfor (const auto &info : frameInfo_)\n> +\t\tdelete info.second;\n> +\tframeInfo_.clear();\n> +}\n> +\n> +SimpleFrameInfo *SimpleFrames::find(uint32_t frame)\n> +{\n> +\tauto info = frameInfo_.find(frame);\n> +\tif (info == frameInfo_.end())\n> +\t\treturn nullptr;\n> +\treturn info->second;\n> +}\n> +\n> +SimpleFrameInfo *SimpleFrames::find(Request *request)\n> +{\n> +\tfor (auto &itInfo : frameInfo_) {\n> +\t\tSimpleFrameInfo *info = itInfo.second;\n> +\n> +\t\tif (info->request == request)\n> +\t\t\treturn info;\n> +\t}\n> +\n> +\treturn nullptr;\n> +}\n> +\n>  struct SimplePipelineInfo {\n>  \tconst char *driver;\n>  \t/*\n> @@ -293,11 +357,13 @@ public:\n> \n>  \tstd::unique_ptr<Converter> converter_;\n>  \tstd::unique_ptr<SoftwareIsp> swIsp_;\n> +\tSimpleFrames frameInfo_;\n> \n>  private:\n>  \tvoid tryPipeline(unsigned int code, const Size &size);\n>  \tstatic std::vector<const MediaPad *> routedSourcePads(MediaPad *sink);\n> \n> +\tvoid completeRequest(Request *request);\n>  \tvoid conversionInputDone(FrameBuffer *buffer);\n>  \tvoid conversionOutputDone(FrameBuffer *buffer);\n> \n> @@ -799,7 +865,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t\t\t/* No conversion, just complete the request. */\n>  \t\t\tRequest *request = buffer->request();\n>  \t\t\tpipe->completeBuffer(request, buffer);\n> -\t\t\tpipe->completeRequest(request);\n> +\t\t\tcompleteRequest(request);\n>  \t\t\treturn;\n>  \t\t}\n> \n> @@ -817,7 +883,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t\tconst RequestOutputs &outputs = conversionQueue_.front();\n>  \t\tfor (auto &[stream, buf] : outputs.outputs)\n>  \t\t\tpipe->completeBuffer(outputs.request, buf);\n> -\t\tpipe->completeRequest(outputs.request);\n> +\t\tcompleteRequest(outputs.request);\n>  \t\tconversionQueue_.pop();\n> \n>  \t\treturn;\n> @@ -875,7 +941,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n> \n>  \t/* Otherwise simply complete the request. */\n>  \tpipe->completeBuffer(request, buffer);\n> -\tpipe->completeRequest(request);\n> +\tcompleteRequest(request);\n>  }\n> \n>  void SimpleCameraData::clearIncompleteRequests()\n> @@ -886,6 +952,14 @@ void SimpleCameraData::clearIncompleteRequests()\n>  \t}\n>  }\n> \n> +void SimpleCameraData::completeRequest(Request *request)\n> +{\n> +\tSimpleFrameInfo *info = frameInfo_.find(request);\n> +\tif (info)\n> +\t\tframeInfo_.destroy(info->frame);\n> +\tpipe()->completeRequest(request);\n> +}\n> +\n>  void SimpleCameraData::conversionInputDone(FrameBuffer *buffer)\n>  {\n>  \t/* Queue the input buffer back for capture. */\n> @@ -899,7 +973,7 @@ void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)\n>  \t/* Complete the buffer and the request. */\n>  \tRequest *request = buffer->request();\n>  \tif (pipe->completeBuffer(request, buffer))\n> -\t\tpipe->completeRequest(request);\n> +\t\tcompleteRequest(request);\n>  }\n> \n>  void SimpleCameraData::ispStatsReady(uint32_t frame, uint32_t bufferId)\n> @@ -1412,6 +1486,7 @@ void SimplePipelineHandler::stopDevice(Camera *camera)\n> \n>  \tvideo->bufferReady.disconnect(data, &SimpleCameraData::imageBufferReady);\n> \n> +\tdata->frameInfo_.clear();\n>  \tdata->clearIncompleteRequests();\n>  \tdata->conversionBuffers_.clear();\n> \n> @@ -1442,8 +1517,10 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)\n> \n>  \tif (data->useConversion_) {\n>  \t\tdata->conversionQueue_.push({ request, std::move(buffers) });\n> -\t\tif (data->swIsp_)\n> +\t\tif (data->swIsp_) {\n> +\t\t\tdata->frameInfo_.create(request);\n>  \t\t\tdata->swIsp_->queueRequest(request->sequence(), request->controls());\n> +\t\t}\n>  \t}\n> \n>  \treturn 0;\n> --\n> 2.44.2\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 E1DFEBD7D8\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 19 Dec 2024 21:50:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1577368482;\n\tThu, 19 Dec 2024 22:50:10 +0100 (CET)","from mail-10630.protonmail.ch (mail-10630.protonmail.ch\n\t[79.135.106.30])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 22C3468471\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Dec 2024 22:50:09 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=protonmail.com header.i=@protonmail.com\n\theader.b=\"MKHjX5tJ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1734645008; x=1734904208;\n\tbh=RnnLTQ0kprMTb+C4g1pivAG64dDRos48zyL+BjvzwYY=;\n\th=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector:List-Unsubscribe:List-Unsubscribe-Post;\n\tb=MKHjX5tJ5+JElz/Ms/Avm2ZTKYEb23f4XHQWz1aqzlM+83IRRIly9Ue+euDt0h98J\n\tz04vLvziWBHWrMzMt4wYcXE7Ye8hslAzhQAUjfcN+vw8A0znpfrSDe7iYxedUtPTSY\n\t1RpAFcz6mADpt9tBPWXKR5Grm8zxW1NfCHCZVQP4fZTWQYGVKN6AFQ0mgb4COALZkI\n\tTBN3jPZWj1aQf/c6lmbrKPp0IIDENRKiUEdfUevPWCX8cU5BNmuxEVkqVfXhf10t37\n\tcVByrgBgQV6JISUQu3djdA1MHma7V4SUUbsD/sgchCktBTskFDsxC1QNqihwj4oQCw\n\tPm3jGNkzsapeA==","Date":"Thu, 19 Dec 2024 21:50:05 +0000","To":"Milan Zamazal <mzamazal@redhat.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v2 1/5] libcamera: software_isp: Track frames and\n\trequests","Message-ID":"<RbcaTNvATNfVUu101pubDigsqcSI8pI6icKv6YzKx4eCec3eHFge6i4u2U8O0DJDBq4UOkt1ePcxEPK7GHAfMq6EXX6SFunQhAvHAou0QEY=@protonmail.com>","In-Reply-To":"<20241219211010.103310-2-mzamazal@redhat.com>","References":"<20241219211010.103310-1-mzamazal@redhat.com>\n\t<20241219211010.103310-2-mzamazal@redhat.com>","Feedback-ID":"20568564:user:proton","X-Pm-Message-ID":"141e222b1a509f7fc75d18aa9dfc0f94ad51c9ee","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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":32920,"web_url":"https://patchwork.libcamera.org/comment/32920/","msgid":"<85ttah9iz8.fsf@mzamazal-thinkpadp1gen3.tpbc.csb>","date":"2025-01-02T18:19:23","subject":"Re: [PATCH v2 1/5] libcamera: software_isp: Track frames and\n\trequests","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Barnabás,\n\nthank you for review.\n\nBarnabás Pőcze <pobrn@protonmail.com> writes:\n\n> Hi\n>\n>\n> 2024. december 19., csütörtök 22:10 keltezéssel, Milan Zamazal <mzamazal@redhat.com> írta:\n>\n>> Hardware pipelines track requests and other information related to\n>> particular frames.  This hasn't been needed in software ISP so far.  But\n>> in order to be able to track metadata corresponding to a given frame,\n>> frame-request tracking mechanism starts being useful.  This patch\n>> introduces the basic tracking structure, actual metadata handling is\n>> added in the following patch.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/libcamera/pipeline/simple/simple.cpp | 87 ++++++++++++++++++++++--\n>>  1 file changed, 82 insertions(+), 5 deletions(-)\n>> \n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index 8ac24e6e..07c1cf1f 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -181,6 +181,70 @@ LOG_DEFINE_CATEGORY(SimplePipeline)\n>> \n>>  class SimplePipelineHandler;\n>> \n>> +struct SimpleFrameInfo {\n>> +\tuint32_t frame;\n>> +\tRequest *request;\n>> +};\n>> +\n>> +class SimpleFrames\n>> +{\n>> +public:\n>> +\tvoid create(Request *request);\n>> +\tvoid destroy(uint32_t frame);\n>> +\tvoid clear();\n>> +\n>> +\tSimpleFrameInfo *find(uint32_t frame);\n>> +\tSimpleFrameInfo *find(Request *request);\n>> +\n>> +private:\n>> +\tstd::map<uint32_t, SimpleFrameInfo *> frameInfo_;\n>> +};\n>> +\n>> +void SimpleFrames::create(Request *request)\n>> +{\n>> +\tuint32_t frame = request->sequence();\n>> +\tSimpleFrameInfo *info = new SimpleFrameInfo;\n>\n> Any reason for dynamic allocation? I took a cursory look over the later changes\n> and didn't see anything. \n\nI followed the patterns from the other pipelines but indeed, I don't\nthink dynamic allocation is needed here.  I'll change it in v3 as you\npropose.\n\n> If there is indeed no reason, please do the following:\n>\n>   std::map<uint32_t, SimpleFrameInfo> frameInfo_;\n>   ...\n>   auto [it, inserted] = frameInfo_.try_emplace(request->sequence());\n>   ASSERT(inserted); // or whatever is appropriate when the sequence number already exists\n>   \n>   it->second.... = ...;\n>\n>\n> Regards,\n> Barnabás Pőcze\n>\n>\n>> +\tinfo->frame = frame;\n>> +\tinfo->request = request;\n>> +\tframeInfo_[frame] = info;\n>> +}\n>> +\n>> +void SimpleFrames::destroy(uint32_t frame)\n>> +{\n>> +\tSimpleFrameInfo *info = find(frame);\n>> +\tif (!info)\n>> +\t\treturn;\n>> +\tdelete info;\n>> +\tframeInfo_.erase(frame);\n>> +}\n>> +\n>> +void SimpleFrames::clear()\n>> +{\n>> +\tfor (const auto &info : frameInfo_)\n>> +\t\tdelete info.second;\n>> +\tframeInfo_.clear();\n>> +}\n>> +\n>> +SimpleFrameInfo *SimpleFrames::find(uint32_t frame)\n>> +{\n>> +\tauto info = frameInfo_.find(frame);\n>> +\tif (info == frameInfo_.end())\n>> +\t\treturn nullptr;\n>> +\treturn info->second;\n>> +}\n>> +\n>> +SimpleFrameInfo *SimpleFrames::find(Request *request)\n>> +{\n>> +\tfor (auto &itInfo : frameInfo_) {\n>> +\t\tSimpleFrameInfo *info = itInfo.second;\n>> +\n>> +\t\tif (info->request == request)\n>> +\t\t\treturn info;\n>> +\t}\n>> +\n>> +\treturn nullptr;\n>> +}\n>> +\n>>  struct SimplePipelineInfo {\n>>  \tconst char *driver;\n>>  \t/*\n>> @@ -293,11 +357,13 @@ public:\n>> \n>>  \tstd::unique_ptr<Converter> converter_;\n>>  \tstd::unique_ptr<SoftwareIsp> swIsp_;\n>> +\tSimpleFrames frameInfo_;\n>> \n>>  private:\n>>  \tvoid tryPipeline(unsigned int code, const Size &size);\n>>  \tstatic std::vector<const MediaPad *> routedSourcePads(MediaPad *sink);\n>> \n>> +\tvoid completeRequest(Request *request);\n>>  \tvoid conversionInputDone(FrameBuffer *buffer);\n>>  \tvoid conversionOutputDone(FrameBuffer *buffer);\n>> \n>> @@ -799,7 +865,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>  \t\t\t/* No conversion, just complete the request. */\n>>  \t\t\tRequest *request = buffer->request();\n>>  \t\t\tpipe->completeBuffer(request, buffer);\n>> -\t\t\tpipe->completeRequest(request);\n>> +\t\t\tcompleteRequest(request);\n>>  \t\t\treturn;\n>>  \t\t}\n>> \n>> @@ -817,7 +883,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>  \t\tconst RequestOutputs &outputs = conversionQueue_.front();\n>>  \t\tfor (auto &[stream, buf] : outputs.outputs)\n>>  \t\t\tpipe->completeBuffer(outputs.request, buf);\n>> -\t\tpipe->completeRequest(outputs.request);\n>> +\t\tcompleteRequest(outputs.request);\n>>  \t\tconversionQueue_.pop();\n>> \n>>  \t\treturn;\n>> @@ -875,7 +941,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>> \n>>  \t/* Otherwise simply complete the request. */\n>>  \tpipe->completeBuffer(request, buffer);\n>> -\tpipe->completeRequest(request);\n>> +\tcompleteRequest(request);\n>>  }\n>> \n>>  void SimpleCameraData::clearIncompleteRequests()\n>> @@ -886,6 +952,14 @@ void SimpleCameraData::clearIncompleteRequests()\n>>  \t}\n>>  }\n>> \n>> +void SimpleCameraData::completeRequest(Request *request)\n>> +{\n>> +\tSimpleFrameInfo *info = frameInfo_.find(request);\n>> +\tif (info)\n>> +\t\tframeInfo_.destroy(info->frame);\n>> +\tpipe()->completeRequest(request);\n>> +}\n>> +\n>>  void SimpleCameraData::conversionInputDone(FrameBuffer *buffer)\n>>  {\n>>  \t/* Queue the input buffer back for capture. */\n>> @@ -899,7 +973,7 @@ void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)\n>>  \t/* Complete the buffer and the request. */\n>>  \tRequest *request = buffer->request();\n>>  \tif (pipe->completeBuffer(request, buffer))\n>> -\t\tpipe->completeRequest(request);\n>> +\t\tcompleteRequest(request);\n>>  }\n>> \n>>  void SimpleCameraData::ispStatsReady(uint32_t frame, uint32_t bufferId)\n>> @@ -1412,6 +1486,7 @@ void SimplePipelineHandler::stopDevice(Camera *camera)\n>> \n>>  \tvideo->bufferReady.disconnect(data, &SimpleCameraData::imageBufferReady);\n>> \n>> +\tdata->frameInfo_.clear();\n>>  \tdata->clearIncompleteRequests();\n>>  \tdata->conversionBuffers_.clear();\n>> \n>> @@ -1442,8 +1517,10 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)\n>> \n>>  \tif (data->useConversion_) {\n>>  \t\tdata->conversionQueue_.push({ request, std::move(buffers) });\n>> -\t\tif (data->swIsp_)\n>> +\t\tif (data->swIsp_) {\n>> +\t\t\tdata->frameInfo_.create(request);\n>>  \t\t\tdata->swIsp_->queueRequest(request->sequence(), request->controls());\n>> +\t\t}\n>>  \t}\n>> \n>>  \treturn 0;\n>> --\n>> 2.44.2\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 61F84C32C2\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  2 Jan 2025 18:19:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5B359684D9;\n\tThu,  2 Jan 2025 19:19:31 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 44FF2684CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  2 Jan 2025 19:19:30 +0100 (CET)","from mail-wr1-f71.google.com (mail-wr1-f71.google.com\n\t[209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-544-LaCcx_ctPBKYbARewu4C9w-1; Thu, 02 Jan 2025 13:19:27 -0500","by mail-wr1-f71.google.com with SMTP id\n\tffacd0b85a97d-385e2579507so5097949f8f.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 02 Jan 2025 10:19:26 -0800 (PST)","from mzamazal-thinkpadp1gen3.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-38a1c8289a0sm39773500f8f.7.2025.01.02.10.19.23\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 02 Jan 2025 10:19:24 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"e474ornK\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1735841968;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=n/LiNTGPzpF4s5ekuSOIFy/EU1tbcsTrexSADn++f58=;\n\tb=e474ornKE7IAs+97abZKod2RUJUqW8q/U5QOTBmRb/TAY6rlbIPWGOjwr3t10oQ1IewDUH\n\tjmDkJB8MDBawUZq36aVkNvpejalFqrgG20J4f2TIo+w2Ttq7bJ5VGFy4XqOIXV8uIUEztx\n\t+EMGa0znrc2775Pe/fZFaeXnH0TZqH0=","X-MC-Unique":"LaCcx_ctPBKYbARewu4C9w-1","X-Mimecast-MFC-AGG-ID":"LaCcx_ctPBKYbARewu4C9w","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1735841966; x=1736446766;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=DTWqidEwZLNKMYS7bnxGoK+nuTUTgj+CWOR93vg1UAo=;\n\tb=EbrdFiUo2payOZUdVzAUkXbBrRX0B1+KUCt77hYwln0h1T70006DKLZIB2yrTC6mHB\n\tj8vQk1kpoY9whCNgcx8840ra+idnn5gbG5bySJMAHA4w2Zq0ag2iARpK6mKb/PjL7tvA\n\te06JEh/fEkIvHEGGof5PAIiI0AQf/SXyFlsKM9t31lPU0HZ0qePsgGuujpz/yq3P9e8l\n\tkkekoMdqXV72Qu8xE9rG9NQxJ5HGfzMRQbR8jrxOW4pY6Ic6kAi/L/OzH2zePqXrXqiO\n\tWxzImGBnCX9ehP7NPpBZ8UfsUSvmlvEXigcDAMNE/9ECkN6nFlLrVkdBtrsDwihX3dAs\n\tiyjw==","X-Gm-Message-State":"AOJu0YwUbJL7RrkWYgHUWFOmsipQ1EzOnvXjQUjPaoy9vILAVrnLzspZ\n\tKYmMxvwJTBs78FSCFZL6Jv4HbueX06gmmfZ39TTjvpVopnbot14FiG5GXYAhh2VyUiVwYTTfDiq\n\tcCU8TIMkrz8OxX6ycLgzUqvwVfrfnfYnOEGx1zLPq6i5VESEX0pMRyU52pgETv6oWjXiizLw=","X-Gm-Gg":"ASbGncuz6huFFamoVUrccImQYzk8GPLOab4myC0J3dEixWUlxDQf0UFvYWXiES6zX0r\n\tuhI2nnauC7nKHmXV4FnV3Mw10LA/iDrfMjve2GbUEdv1nBn5RgV/k2bKm4OAYBIrG/4tawh9DAO\n\tKKryLWwd0qEVYpmH28Pj6nmjGlYpVAhCsZskWg3AvePcaKDtpqHb6ictnpO+oP/54iZ8xWs0lfF\n\td7mqn1c9m2NuYQZIXJ0ACFI6BZjc0PHG3AMFdvvn94hu0Lemv/IpzklJ08e4Y+ghbNslwePpJGc\n\tCFtcLZX/KxANjyY1eIumkMrWOjVIloRONQ==","X-Received":["by 2002:a05:6000:4a01:b0:385:f6c7:90c6 with SMTP id\n\tffacd0b85a97d-38a221eac31mr41740076f8f.20.1735841965762; \n\tThu, 02 Jan 2025 10:19:25 -0800 (PST)","by 2002:a05:6000:4a01:b0:385:f6c7:90c6 with SMTP id\n\tffacd0b85a97d-38a221eac31mr41740062f8f.20.1735841965395; \n\tThu, 02 Jan 2025 10:19:25 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IHseJ1L3z1yN9p1r4cRyRUM51RaAZJJbhn8XYus4LTOf17fXAPSLDOcytsbOjRTa2XSiY2i7w==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v2 1/5] libcamera: software_isp: Track frames and\n\trequests","In-Reply-To":"<RbcaTNvATNfVUu101pubDigsqcSI8pI6icKv6YzKx4eCec3eHFge6i4u2U8O0DJDBq4UOkt1ePcxEPK7GHAfMq6EXX6SFunQhAvHAou0QEY=@protonmail.com>\n\t( =?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Thu,\n\t19 Dec 2024  21:50:05 +0000\")","References":"<20241219211010.103310-1-mzamazal@redhat.com>\n\t<20241219211010.103310-2-mzamazal@redhat.com>\n\t<RbcaTNvATNfVUu101pubDigsqcSI8pI6icKv6YzKx4eCec3eHFge6i4u2U8O0DJDBq4UOkt1ePcxEPK7GHAfMq6EXX6SFunQhAvHAou0QEY=@protonmail.com>","Date":"Thu, 02 Jan 2025 19:19:23 +0100","Message-ID":"<85ttah9iz8.fsf@mzamazal-thinkpadp1gen3.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"JCGVyV0X73bujB15MOyxRx6wyIcCN1jQB_NSctRqaJs_1735841966","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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>"}}]