[{"id":34576,"web_url":"https://patchwork.libcamera.org/comment/34576/","msgid":"<bmubkr2ebj6lomdsl26ejc6pr5bmxszv4kkzuk2fi2v3mvm6zs@cyku3a4klumj>","date":"2025-06-19T13:55:41","subject":"Re: [RFC PATCH v1 19/23] libcamera: pipeline: Use\n\t`metadataAvailable()`","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"On Fri, Jun 06, 2025 at 06:41:52PM +0200, Barnabás Pőcze wrote:\n> From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n>\n> Use the newly introduced `metadataAvailable()` function to send metadata\n> items to the application.\n>\n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> [Adjust commit message, split rpi changes.]\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n> Original: https://patchwork.libcamera.org/patch/22232/\n> ---\n>  src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  5 +----\n>  src/libcamera/pipeline/ipu3/ipu3.cpp         | 14 +++++++-------\n>  src/libcamera/pipeline/mali-c55/mali-c55.cpp |  2 +-\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 +++----\n>  src/libcamera/pipeline/simple/simple.cpp     |  5 +++--\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  3 +--\n>  src/libcamera/pipeline/vimc/vimc.cpp         |  3 +--\n>  src/libcamera/pipeline/virtual/virtual.cpp   |  2 +-\n>  8 files changed, 18 insertions(+), 23 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> index 1c6da2006..f07df2d59 100644\n> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n> @@ -1100,10 +1100,7 @@ void PipelineHandlerISI::bufferReady(FrameBuffer *buffer)\n>  \tRequest *request = buffer->request();\n>\n>  \t/* Record the sensor's timestamp in the request metadata. */\n> -\tControlList &metadata = request->metadata();\n> -\tif (!metadata.contains(controls::SensorTimestamp.id()))\n> -\t\tmetadata.set(controls::SensorTimestamp,\n> -\t\t\t     buffer->metadata().timestamp);\n> +\tmetadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>\n>  \tcompleteBuffer(request, buffer);\n>  \tif (request->hasPendingBuffers())\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index b4a4283f4..0f59d0727 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -1250,7 +1250,7 @@ void IPU3CameraData::metadataReady(unsigned int id, const ControlList &metadata)\n>  \t\treturn;\n>\n>  \tRequest *request = info->request;\n> -\trequest->metadata().merge(metadata);\n> +\tpipe()->metadataAvailable(request, metadata);\n>\n>  \tinfo->metadataProcessed = true;\n>  \tif (frameInfos_.tryComplete(info))\n> @@ -1277,12 +1277,14 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)\n>\n>  \tpipe()->completeBuffer(request, buffer);\n>\n> -\trequest->metadata().set(controls::draft::PipelineDepth, 3);\n> +\tpipe()->metadataAvailable(request, controls::draft::PipelineDepth, 3);\n> +\n>  \t/* \\todo Actually apply the scaler crop region to the ImgU. */\n>  \tconst auto &scalerCrop = request->controls().get(controls::ScalerCrop);\n>  \tif (scalerCrop)\n>  \t\tcropRegion_ = *scalerCrop;\n> -\trequest->metadata().set(controls::ScalerCrop, cropRegion_);\n> +\n> +\tpipe()->metadataAvailable(request, controls::ScalerCrop, cropRegion_);\n>\n>  \tif (frameInfos_.tryComplete(info))\n>  \t\tpipe()->completeRequest(request);\n> @@ -1322,8 +1324,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)\n>  \t * \\todo The sensor timestamp should be better estimated by connecting\n>  \t * to the V4L2Device::frameStart signal.\n>  \t */\n> -\trequest->metadata().set(controls::SensorTimestamp,\n> -\t\t\t\tbuffer->metadata().timestamp);\n> +\tpipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>\n>  \tinfo->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);\n>\n> @@ -1417,8 +1418,7 @@ void IPU3CameraData::frameStart(uint32_t sequence)\n>  \t\treturn;\n>  \t}\n>\n> -\trequest->metadata().set(controls::draft::TestPatternMode,\n> -\t\t\t\t*testPatternMode);\n> +\tpipe()->metadataAvailable(request, controls::draft::TestPatternMode, *testPatternMode);\n>  }\n>\n>  REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, \"ipu3\")\n> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> index 19980f6d2..d1a107629 100644\n> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n> @@ -1523,7 +1523,7 @@ void PipelineHandlerMaliC55::statsProcessed(unsigned int requestId,\n>  \tMaliC55FrameInfo &frameInfo = frameInfoMap_[requestId];\n>\n>  \tframeInfo.statsDone = true;\n> -\tframeInfo.request->metadata().merge(metadata);\n> +\tmetadataAvailable(frameInfo.request, metadata);\n>\n>  \ttryComplete(&frameInfo);\n>  }\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 34be87087..aa5ea8799 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -433,7 +433,7 @@ void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta\n>  \tif (!info)\n>  \t\treturn;\n>\n> -\tinfo->request->metadata().merge(metadata);\n> +\tpipe()->metadataAvailable(info->request, metadata);\n>  \tinfo->metadataProcessed = true;\n>\n>  \tpipe()->tryCompleteRequest(info);\n> @@ -1476,8 +1476,7 @@ void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)\n>  \t\t * \\todo The sensor timestamp should be better estimated by connecting\n>  \t\t * to the V4L2Device::frameStart signal.\n>  \t\t */\n> -\t\trequest->metadata().set(controls::SensorTimestamp,\n> -\t\t\t\t\tmetadata.timestamp);\n> +\t\tmetadataAvailable(request, controls::SensorTimestamp, metadata.timestamp);\n>\n>  \t\tif (isRaw_) {\n>  \t\t\tconst ControlList &ctrls =\n> @@ -1560,7 +1559,7 @@ void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)\n>  \t\tLOG(RkISP1, Error) << \"Cannot queue buffers to dewarper: \"\n>  \t\t\t\t   << strerror(-ret);\n>\n> -\trequest->metadata().set(controls::ScalerCrop, activeCrop_.value());\n> +\tmetadataAvailable(request, controls::ScalerCrop, activeCrop_.value());\n>  }\n>\n>  void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 05387ca7c..937c781c6 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -909,7 +909,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t}\n>\n>  \tif (request)\n> -\t\trequest->metadata().set(controls::SensorTimestamp,\n> +\t\t// TODO: is this correct? should it be set later?\n\nAt what time would you suggest to set it ? What makes you think this\nis the wrong place ?\n\nIn my understanding this is the time when a buffer is dequeued from\nthe video device, hence the first time we can access the timestamp\ninformation..\n\n\n> +\t\tpipe->metadataAvailable(request, controls::SensorTimestamp,\n>  \t\t\t\t\tbuffer->metadata().timestamp);\n>\n>  \t/*\n> @@ -997,7 +998,7 @@ void SimpleCameraData::metadataReady(uint32_t frame, const ControlList &metadata\n>  \tif (!info)\n>  \t\treturn;\n>\n> -\tinfo->request->metadata().merge(metadata);\n> +\tpipe()->metadataAvailable(info->request, metadata);\n>  \tinfo->metadataProcessed = true;\n>  \ttryCompleteRequest(info->request);\n>  }\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index e0036e3b5..d1bdc1c24 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -883,8 +883,7 @@ void UVCCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \tRequest *request = buffer->request();\n>\n>  \t/* \\todo Use the UVC metadata to calculate a more precise timestamp */\n> -\trequest->metadata().set(controls::SensorTimestamp,\n> -\t\t\t\tbuffer->metadata().timestamp);\n> +\tpipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>\n>  \tpipe()->completeBuffer(request, buffer);\n>  \tpipe()->completeRequest(request);\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index f8a29da41..59445627b 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -617,8 +617,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t}\n>\n>  \t/* Record the sensor's timestamp in the request metadata. */\n> -\trequest->metadata().set(controls::SensorTimestamp,\n> -\t\t\t\tbuffer->metadata().timestamp);\n> +\tpipe->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>\n>  \tpipe->completeBuffer(request, buffer);\n>  \tpipe->completeRequest(request);\n> diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp\n> index 049ebcba5..93c1733d6 100644\n> --- a/src/libcamera/pipeline/virtual/virtual.cpp\n> +++ b/src/libcamera/pipeline/virtual/virtual.cpp\n> @@ -331,7 +331,7 @@ int PipelineHandlerVirtual::queueRequestDevice([[maybe_unused]] Camera *camera,\n>  \t\tASSERT(found);\n>  \t}\n>\n> -\trequest->metadata().set(controls::SensorTimestamp, timestamp);\n> +\tmetadataAvailable(request, controls::SensorTimestamp, timestamp);\n>  \tcompleteRequest(request);\n>\n>  \treturn 0;\n> --\n> 2.49.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 47064BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 19 Jun 2025 13:55:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1EFEA68DE3;\n\tThu, 19 Jun 2025 15:55:45 +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 333CA68DDB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Jun 2025 15:55:44 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 319A62EC;\n\tThu, 19 Jun 2025 15:55:30 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"TegvBCvj\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1750341330;\n\tbh=F2TF1JkHBtxauvNLEjlMX+3GB43lniU9ctNGE0TmYE4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=TegvBCvjBtA5qwVa6kdIg1S9OYvMy+1UbhFtH/3/+8/EfF5j9G9UiUUxPlEHtuSNL\n\tTOSCx1AYELkoouA6BW/pt88FU6W3wJawxBMfm7hhod9xF5oWD3tHKYULQOMTZmCNNR\n\tjBHcD315LQPMwSr5UuFHHcRD7eDIhpZnxF3nEcCw=","Date":"Thu, 19 Jun 2025 15:55:41 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tJacopo Mondi <jacopo.mondi@ideasonboard.com>","Subject":"Re: [RFC PATCH v1 19/23] libcamera: pipeline: Use\n\t`metadataAvailable()`","Message-ID":"<bmubkr2ebj6lomdsl26ejc6pr5bmxszv4kkzuk2fi2v3mvm6zs@cyku3a4klumj>","References":"<20250606164156.1442682-1-barnabas.pocze@ideasonboard.com>\n\t<20250606164156.1442682-20-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20250606164156.1442682-20-barnabas.pocze@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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":34918,"web_url":"https://patchwork.libcamera.org/comment/34918/","msgid":"<8f790087-4942-4f8d-a18c-389a2b4f3b67@ideasonboard.com>","date":"2025-07-17T14:48:14","subject":"Re: [RFC PATCH v1 19/23] libcamera: pipeline: Use\n\t`metadataAvailable()`","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2025. 06. 19. 15:55 keltezéssel, Jacopo Mondi írta:\n> On Fri, Jun 06, 2025 at 06:41:52PM +0200, Barnabás Pőcze wrote:\n>> From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n>>\n>> Use the newly introduced `metadataAvailable()` function to send metadata\n>> items to the application.\n>>\n>> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n>> [Adjust commit message, split rpi changes.]\n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>> Original: https://patchwork.libcamera.org/patch/22232/\n>> ---\n>>   src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  5 +----\n>>   src/libcamera/pipeline/ipu3/ipu3.cpp         | 14 +++++++-------\n>>   src/libcamera/pipeline/mali-c55/mali-c55.cpp |  2 +-\n>>   src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 +++----\n>>   src/libcamera/pipeline/simple/simple.cpp     |  5 +++--\n>>   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  3 +--\n>>   src/libcamera/pipeline/vimc/vimc.cpp         |  3 +--\n>>   src/libcamera/pipeline/virtual/virtual.cpp   |  2 +-\n>>   8 files changed, 18 insertions(+), 23 deletions(-)\n>>\n>> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n>> index 1c6da2006..f07df2d59 100644\n>> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n>> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n>> @@ -1100,10 +1100,7 @@ void PipelineHandlerISI::bufferReady(FrameBuffer *buffer)\n>>   \tRequest *request = buffer->request();\n>>\n>>   \t/* Record the sensor's timestamp in the request metadata. */\n>> -\tControlList &metadata = request->metadata();\n>> -\tif (!metadata.contains(controls::SensorTimestamp.id()))\n>> -\t\tmetadata.set(controls::SensorTimestamp,\n>> -\t\t\t     buffer->metadata().timestamp);\n>> +\tmetadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>>\n>>   \tcompleteBuffer(request, buffer);\n>>   \tif (request->hasPendingBuffers())\n>> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> index b4a4283f4..0f59d0727 100644\n>> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> @@ -1250,7 +1250,7 @@ void IPU3CameraData::metadataReady(unsigned int id, const ControlList &metadata)\n>>   \t\treturn;\n>>\n>>   \tRequest *request = info->request;\n>> -\trequest->metadata().merge(metadata);\n>> +\tpipe()->metadataAvailable(request, metadata);\n>>\n>>   \tinfo->metadataProcessed = true;\n>>   \tif (frameInfos_.tryComplete(info))\n>> @@ -1277,12 +1277,14 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)\n>>\n>>   \tpipe()->completeBuffer(request, buffer);\n>>\n>> -\trequest->metadata().set(controls::draft::PipelineDepth, 3);\n>> +\tpipe()->metadataAvailable(request, controls::draft::PipelineDepth, 3);\n>> +\n>>   \t/* \\todo Actually apply the scaler crop region to the ImgU. */\n>>   \tconst auto &scalerCrop = request->controls().get(controls::ScalerCrop);\n>>   \tif (scalerCrop)\n>>   \t\tcropRegion_ = *scalerCrop;\n>> -\trequest->metadata().set(controls::ScalerCrop, cropRegion_);\n>> +\n>> +\tpipe()->metadataAvailable(request, controls::ScalerCrop, cropRegion_);\n>>\n>>   \tif (frameInfos_.tryComplete(info))\n>>   \t\tpipe()->completeRequest(request);\n>> @@ -1322,8 +1324,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)\n>>   \t * \\todo The sensor timestamp should be better estimated by connecting\n>>   \t * to the V4L2Device::frameStart signal.\n>>   \t */\n>> -\trequest->metadata().set(controls::SensorTimestamp,\n>> -\t\t\t\tbuffer->metadata().timestamp);\n>> +\tpipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>>\n>>   \tinfo->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);\n>>\n>> @@ -1417,8 +1418,7 @@ void IPU3CameraData::frameStart(uint32_t sequence)\n>>   \t\treturn;\n>>   \t}\n>>\n>> -\trequest->metadata().set(controls::draft::TestPatternMode,\n>> -\t\t\t\t*testPatternMode);\n>> +\tpipe()->metadataAvailable(request, controls::draft::TestPatternMode, *testPatternMode);\n>>   }\n>>\n>>   REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, \"ipu3\")\n>> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n>> index 19980f6d2..d1a107629 100644\n>> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n>> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n>> @@ -1523,7 +1523,7 @@ void PipelineHandlerMaliC55::statsProcessed(unsigned int requestId,\n>>   \tMaliC55FrameInfo &frameInfo = frameInfoMap_[requestId];\n>>\n>>   \tframeInfo.statsDone = true;\n>> -\tframeInfo.request->metadata().merge(metadata);\n>> +\tmetadataAvailable(frameInfo.request, metadata);\n>>\n>>   \ttryComplete(&frameInfo);\n>>   }\n>> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> index 34be87087..aa5ea8799 100644\n>> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> @@ -433,7 +433,7 @@ void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta\n>>   \tif (!info)\n>>   \t\treturn;\n>>\n>> -\tinfo->request->metadata().merge(metadata);\n>> +\tpipe()->metadataAvailable(info->request, metadata);\n>>   \tinfo->metadataProcessed = true;\n>>\n>>   \tpipe()->tryCompleteRequest(info);\n>> @@ -1476,8 +1476,7 @@ void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)\n>>   \t\t * \\todo The sensor timestamp should be better estimated by connecting\n>>   \t\t * to the V4L2Device::frameStart signal.\n>>   \t\t */\n>> -\t\trequest->metadata().set(controls::SensorTimestamp,\n>> -\t\t\t\t\tmetadata.timestamp);\n>> +\t\tmetadataAvailable(request, controls::SensorTimestamp, metadata.timestamp);\n>>\n>>   \t\tif (isRaw_) {\n>>   \t\t\tconst ControlList &ctrls =\n>> @@ -1560,7 +1559,7 @@ void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)\n>>   \t\tLOG(RkISP1, Error) << \"Cannot queue buffers to dewarper: \"\n>>   \t\t\t\t   << strerror(-ret);\n>>\n>> -\trequest->metadata().set(controls::ScalerCrop, activeCrop_.value());\n>> +\tmetadataAvailable(request, controls::ScalerCrop, activeCrop_.value());\n>>   }\n>>\n>>   void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)\n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index 05387ca7c..937c781c6 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -909,7 +909,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>   \t}\n>>\n>>   \tif (request)\n>> -\t\trequest->metadata().set(controls::SensorTimestamp,\n>> +\t\t// TODO: is this correct? should it be set later?\n> \n> At what time would you suggest to set it ? What makes you think this\n> is the wrong place ?\n\nI believe my concern was what happens if this runs multiple times for the\nsame request. But now I think that cannot happen, so it should be fine.\n\n\n> \n> In my understanding this is the time when a buffer is dequeued from\n> the video device, hence the first time we can access the timestamp\n> information..\n> \n> \n>> +\t\tpipe->metadataAvailable(request, controls::SensorTimestamp,\n>>   \t\t\t\t\tbuffer->metadata().timestamp);\n>>\n>>   \t/*\n>> @@ -997,7 +998,7 @@ void SimpleCameraData::metadataReady(uint32_t frame, const ControlList &metadata\n>>   \tif (!info)\n>>   \t\treturn;\n>>\n>> -\tinfo->request->metadata().merge(metadata);\n>> +\tpipe()->metadataAvailable(info->request, metadata);\n>>   \tinfo->metadataProcessed = true;\n>>   \ttryCompleteRequest(info->request);\n>>   }\n>> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> index e0036e3b5..d1bdc1c24 100644\n>> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> @@ -883,8 +883,7 @@ void UVCCameraData::imageBufferReady(FrameBuffer *buffer)\n>>   \tRequest *request = buffer->request();\n>>\n>>   \t/* \\todo Use the UVC metadata to calculate a more precise timestamp */\n>> -\trequest->metadata().set(controls::SensorTimestamp,\n>> -\t\t\t\tbuffer->metadata().timestamp);\n>> +\tpipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>>\n>>   \tpipe()->completeBuffer(request, buffer);\n>>   \tpipe()->completeRequest(request);\n>> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n>> index f8a29da41..59445627b 100644\n>> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n>> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n>> @@ -617,8 +617,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)\n>>   \t}\n>>\n>>   \t/* Record the sensor's timestamp in the request metadata. */\n>> -\trequest->metadata().set(controls::SensorTimestamp,\n>> -\t\t\t\tbuffer->metadata().timestamp);\n>> +\tpipe->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);\n>>\n>>   \tpipe->completeBuffer(request, buffer);\n>>   \tpipe->completeRequest(request);\n>> diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp\n>> index 049ebcba5..93c1733d6 100644\n>> --- a/src/libcamera/pipeline/virtual/virtual.cpp\n>> +++ b/src/libcamera/pipeline/virtual/virtual.cpp\n>> @@ -331,7 +331,7 @@ int PipelineHandlerVirtual::queueRequestDevice([[maybe_unused]] Camera *camera,\n>>   \t\tASSERT(found);\n>>   \t}\n>>\n>> -\trequest->metadata().set(controls::SensorTimestamp, timestamp);\n>> +\tmetadataAvailable(request, controls::SensorTimestamp, timestamp);\n>>   \tcompleteRequest(request);\n>>\n>>   \treturn 0;\n>> --\n>> 2.49.0\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3F37BBE175\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 17 Jul 2025 14:48:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 567AC68F84;\n\tThu, 17 Jul 2025 16:48:20 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7405C61517\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 17 Jul 2025 16:48:18 +0200 (CEST)","from [192.168.33.18] (185.221.140.39.nat.pool.zt.hu\n\t[185.221.140.39])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 4D33F7E1;\n\tThu, 17 Jul 2025 16:47:44 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"SJy5fOGB\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1752763664;\n\tbh=D7WJ08103i/QiuT2OUWdixrBBcT5F7P5DwUWhlEnMN4=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=SJy5fOGBRyM+yvaKjT85Iw8B5xLTA06Rizy6dOw4m59EdO9qKmcVoODyjRW+3Ac9w\n\tc39FNdTLEP5jmXq9OGYhWCl0+doBDDh8TU3ExxOPsNUZd+2luNup0c4gu7WT0WgJtb\n\tzgSc3+JyTosEo1Nt0+E2+xO2r4+IhsfJSCRxG2M8=","Message-ID":"<8f790087-4942-4f8d-a18c-389a2b4f3b67@ideasonboard.com>","Date":"Thu, 17 Jul 2025 16:48:14 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [RFC PATCH v1 19/23] libcamera: pipeline: Use\n\t`metadataAvailable()`","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250606164156.1442682-1-barnabas.pocze@ideasonboard.com>\n\t<20250606164156.1442682-20-barnabas.pocze@ideasonboard.com>\n\t<bmubkr2ebj6lomdsl26ejc6pr5bmxszv4kkzuk2fi2v3mvm6zs@cyku3a4klumj>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<bmubkr2ebj6lomdsl26ejc6pr5bmxszv4kkzuk2fi2v3mvm6zs@cyku3a4klumj>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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>"}}]