[v4,21/22] libcamera: pipeline: Use `metadataAvailable()`
diff mbox series

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

Commit Message

Barnabás Pőcze Jan. 6, 2026, 4:57 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, adjust rpi changes.]
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
changes in v2:
  * include rpi changes as well
---
 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      | 10 +++---
 .../pipeline/rpi/common/pipeline_base.cpp     | 36 +++++++++----------
 src/libcamera/pipeline/simple/simple.cpp      |  6 ++--
 src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  3 +-
 src/libcamera/pipeline/vimc/vimc.cpp          |  3 +-
 src/libcamera/pipeline/virtual/virtual.cpp    |  2 +-
 9 files changed, 39 insertions(+), 42 deletions(-)

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 b1111f19d..ff2c39c70 100644
--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
@@ -1128,10 +1128,7 @@  void PipelineHandlerISI::bufferReady(FrameBuffer *buffer)
 	Request *request = buffer->request();
 
 	/* Record the sensor's timestamp in the request metadata. */
-	ControlList &metadata = request->_d()->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 04549899c..a44d3e7e4 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -1254,7 +1254,7 @@  void IPU3CameraData::metadataReady(unsigned int id, const ControlList &metadata)
 		return;
 
 	Request *request = info->request;
-	request->_d()->metadata().merge(metadata);
+	pipe()->metadataAvailable(request, metadata);
 
 	info->metadataProcessed = true;
 	if (frameInfos_.tryComplete(info))
@@ -1281,12 +1281,14 @@  void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
 
 	pipe()->completeBuffer(request, buffer);
 
-	request->_d()->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->_d()->metadata().set(controls::ScalerCrop, cropRegion_);
+
+	pipe()->metadataAvailable(request, controls::ScalerCrop, cropRegion_);
 
 	if (frameInfos_.tryComplete(info))
 		pipe()->completeRequest(request);
@@ -1326,8 +1328,7 @@  void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
 	 * \todo The sensor timestamp should be better estimated by connecting
 	 * to the V4L2Device::frameStart signal.
 	 */
-	request->_d()->metadata().set(controls::SensorTimestamp,
-				      buffer->metadata().timestamp);
+	pipe()->metadataAvailable(request, controls::SensorTimestamp, buffer->metadata().timestamp);
 
 	info->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);
 
@@ -1421,8 +1422,7 @@  void IPU3CameraData::frameStart(uint32_t sequence)
 		return;
 	}
 
-	request->_d()->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 f66615265..3e40be5f8 100644
--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
@@ -1528,7 +1528,7 @@  void PipelineHandlerMaliC55::statsProcessed(unsigned int requestId,
 	MaliC55FrameInfo &frameInfo = frameInfoMap_[requestId];
 
 	frameInfo.statsDone = true;
-	frameInfo.request->_d()->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 d2cd1d4b8..42a8da65b 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -507,7 +507,7 @@  void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta
 	if (!info)
 		return;
 
-	info->request->_d()->metadata().merge(metadata);
+	pipe()->metadataAvailable(info->request, metadata);
 	info->metadataProcessed = true;
 
 	pipe()->tryCompleteRequest(info);
@@ -1645,8 +1645,7 @@  void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
 		 * \todo The sensor timestamp should be better estimated by connecting
 		 * to the V4L2Device::frameStart signal.
 		 */
-		request->_d()->metadata().set(controls::SensorTimestamp,
-					      metadata.timestamp);
+		metadataAvailable(request, controls::SensorTimestamp, metadata.timestamp);
 
 		if (isRaw_) {
 			const ControlList &ctrls =
@@ -1688,7 +1687,10 @@  void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
 		return;
 	}
 
-	dewarper_->populateMetadata(&data->mainPathStream_, request->_d()->metadata());
+	// FIXME: !!!!
+	ControlList meta;
+	dewarper_->populateMetadata(&data->mainPathStream_, meta);
+	metadataAvailable(request, meta);
 }
 
 void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)
diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
index c50697877..f99d827b9 100644
--- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
@@ -1235,7 +1235,7 @@  void CameraData::metadataReady(const ControlList &metadata)
 	/* Add to the Request metadata buffer what the IPA has provided. */
 	/* Last thing to do is to fill up the request metadata. */
 	Request *request = requestQueue_.front();
-	request->_d()->metadata().merge(metadata);
+	pipe()->metadataAvailable(request, metadata);
 
 	/*
 	 * Inform the sensor of the latest colour gains if it has the
@@ -1505,24 +1505,24 @@  void CameraData::checkRequestCompleted()
 
 void CameraData::fillRequestMetadata(const ControlList &bufferControls, Request *request)
 {
-	if (auto x = bufferControls.get(controls::SensorTimestamp))
-		request->_d()->metadata().set(controls::SensorTimestamp, *x);
-	if (auto x = bufferControls.get(controls::FrameWallClock))
-		request->_d()->metadata().set(controls::FrameWallClock, *x);
-
-	if (cropParams_.size()) {
-		std::vector<Rectangle> crops;
-
-		for (auto const &[k, v] : cropParams_)
-			crops.push_back(scaleIspCrop(v.ispCrop));
-
-		request->_d()->metadata().set(controls::ScalerCrop, crops[0]);
-		if (crops.size() > 1) {
-			request->_d()->metadata().set(controls::rpi::ScalerCrops,
-						      Span<const Rectangle>(crops.data(),
-									    crops.size()));
+	pipe()->metadataAvailable(request, [&](auto set) {
+		if (auto x = bufferControls.get(controls::SensorTimestamp))
+			set(controls::SensorTimestamp, *x);
+		if (auto x = bufferControls.get(controls::FrameWallClock))
+			set(controls::FrameWallClock, *x);
+
+		if (cropParams_.size()) {
+			std::vector<Rectangle> crops;
+
+			for (auto const &[k, v] : cropParams_)
+				crops.push_back(scaleIspCrop(v.ispCrop));
+
+			set(controls::ScalerCrop, crops[0]);
+
+			if (crops.size() > 1)
+				set(controls::rpi::ScalerCrops, { crops.data(), crops.size() });
 		}
-	}
+	});
 }
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index f1925cdf7..81e15f09c 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -940,8 +940,8 @@  void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
 	}
 
 	if (request)
-		request->_d()->metadata().set(controls::SensorTimestamp,
-					      buffer->metadata().timestamp);
+		pipe->metadataAvailable(request, controls::SensorTimestamp,
+					buffer->metadata().timestamp);
 
 	/*
 	 * Queue the captured and the request buffer to the converter or Software
@@ -1036,7 +1036,7 @@  void SimpleCameraData::metadataReady(uint32_t frame, const ControlList &metadata
 	if (!info)
 		return;
 
-	info->request->_d()->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 fcd25cf4e..0b67e39bd 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -897,8 +897,7 @@  void UVCCameraData::imageBufferReady(FrameBuffer *buffer)
 	Request *request = buffer->request();
 
 	/* \todo Use the UVC metadata to calculate a more precise timestamp */
-	request->_d()->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 182aa56e8..7adaa0cc8 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -620,8 +620,7 @@  void VimcCameraData::imageBufferReady(FrameBuffer *buffer)
 	}
 
 	/* Record the sensor's timestamp in the request metadata. */
-	request->_d()->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 40c35264c..bb982a6c0 100644
--- a/src/libcamera/pipeline/virtual/virtual.cpp
+++ b/src/libcamera/pipeline/virtual/virtual.cpp
@@ -366,7 +366,7 @@  int PipelineHandlerVirtual::queueRequestDevice([[maybe_unused]] Camera *camera,
 	VirtualCameraData *data = cameraData(camera);
 	const auto timestamp = currentTimestamp();
 
-	request->_d()->metadata().set(controls::SensorTimestamp, timestamp);
+	metadataAvailable(request, controls::SensorTimestamp, timestamp);
 	data->invokeMethod(&VirtualCameraData::processRequest,
 			   ConnectionTypeQueued, request);