[RFC,v1,19/23] libcamera: pipeline: Use `metadataAvailable()`
diff mbox series

Message ID 20250606164156.1442682-20-barnabas.pocze@ideasonboard.com
State New
Headers show
Series
  • libcamera: Add `MetadataList`
Related show

Commit Message

Barnabás Pőcze June 6, 2025, 4:41 p.m. UTC
From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

Use the newly introduced `metadataAvailable()` function to send metadata
items to the application.

Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
[Adjust commit message, split rpi changes.]
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
Original: https://patchwork.libcamera.org/patch/22232/
---
 src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  5 +----
 src/libcamera/pipeline/ipu3/ipu3.cpp         | 14 +++++++-------
 src/libcamera/pipeline/mali-c55/mali-c55.cpp |  2 +-
 src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 +++----
 src/libcamera/pipeline/simple/simple.cpp     |  5 +++--
 src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  3 +--
 src/libcamera/pipeline/vimc/vimc.cpp         |  3 +--
 src/libcamera/pipeline/virtual/virtual.cpp   |  2 +-
 8 files changed, 18 insertions(+), 23 deletions(-)

Comments

Jacopo Mondi June 19, 2025, 1:55 p.m. UTC | #1
On Fri, Jun 06, 2025 at 06:41:52PM +0200, Barnabás Pőcze wrote:
> From: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
>
> Use the newly introduced `metadataAvailable()` function to send metadata
> items to the application.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> [Adjust commit message, split rpi changes.]
> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
> ---
> Original: https://patchwork.libcamera.org/patch/22232/
> ---
>  src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  5 +----
>  src/libcamera/pipeline/ipu3/ipu3.cpp         | 14 +++++++-------
>  src/libcamera/pipeline/mali-c55/mali-c55.cpp |  2 +-
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 +++----
>  src/libcamera/pipeline/simple/simple.cpp     |  5 +++--
>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  3 +--
>  src/libcamera/pipeline/vimc/vimc.cpp         |  3 +--
>  src/libcamera/pipeline/virtual/virtual.cpp   |  2 +-
>  8 files changed, 18 insertions(+), 23 deletions(-)
>
> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
> index 1c6da2006..f07df2d59 100644
> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
> @@ -1100,10 +1100,7 @@ void PipelineHandlerISI::bufferReady(FrameBuffer *buffer)
>  	Request *request = buffer->request();
>
>  	/* Record the sensor's timestamp in the request metadata. */
> -	ControlList &metadata = request->metadata();
> -	if (!metadata.contains(controls::SensorTimestamp.id()))
> -		metadata.set(controls::SensorTimestamp,
> -			     buffer->metadata().timestamp);
> +	metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
>
>  	completeBuffer(request, buffer);
>  	if (request->hasPendingBuffers())
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index b4a4283f4..0f59d0727 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -1250,7 +1250,7 @@ void IPU3CameraData::metadataReady(unsigned int id, const ControlList &metadata)
>  		return;
>
>  	Request *request = info->request;
> -	request->metadata().merge(metadata);
> +	pipe()->metadataAvailable(request, metadata);
>
>  	info->metadataProcessed = true;
>  	if (frameInfos_.tryComplete(info))
> @@ -1277,12 +1277,14 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
>
>  	pipe()->completeBuffer(request, buffer);
>
> -	request->metadata().set(controls::draft::PipelineDepth, 3);
> +	pipe()->metadataAvailable(request, controls::draft::PipelineDepth, 3);
> +
>  	/* \todo Actually apply the scaler crop region to the ImgU. */
>  	const auto &scalerCrop = request->controls().get(controls::ScalerCrop);
>  	if (scalerCrop)
>  		cropRegion_ = *scalerCrop;
> -	request->metadata().set(controls::ScalerCrop, cropRegion_);
> +
> +	pipe()->metadataAvailable(request, controls::ScalerCrop, cropRegion_);
>
>  	if (frameInfos_.tryComplete(info))
>  		pipe()->completeRequest(request);
> @@ -1322,8 +1324,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
>  	 * \todo The sensor timestamp should be better estimated by connecting
>  	 * to the V4L2Device::frameStart signal.
>  	 */
> -	request->metadata().set(controls::SensorTimestamp,
> -				buffer->metadata().timestamp);
> +	pipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
>
>  	info->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);
>
> @@ -1417,8 +1418,7 @@ void IPU3CameraData::frameStart(uint32_t sequence)
>  		return;
>  	}
>
> -	request->metadata().set(controls::draft::TestPatternMode,
> -				*testPatternMode);
> +	pipe()->metadataAvailable(request, controls::draft::TestPatternMode, *testPatternMode);
>  }
>
>  REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, "ipu3")
> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> index 19980f6d2..d1a107629 100644
> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> @@ -1523,7 +1523,7 @@ void PipelineHandlerMaliC55::statsProcessed(unsigned int requestId,
>  	MaliC55FrameInfo &frameInfo = frameInfoMap_[requestId];
>
>  	frameInfo.statsDone = true;
> -	frameInfo.request->metadata().merge(metadata);
> +	metadataAvailable(frameInfo.request, metadata);
>
>  	tryComplete(&frameInfo);
>  }
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 34be87087..aa5ea8799 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -433,7 +433,7 @@ void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta
>  	if (!info)
>  		return;
>
> -	info->request->metadata().merge(metadata);
> +	pipe()->metadataAvailable(info->request, metadata);
>  	info->metadataProcessed = true;
>
>  	pipe()->tryCompleteRequest(info);
> @@ -1476,8 +1476,7 @@ void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
>  		 * \todo The sensor timestamp should be better estimated by connecting
>  		 * to the V4L2Device::frameStart signal.
>  		 */
> -		request->metadata().set(controls::SensorTimestamp,
> -					metadata.timestamp);
> +		metadataAvailable(request, controls::SensorTimestamp, metadata.timestamp);
>
>  		if (isRaw_) {
>  			const ControlList &ctrls =
> @@ -1560,7 +1559,7 @@ void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
>  		LOG(RkISP1, Error) << "Cannot queue buffers to dewarper: "
>  				   << strerror(-ret);
>
> -	request->metadata().set(controls::ScalerCrop, activeCrop_.value());
> +	metadataAvailable(request, controls::ScalerCrop, activeCrop_.value());
>  }
>
>  void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 05387ca7c..937c781c6 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -909,7 +909,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
>  	}
>
>  	if (request)
> -		request->metadata().set(controls::SensorTimestamp,
> +		// TODO: is this correct? should it be set later?

At what time would you suggest to set it ? What makes you think this
is the wrong place ?

In my understanding this is the time when a buffer is dequeued from
the video device, hence the first time we can access the timestamp
information..


> +		pipe->metadataAvailable(request, controls::SensorTimestamp,
>  					buffer->metadata().timestamp);
>
>  	/*
> @@ -997,7 +998,7 @@ void SimpleCameraData::metadataReady(uint32_t frame, const ControlList &metadata
>  	if (!info)
>  		return;
>
> -	info->request->metadata().merge(metadata);
> +	pipe()->metadataAvailable(info->request, metadata);
>  	info->metadataProcessed = true;
>  	tryCompleteRequest(info->request);
>  }
> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> index e0036e3b5..d1bdc1c24 100644
> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> @@ -883,8 +883,7 @@ void UVCCameraData::imageBufferReady(FrameBuffer *buffer)
>  	Request *request = buffer->request();
>
>  	/* \todo Use the UVC metadata to calculate a more precise timestamp */
> -	request->metadata().set(controls::SensorTimestamp,
> -				buffer->metadata().timestamp);
> +	pipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
>
>  	pipe()->completeBuffer(request, buffer);
>  	pipe()->completeRequest(request);
> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
> index f8a29da41..59445627b 100644
> --- a/src/libcamera/pipeline/vimc/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc/vimc.cpp
> @@ -617,8 +617,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)
>  	}
>
>  	/* Record the sensor's timestamp in the request metadata. */
> -	request->metadata().set(controls::SensorTimestamp,
> -				buffer->metadata().timestamp);
> +	pipe->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
>
>  	pipe->completeBuffer(request, buffer);
>  	pipe->completeRequest(request);
> diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp
> index 049ebcba5..93c1733d6 100644
> --- a/src/libcamera/pipeline/virtual/virtual.cpp
> +++ b/src/libcamera/pipeline/virtual/virtual.cpp
> @@ -331,7 +331,7 @@ int PipelineHandlerVirtual::queueRequestDevice([[maybe_unused]] Camera *camera,
>  		ASSERT(found);
>  	}
>
> -	request->metadata().set(controls::SensorTimestamp, timestamp);
> +	metadataAvailable(request, controls::SensorTimestamp, timestamp);
>  	completeRequest(request);
>
>  	return 0;
> --
> 2.49.0
>

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
index 1c6da2006..f07df2d59 100644
--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
@@ -1100,10 +1100,7 @@  void PipelineHandlerISI::bufferReady(FrameBuffer *buffer)
 	Request *request = buffer->request();
 
 	/* Record the sensor's timestamp in the request metadata. */
