@@ -678,15 +678,17 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera)
/* Map buffers to the IPA. */
unsigned int ipaBufferId = 1;
- for (const std::unique_ptr<FrameBuffer> &buffer : imgu->paramBuffers_) {
+ auto pushBuffer = [&](std::vector<IPABuffer> &buffers,
+ const std::unique_ptr<FrameBuffer> &buffer) {
buffer->setCookie(ipaBufferId++);
- ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes());
- }
+ buffers.emplace_back(buffer->cookie(), buffer->planes());
+ };
- for (const std::unique_ptr<FrameBuffer> &buffer : imgu->statBuffers_) {
- buffer->setCookie(ipaBufferId++);
- ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes());
- }
+ for (const std::unique_ptr<FrameBuffer> &buffer : imgu->paramBuffers_)
+ pushBuffer(ipaBuffers_, buffer);
+
+ for (const std::unique_ptr<FrameBuffer> &buffer : imgu->statBuffers_)
+ pushBuffer(ipaBuffers_, buffer);
data->ipa_->mapBuffers(ipaBuffers_);
@@ -1133,27 +1133,27 @@ int PipelineHandlerMaliC55::allocateBuffers(Camera *camera)
data->dsStream_.configuration().bufferCount,
});
+ auto pushBuffer = [&](std::queue<FrameBuffer *> &queue,
+ std::vector<IPABuffer> &buffers,
+ const std::unique_ptr<FrameBuffer> &buffer) {
+ buffer->setCookie(ipaBufferId++);
+ buffers.emplace_back(buffer->cookie(), buffer->planes());
+ queue.push(buffer.get());
+ };
+
ret = stats_->allocateBuffers(bufferCount, &statsBuffers_);
if (ret < 0)
return ret;
- for (std::unique_ptr<FrameBuffer> &buffer : statsBuffers_) {
- buffer->setCookie(ipaBufferId++);
- data->ipaStatBuffers_.emplace_back(buffer->cookie(),
- buffer->planes());
- availableStatsBuffers_.push(buffer.get());
- }
+ for (std::unique_ptr<FrameBuffer> &buffer : statsBuffers_)
+ pushBuffer(availableStatsBuffers_, data->ipaStatBuffers_, buffer);
ret = params_->allocateBuffers(bufferCount, ¶msBuffers_);
if (ret < 0)
return ret;
- for (std::unique_ptr<FrameBuffer> &buffer : paramsBuffers_) {
- buffer->setCookie(ipaBufferId++);
- data->ipaParamBuffers_.emplace_back(buffer->cookie(),
- buffer->planes());
- availableParamsBuffers_.push(buffer.get());
- }
+ for (std::unique_ptr<FrameBuffer> &buffer : paramsBuffers_)
+ pushBuffer(availableParamsBuffers_, data->ipaParamBuffers_, buffer);
if (data->ipa_) {
data->ipa_->mapBuffers(data->ipaStatBuffers_, true);
@@ -1028,19 +1028,19 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
availableMainPathBuffers_.push(buffer.get());
}
- for (std::unique_ptr<FrameBuffer> &buffer : paramBuffers_) {
+ auto pushBuffer = [&](std::vector<IPABuffer> &buffers,
+ std::queue<FrameBuffer *> &queue,
+ const std::unique_ptr<FrameBuffer> &buffer) {
buffer->setCookie(ipaBufferId++);
- data->ipaBuffers_.emplace_back(buffer->cookie(),
- buffer->planes());
- availableParamBuffers_.push(buffer.get());
- }
+ buffers.emplace_back(buffer->cookie(), buffer->planes());
+ queue.push(buffer.get());
+ };
- for (std::unique_ptr<FrameBuffer> &buffer : statBuffers_) {
- buffer->setCookie(ipaBufferId++);
- data->ipaBuffers_.emplace_back(buffer->cookie(),
- buffer->planes());
- availableStatBuffers_.push(buffer.get());
- }
+ for (std::unique_ptr<FrameBuffer> &buffer : paramBuffers_)
+ pushBuffer(data->ipaBuffers_, availableParamBuffers_, buffer);
+
+ for (std::unique_ptr<FrameBuffer> &buffer : statBuffers_)
+ pushBuffer(data->ipaBuffers_, availableStatBuffers_, buffer);
data->ipa_->mapBuffers(data->ipaBuffers_);
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 <laurent.pinchart@ideasonboard.com> --- src/libcamera/pipeline/ipu3/ipu3.cpp | 16 +++++++------ src/libcamera/pipeline/mali-c55/mali-c55.cpp | 24 ++++++++++---------- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 22 +++++++++--------- 3 files changed, 32 insertions(+), 30 deletions(-)