[RFC PATCH v1 19/23] libcamera: pipeline: Use `metadataAvailable()`
Barnabás Pőcze
barnabas.pocze at ideasonboard.com
Fri Jun 6 18:41:52 CEST 2025
From: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Use the newly introduced `metadataAvailable()` function to send metadata
items to the application.
Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
[Adjust commit message, split rpi changes.]
Signed-off-by: Barnabás Pőcze <barnabas.pocze at 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?
+ 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
More information about the libcamera-devel
mailing list