-	ControlList &metadata = request->metadata();
-	if (!metadata.contains(controls::SensorTimestamp.id()))
-		metadata.set(controls::SensorTimestamp,
-			     buffer->metadata().timestamp);
+	metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
 
 	completeBuffer(request, buffer);
 	if (request->hasPendingBuffers())
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index b4a4283f4..0f59d0727 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -1250,7 +1250,7 @@  void IPU3CameraData::metadataReady(unsigned int id, const ControlList &metadata)
 		return;
 
 	Request *request = info->request;
-	request->metadata().merge(metadata);
+	pipe()->metadataAvailable(request, metadata);
 
 	info->metadataProcessed = true;
 	if (frameInfos_.tryComplete(info))
@@ -1277,12 +1277,14 @@  void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
 
 	pipe()->completeBuffer(request, buffer);
 
-	request->metadata().set(controls::draft::PipelineDepth, 3);
+	pipe()->metadataAvailable(request, controls::draft::PipelineDepth, 3);
+
 	/* \todo Actually apply the scaler crop region to the ImgU. */
 	const auto &scalerCrop = request->controls().get(controls::ScalerCrop);
 	if (scalerCrop)
 		cropRegion_ = *scalerCrop;
-	request->metadata().set(controls::ScalerCrop, cropRegion_);
+
+	pipe()->metadataAvailable(request, controls::ScalerCrop, cropRegion_);
 
 	if (frameInfos_.tryComplete(info))
 		pipe()->completeRequest(request);
