From patchwork Thu Sep 4 13:46:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 24283 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 06F02C328C for ; Thu, 4 Sep 2025 13:47:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6FEBD69346; Thu, 4 Sep 2025 15:47:07 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Ig1bEfyS"; 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 EB31C69338 for ; Thu, 4 Sep 2025 15:47:04 +0200 (CEST) Received: from pendragon.ideasonboard.com (230.215-178-91.adsl-dyn.isp.belgacom.be [91.178.215.230]) by perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 8A2E6F09 for ; Thu, 4 Sep 2025 15:45:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1756993555; bh=yP8rwj88dPgAOL7ScJUho2LiEKWBFASC50mUAYHzzII=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Ig1bEfyS1VqMPifQF1wm32khliOPTKEI3rZc+gYKyyXLhahjGD42Qio0XMYZeoGbs AGavCizg6/wxlyt6FiIfypeF/yDUY1hsNF8y6rGSTytubBy1IhuXlq5Mm/+0/fQlMl MTPsRfU0g3MKEpX5TJzm4nI+rU6AHAmu/5tXsSro= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Subject: [PATCH v3 1/2] pipelines: Use lambda functions to factor out buffer mapping code Date: Thu, 4 Sep 2025 15:46:40 +0200 Message-ID: <20250904134641.29597-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.49.1 In-Reply-To: <20250904134641.29597-1-laurent.pinchart@ideasonboard.com> References: <20250904134641.29597-1-laurent.pinchart@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" Multiple pipeline handlers duplicate code related to mapping params and stats buffers to IPA modules. Factor out the code to lambda functions to share it between the two buffer types. Signed-off-by: Laurent Pinchart Reviewed-by: Barnabás Pőcze Reviewed-by: Kieran Bingham --- Changes since v1: - Move for loop to pushBuffers() function - Drop unneeded lambda function arguments --- src/libcamera/pipeline/ipu3/ipu3.cpp | 16 ++++++------ src/libcamera/pipeline/mali-c55/mali-c55.cpp | 26 +++++++++++--------- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 23 +++++++++-------- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index ad20810e6a26..bfbc80af6a3c 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -678,15 +678,15 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera) /* Map buffers to the IPA. */ unsigned int ipaBufferId = 1; - for (const std::unique_ptr &buffer : imgu->paramBuffers_) { - buffer->setCookie(ipaBufferId++); - ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes()); - } + auto pushBuffers = [&](const std::vector> &buffers) { + for (const std::unique_ptr &buffer : buffers) { + buffer->setCookie(ipaBufferId++); + ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes()); + } + }; - for (const std::unique_ptr &buffer : imgu->statBuffers_) { - buffer->setCookie(ipaBufferId++); - ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes()); - } + pushBuffers(imgu->paramBuffers_); + pushBuffers(imgu->statBuffers_); data->ipa_->mapBuffers(ipaBuffers_); diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp index 76341ed3f363..97996399fc51 100644 --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp @@ -1133,27 +1133,29 @@ int PipelineHandlerMaliC55::allocateBuffers(Camera *camera) data->dsStream_.configuration().bufferCount, }); + auto pushBuffers = [&](const std::vector> &buffers, + std::queue &queue, + std::vector &ipaBuffers) { + for (const std::unique_ptr &buffer : buffers) { + buffer->setCookie(ipaBufferId++); + ipaBuffers.emplace_back(buffer->cookie(), buffer->planes()); + queue.push(buffer.get()); + } + }; + ret = stats_->allocateBuffers(bufferCount, &statsBuffers_); if (ret < 0) return ret; - for (std::unique_ptr &buffer : statsBuffers_) { - buffer->setCookie(ipaBufferId++); - data->ipaStatBuffers_.emplace_back(buffer->cookie(), - buffer->planes()); - availableStatsBuffers_.push(buffer.get()); - } + pushBuffers(statsBuffers_, availableStatsBuffers_, + data->ipaStatBuffers_); ret = params_->allocateBuffers(bufferCount, ¶msBuffers_); if (ret < 0) return ret; - for (std::unique_ptr &buffer : paramsBuffers_) { - buffer->setCookie(ipaBufferId++); - data->ipaParamBuffers_.emplace_back(buffer->cookie(), - buffer->planes()); - availableParamsBuffers_.push(buffer.get()); - } + pushBuffers(paramsBuffers_, availableParamsBuffers_, + data->ipaParamBuffers_); if (data->ipa_) { data->ipa_->mapBuffers(data->ipaStatBuffers_, true); diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 55d7d4442caf..291f96836c5e 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -1028,19 +1028,18 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera) availableMainPathBuffers_.push(buffer.get()); } - for (std::unique_ptr &buffer : paramBuffers_) { - buffer->setCookie(ipaBufferId++); - data->ipaBuffers_.emplace_back(buffer->cookie(), - buffer->planes()); - availableParamBuffers_.push(buffer.get()); - } + auto pushBuffers = [&](const std::vector> &buffers, + std::queue &queue) { + for (const std::unique_ptr &buffer : buffers) { + buffer->setCookie(ipaBufferId++); + data->ipaBuffers_.emplace_back(buffer->cookie(), + buffer->planes()); + queue.push(buffer.get()); + } + }; - for (std::unique_ptr &buffer : statBuffers_) { - buffer->setCookie(ipaBufferId++); - data->ipaBuffers_.emplace_back(buffer->cookie(), - buffer->planes()); - availableStatBuffers_.push(buffer.get()); - } + pushBuffers(paramBuffers_, availableParamBuffers_); + pushBuffers(statBuffers_, availableStatBuffers_); data->ipa_->mapBuffers(data->ipaBuffers_);