[v3,31/41] pipeline: rkisp1: Fix buffer metadata when using the dewarper
diff mbox series

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

Commit Message

Stefan Klug Sept. 14, 2026, 2:02 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 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 b051dd21fb4c..ca88f9a521d2 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;
 };
 
@@ -1879,7 +1883,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_)
+	};
 	LOG(RkISP1Schedule, Debug) << "Queue dewarper " << dewarpInfo.inputBuffer
 				   << " " << dewarpInfo.outputBuffer;
 
@@ -1900,7 +1908,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.
@@ -1911,13 +1918,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);
 	}