diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index 0db84217089e692a..f92cc5b5fa5e777b 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -17,6 +17,7 @@ namespace libcamera {
 class CameraManager;
 class DeviceEnumerator;
 class MediaDevice;
+class Stream;
 
 class Camera;
 class CameraData
@@ -38,6 +39,8 @@ public:
 	PipelineHandler(CameraManager *manager);
 	virtual ~PipelineHandler();
 
+	virtual std::vector<Stream> streams(const Camera *camera) const = 0;
+
 	virtual bool match(DeviceEnumerator *enumerator) = 0;
 
 protected:
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index d74655d037728feb..5c35c7a53b9347a3 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include <libcamera/camera.h>
+#include <libcamera/stream.h>
 
 #include "device_enumerator.h"
 #include "log.h"
@@ -27,6 +28,8 @@ public:
 	PipelineHandlerIPU3(CameraManager *manager);
 	~PipelineHandlerIPU3();
 
+	std::vector<Stream> streams(const Camera *camera) const;
+
 	bool match(DeviceEnumerator *enumerator);
 
 private:
@@ -60,6 +63,15 @@ PipelineHandlerIPU3::~PipelineHandlerIPU3()
 		imgu_->release();
 }
 
+std::vector<Stream> PipelineHandlerIPU3::streams(const Camera *camera) const
+{
+	std::vector<Stream> streams;
+
+	streams.push_back(Stream(0));
+
+	return streams;
+}
+
 bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
 {
 	DeviceMatch cio2_dm("ipu3-cio2");
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index c51e8bc1f2c2bf25..e1f023245b8e63dd 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -6,6 +6,7 @@
  */
 
 #include <libcamera/camera.h>
+#include <libcamera/stream.h>
 
 #include "device_enumerator.h"
 #include "media_device.h"
@@ -20,6 +21,8 @@ public:
 	PipelineHandlerUVC(CameraManager *manager);
 	~PipelineHandlerUVC();
 
+	std::vector<Stream> streams(const Camera *camera) const;
+
 	bool match(DeviceEnumerator *enumerator);
 
 private:
@@ -41,6 +44,15 @@ PipelineHandlerUVC::~PipelineHandlerUVC()
 		media_->release();
 }
 
+std::vector<Stream> PipelineHandlerUVC::streams(const Camera *camera) const
+{
+	std::vector<Stream> streams;
+
+	streams.push_back(Stream(0));
+
+	return streams;
+}
+
 bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
 {
 	DeviceMatch dm("uvcvideo");
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index f58a97d51619515d..a96ec9f431361a32 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -6,6 +6,7 @@
  */
 
 #include <libcamera/camera.h>
+#include <libcamera/stream.h>
 
 #include "device_enumerator.h"
 #include "media_device.h"
@@ -19,6 +20,8 @@ public:
 	PipeHandlerVimc(CameraManager *manager);
 	~PipeHandlerVimc();
 
+	std::vector<Stream> streams(const Camera *camera) const;
+
 	bool match(DeviceEnumerator *enumerator);
 
 private:
@@ -36,6 +39,15 @@ PipeHandlerVimc::~PipeHandlerVimc()
 		media_->release();
 }
 
+std::vector<Stream> PipeHandlerVimc::streams(const Camera *camera) const
+{
+	std::vector<Stream> streams;
+
+	streams.push_back(Stream(0));
+
+	return streams;
+}
+
 bool PipeHandlerVimc::match(DeviceEnumerator *enumerator)
 {
 	DeviceMatch dm("vimc");
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 4d5344988cfe8aa2..a825e7bf882d23c2 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -84,6 +84,18 @@ PipelineHandler::~PipelineHandler()
 	cameraData_.clear();
 };
 
+/**
+ * \fn PipelineHandler::streams(const Camera *camera)
+ * \brief Retrive a array of all streams the camera provides
+ * \param[in] camera The camera to retrieve streams from
+ *
+ * This function is the interface to extract information about streams from a
+ * PipelineHandler.
+ *
+ * \return A array of streams from the camera or a empty list if \a camera
+ *         is not part of the PipelineHandler.
+ */
+
 /**
  * \fn PipelineHandler::match(DeviceEnumerator *enumerator)
  * \brief Match media devices and create camera instances
