From patchwork Wed Mar 25 15:14:00 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Klug X-Patchwork-Id: 26370 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 90265C3308 for ; Wed, 25 Mar 2026 15:16:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2D7FC62CDB; Wed, 25 Mar 2026 16:16:01 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="OP+ahLJX"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CE69562CC8 for ; Wed, 25 Mar 2026 16:15:59 +0100 (CET) Received: from ideasonboard.com (unknown [IPv6:2a00:6020:448c:6c00:b16a:5ed9:4ada:a95a]) by perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id D30C81BCF; Wed, 25 Mar 2026 16:14:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774451682; bh=+hCmkz/cH1E3R82fgcxsAE8s8Do8XB2aeHYxJIngR2E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OP+ahLJXfI++Ji/ElYzazLhCI/Fzz82p/6dCSkpt+K5XLCskqDONmTx2z6+ytHRhh mvBRBxAg3Svw4KIIPws0z4ONYyKxCt9Bx2hXtogO/YMCfzVebwFFYist6lSaLWJkxl 24k+KKH894oLCk5q/1Yw4VvwKtsK1LefCwR2BTvo= From: Stefan Klug To: libcamera-devel@lists.libcamera.org Cc: Stefan Klug Subject: [PATCH v2 28/32] pipeline: rkisp1: Fix buffer metadata when using the dewarper Date: Wed, 25 Mar 2026 16:14:00 +0100 Message-ID: <20260325151416.2114564-29-stefan.klug@ideasonboard.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260325151416.2114564-1-stefan.klug@ideasonboard.com> References: <20260325151416.2114564-1-stefan.klug@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 --- Changes in v2: - Added this patch --- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) 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); }