From patchwork Fri Oct 24 08:50:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Klug X-Patchwork-Id: 24778 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 29268C3259 for ; Fri, 24 Oct 2025 08:52:14 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D4A82608B9; Fri, 24 Oct 2025 10:52:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="WIW8Q8Nu"; 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 C330660871 for ; Fri, 24 Oct 2025 10:52:12 +0200 (CEST) Received: from ideasonboard.com (unknown [IPv6:2a00:6020:448c:6c00:7edc:62f4:c118:1549]) by perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 5502A1E47; Fri, 24 Oct 2025 10:50:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1761295827; bh=vIV9kMVAxEfuUxuZvM48QSwKHrqP3a2E818NTF13OAU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WIW8Q8NuOW3c0FFqMdCVG2lnNNHyCpzMqK2t0U+PWUmBb9aE+o6o7f6SDvR8hP8xN sVwhtrM2NBLotTtX8XnkWMxkMUmn6KnAp8yefkV/KDShj3+EHDSRbfgacy44Xrkry6 xox6bV6b419VoDzpeRZEoieqS3cpaQgU5CCqSZMM= From: Stefan Klug To: libcamera-devel@lists.libcamera.org Cc: Stefan Klug Subject: [PATCH v1 12/35] pipeline: rkisp1: Fix controls in raw mode Date: Fri, 24 Oct 2025 10:50:36 +0200 Message-ID: <20251024085130.995967-13-stefan.klug@ideasonboard.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251024085130.995967-1-stefan.klug@ideasonboard.com> References: <20251024085130.995967-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" After the pipeline restructuring setSensorControls is no longer emitted within process() but within computeParams(). In raw mode computeParams is not called and therefore setSensorControls is never emitted. Fix that by allowing computeParams to be called with an empty bufferId. This strategy is also used for processStats() to ensure that metadata gets filled in raw mode. Then call computeParams within frameStart() when in raw mode. Signed-off-by: Stefan Klug --- src/ipa/rkisp1/rkisp1.cpp | 12 ++++++++++++ src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index ab8583e389d3..ee87c899fcb1 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -343,6 +343,18 @@ void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId) { IPAFrameContext &frameContext = context_.frameContexts.get(frame); + /* + * \todo: This needs discussion. In raw mode, computeParams is + * called without a params buffer, to trigger the setSensorControls + * signal. Currently our algorithms don't support prepare calls with + * a nullptr. Do we need that or can we safely skip it? + */ + if (bufferId == 0) { + ControlList ctrls = getSensorControls(frameContext); + setSensorControls.emit(frame, ctrls); + return; + } + RkISP1Params params(context_.configuration.paramFormat, mappedBuffers_.at(bufferId).planes()[0]); diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 9be9f44db479..0e6e45bba75b 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -1618,6 +1618,10 @@ void PipelineHandlerRkISP1::frameStart(uint32_t sequence) RkISP1CameraData *data = cameraData(activeCamera_); data->delayedCtrls_->applyControls(sequence); + + if (isRaw_) { + data->ipa_->computeParams(sequence + 1, 0); + } } bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)