diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index d7544642fb..d5b8fdb730 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -103,6 +103,8 @@ protected:
 	virtual bool acquireDevice(Camera *camera);
 	virtual void releaseDevice(Camera *camera);
 
+	virtual void buffersAddedDevice(Camera *camera);
+
 	CameraManager *manager_;
 
 private:
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 36e1509b2b..16f218831c 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -672,10 +672,32 @@ void PipelineHandler::cancelRequest(Request *request)
 	completeRequest(request);
 }
 
+/**
+ * \brief Notify about buffer addition
+ * \param[in] camera The camera
+ *
+ * Pipeline handlers may override this function in order to be notified
+ * after buffers have been added to the camera's buffer pool.
+ *
+ * \note This function is only called if the pipeline handler has opted into
+ * using the buffer pool at construction time.
+ *
+ * \context This function is called from the CameraManager thread.
+ *
+ * \todo more info?
+ *
+ * \sa Camera::addBuffer()
+ */
+void PipelineHandler::buffersAddedDevice([[maybe_unused]] Camera *camera)
+{
+}
+
 void PipelineHandler::buffersAdded(Camera *camera)
 {
 	if (!options_.usesBufferPool)
 		doQueueRequests(camera);
+	else
+		buffersAddedDevice(camera);
 }
 
 /**
