[v2,28/32] pipeline: rkisp1: Fix buffer metadata when using the dewarper
diff mbox series

Message ID 20260325151416.2114564-29-stefan.klug@ideasonboard.com
State New
Headers show
Series
  • rkisp1: pipeline rework for PFC
Related show

Commit Message

Stefan Klug March 25, 2026, 3:14 p.m. UTC
When the dewarper is part of the pipeline, the output buffers shall
still carry status (in case of FrameError), timestamp and sequence from
the corresponding image buffer. Timestamp is automatically copied over
by the m2m device. Manually transfer status and sequence.

This change also fixes an issue where frames with error status were
marked as successful after running through the dewarper.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

---

Changes in v2:
- Added this patch
---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index c2af5ef8897f..b6592e87dcc4 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -163,6 +163,10 @@  struct ParamBufferInfo {
 
 struct DewarpBufferInfo {
 	FrameBuffer *inputBuffer;
+	struct {
+		FrameMetadata::Status status;
+		unsigned int sequence;
+	} inputMeta;
 	FrameBuffer *outputBuffer;
 };
 
@@ -1868,7 +1872,11 @@  void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
 	 * for the dewarper are the buffers of the request, supplied by the
 	 * application.
 	 */
-	DewarpBufferInfo dewarpInfo{ buffer, reqInfo->request->findBuffer(&data->mainPathStream_) };
+	DewarpBufferInfo dewarpInfo{
+		buffer,
+		{ metadata.status, metadata.sequence },
+		reqInfo->request->findBuffer(&data->mainPathStream_)
+	};
 	queuedDewarpBuffers_.push_back(dewarpInfo);
 	LOG(RkISP1Schedule, Debug) << "Queue dewarper " << dewarpInfo.inputBuffer
 				   << " " << dewarpInfo.outputBuffer;
@@ -1888,7 +1896,6 @@  void PipelineHandlerRkISP1::imageBufferReady(FrameBuffer *buffer)
 void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)
 {
 	Request *request = buffer->request();
-	const FrameMetadata &metadata = buffer->metadata();
 
 	/*
 	 * After stopping the dewarper, the buffers are returned out of order.
@@ -1899,13 +1906,18 @@  void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)
 		if (dwInfo.outputBuffer != buffer)
 			continue;
 
+		FrameMetadata &outputMeta = buffer->_d()->metadata();
+
+		if (outputMeta.status != FrameMetadata::FrameCancelled &&
+		    dwInfo.inputMeta.status == FrameMetadata::FrameError)
+			outputMeta.status = FrameMetadata::FrameError;
+
+		outputMeta.sequence = dwInfo.inputMeta.sequence;
+
 		availableMainPathBuffers_.push(dwInfo.inputBuffer);
 		dwInfo.inputBuffer = nullptr;
 		dwInfo.outputBuffer = nullptr;
 
-		if (metadata.status == FrameMetadata::FrameCancelled)
-			buffer->_d()->cancel();
-
 		completeBuffer(request, buffer);
 	}