diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index 6922ce18ec..cc52c6b045 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -19,6 +19,7 @@
 
 #include "libcamera/internal/camera_manager.h"
 #include "libcamera/internal/ipa_manager.h"
+#include "libcamera/internal/request.h"
 
 namespace libcamera {
 
@@ -60,7 +61,11 @@ public:
 	void registerRequest(Request *request);
 	void queueRequest(Request *request);
 
-	bool completeBuffer(Request *request, FrameBuffer *buffer);
+	static bool completeBuffer(Request *request, FrameBuffer *buffer)
+	{
+		return request->_d()->completeBuffer(buffer);
+	}
+
 	void completeRequest(Request *request);
 	void cancelRequest(Request *request);
 
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 3d49f85cfa..99f35d1e42 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -544,6 +544,7 @@ void PipelineHandler::doQueueRequests(Camera *camera)
  */
 
 /**
+ * \fn PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer)
  * \brief Complete a buffer for a request
  * \param[in] request The request the buffer belongs to
  * \param[in] buffer The buffer that has completed
@@ -560,10 +561,6 @@ void PipelineHandler::doQueueRequests(Camera *camera)
  * \return True if all buffers contained in the request have completed, false
  * otherwise
  */
-bool PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer)
-{
-	return request->_d()->completeBuffer(buffer);
-}
 
 /**
  * \brief Signal request completion
