diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index ad20810e6a26..7ae85e5063db 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -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_);
 
diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
index 76341ed3f363..f03a03fef35c 100644
--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
@@ -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, &paramsBuffers_);
 	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);
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 55d7d4442caf..99347c9f6258 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -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_);
 
