From 5e351b89f047bc11835193f24cf5a832a2c26102 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 15 Aug 2025 13:07:19 +0300 Subject: [PATCH] pipelines: Use lambda functions to factor out buffer mapping code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- 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 ad20810e..bfbc80af 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 76341ed3..97996399 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 55d7d444..291f9683 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_);