@@ -1322,8 +1324,7 @@  void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
 	 * \todo The sensor timestamp should be better estimated by connecting
 	 * to the V4L2Device::frameStart signal.
 	 */
-	request->metadata().set(controls::SensorTimestamp,
-				buffer->metadata().timestamp);
+	pipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
 
 	info->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);
 
@@ -1417,8 +1418,7 @@  void IPU3CameraData::frameStart(uint32_t sequence)
 		return;
 	}
 
-	request->metadata().set(controls::draft::TestPatternMode,
-				*testPatternMode);
+	pipe()->metadataAvailable(request, controls::draft::TestPatternMode, *testPatternMode);
 }
 
 REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, "ipu3")
diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
index 19980f6d2..d1a107629 100644
--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
@@ -1523,7 +1523,7 @@  void PipelineHandlerMaliC55::statsProcessed(unsigned int requestId,
 	MaliC55FrameInfo &frameInfo = frameInfoMap_[requestId];
 
 	frameInfo.statsDone = true;
-	frameInfo.request->metadata().merge(metadata);
+	metadataAvailable(frameInfo.request, metadata);
 
 	tryComplete(&frameInfo);
 }
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 34be87087..aa5ea8799 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -433,7 +433,7 @@  void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta
 	if (!info)
 		return;
 
-	info->request->metadata().merge(metadata);
+	pipe()->metadataAvailable(info->request, metadata);
 	info->metadataProcessed = true;
 
 	pipe()->tryCompleteRequest(info);
@@ -1476,8 +1476,7 @@  void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
 		 * \todo The sensor timestamp should be better estimated by connecting
 		 * to the V4L2Device::frameStart signal.
 		 */
-		request->metadata().set(controls::SensorTimestamp,
-					metadata.timestamp);
+		metadataAvailable(request, controls::SensorTimestamp, metadata.timestamp);
 
 		if (isRaw_) {
 			const ControlList &ctrls =
@@ -1560,7 +1559,7 @@  void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
 		LOG(RkISP1, Error) << "Cannot queue buffers to dewarper: "
 				   << strerror(-ret);
 
-	request->metadata().set(controls::ScalerCrop, activeCrop_.value());
+	metadataAvailable(request, controls::ScalerCrop, activeCrop_.value());
 }
 
 void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 05387ca7c..937c781c6 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -909,7 +909,8 @@  void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
 	}
 
 	if (request)
-		request->metadata().set(controls::SensorTimestamp,
+		// TODO: is this correct? should it be set later?
+		pipe->metadataAvailable(request, controls::SensorTimestamp,
 					buffer->metadata().timestamp);
 
 	/*
@@ -997,7 +998,7 @@  void SimpleCameraData::metadataReady(uint32_t frame, const ControlList &metadata
 	if (!info)
 		return;
 
-	info->request->metadata().merge(metadata);
+	pipe()->metadataAvailable(info->request, metadata);
 	info->metadataProcessed = true;
 	tryCompleteRequest(info->request);
 }
diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index e0036e3b5..d1bdc1c24 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -883,8 +883,7 @@  void UVCCameraData::imageBufferReady(FrameBuffer *buffer)
 	Request *request = buffer->request();
 
 	/* \todo Use the UVC metadata to calculate a more precise timestamp */
-	request->metadata().set(controls::SensorTimestamp,
-				buffer->metadata().timestamp);
+	pipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
 
 	pipe()->completeBuffer(request, buffer);
 	pipe()->completeRequest(request);
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index f8a29da41..59445627b 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -617,8 +617,7 @@  void VimcCameraData::imageBufferReady(FrameBuffer *buffer)
 	}
 
 	/* Record the sensor's timestamp in the request metadata. */
-	request->metadata().set(controls::SensorTimestamp,
-				buffer->metadata().timestamp);
+	pipe->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
 
 	pipe->completeBuffer(request, buffer);
 	pipe->completeRequest(request);
diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp
index 049ebcba5..93c1733d6 100644
--- a/src/libcamera/pipeline/virtual/virtual.cpp
+++ b/src/libcamera/pipeline/virtual/virtual.cpp
@@ -331,7 +331,7 @@  int PipelineHandlerVirtual::queueRequestDevice([[maybe_unused]] Camera *camera,
 		ASSERT(found);
 	}
 
-	request->metadata().set(controls::SensorTimestamp, timestamp);
+	metadataAvailable(request, controls::SensorTimestamp, timestamp);
 	completeRequest(request);
 
 	return 0;