diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index bf70255a6a5ea364..9c8ae01ed5c607f1 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -9,6 +9,7 @@
 
 #include <map>
 #include <memory>
+#include <set>
 #include <string>
 
 #include <libcamera/request.h>
@@ -27,7 +28,7 @@ class Camera final
 public:
 	static std::shared_ptr<Camera> create(PipelineHandler *pipe,
 					      const std::string &name,
-					      const std::vector<Stream *> &streams);
+					      const std::set<Stream *> &streams);
 
 	Camera(const Camera &) = delete;
 	Camera &operator=(const Camera &) = delete;
@@ -40,9 +41,9 @@ public:
 	int acquire();
 	void release();
 
-	const std::vector<Stream *> &streams() const;
+	const std::set<Stream *> &streams() const;
 	std::map<Stream *, StreamConfiguration>
-	streamConfiguration(std::vector<Stream *> &streams);
+	streamConfiguration(std::set<Stream *> &streams);
 	int configureStreams(std::map<Stream *, StreamConfiguration> &config);
 
 	int allocateBuffers();
@@ -64,8 +65,8 @@ private:
 
 	std::shared_ptr<PipelineHandler> pipe_;
 	std::string name_;
-	std::vector<Stream *> streams_;
-	std::vector<Stream *> activeStreams_;
+	std::set<Stream *> streams_;
+	std::set<Stream *> activeStreams_;
 
 	bool acquired_;
 	bool disconnected_;
diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index 8df8844c33a2d052..13aa35968f38964d 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -75,10 +75,10 @@ static int parseOptions(int argc, char *argv[])
 	return 0;
 }
 
-static int configureStreams(Camera *camera, std::vector<Stream *> &streams)
+static int configureStreams(Camera *camera, std::set<Stream *> &streams)
 {
 	KeyValueParser::Options format = options[OptFormat];
-	Stream *id = streams.front();
+	Stream *id = *streams.begin();
 
 	std::map<Stream *, StreamConfiguration> config =
 		camera->streamConfiguration(streams);
@@ -132,7 +132,7 @@ static int capture()
 {
 	int ret;
 
-	std::vector<Stream *> streams = camera->streams();
+	std::set<Stream *> streams = camera->streams();
 	std::vector<Request *> requests;
 
 	ret = configureStreams(camera.get(), streams);
@@ -141,7 +141,7 @@ static int capture()
 		return ret;
 	}
 
-	Stream *stream = streams.front();
+	Stream *stream = *streams.begin();
 
 	ret = camera->allocateBuffers();
 	if (ret) {
@@ -237,7 +237,7 @@ int main(int argc, char **argv)
 			goto out;
 		}
 
-		const std::vector<Stream *> &streams = camera->streams();
+		const std::set<Stream *> &streams = camera->streams();
 		if (streams.size() != 1) {
 			std::cout << "Camera has " << streams.size()
 				  << " streams, only 1 is supported"
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 3789732b95d1ae38..84b97b5c2ce94ecf 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -66,7 +66,7 @@ LOG_DECLARE_CATEGORY(Camera)
  */
 std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe,
 				       const std::string &name,
-				       const std::vector<Stream *> &streams)
+				       const std::set<Stream *> &streams)
 {
 	struct Allocator : std::allocator<Camera> {
 		void construct(void *p, PipelineHandler *pipe,
@@ -188,7 +188,7 @@ void Camera::release()
  *
  * \return An array of all the camera's streams.
  */
-const std::vector<Stream *> &Camera::streams() const
+const std::set<Stream *> &Camera::streams() const
 {
 	return streams_;
 }
@@ -210,7 +210,7 @@ const std::vector<Stream *> &Camera::streams() const
  * empty list on error.
  */
 std::map<Stream *, StreamConfiguration>
-Camera::streamConfiguration(std::vector<Stream *> &streams)
+Camera::streamConfiguration(std::set<Stream *> &streams)
 {
 	if (disconnected_ || !streams.size())
 		return std::map<Stream *, StreamConfiguration>{};
@@ -264,7 +264,7 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)
 		const StreamConfiguration &cfg = iter.second;
 
 		stream->configuration_ = cfg;
-		activeStreams_.push_back(stream);
+		activeStreams_.insert(stream);
 
 		/*
 		 * Allocate buffer objects in the pool.
diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index 4363dcd8ed8ead97..4cd9b90c609c067e 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -45,7 +45,7 @@ public:
 	virtual bool match(DeviceEnumerator *enumerator) = 0;
 
 	virtual std::map<Stream *, StreamConfiguration>
-	streamConfiguration(Camera *camera, std::vector<Stream *> &streams) = 0;
+	streamConfiguration(Camera *camera, std::set<Stream *> &streams) = 0;
 	virtual int configureStreams(Camera *camera,
 				     std::map<Stream *, StreamConfiguration> &config) = 0;
 
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 9694d0ce51abda41..1066fbe350d934a0 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -32,7 +32,7 @@ public:
 
 	std::map<Stream *, StreamConfiguration>
 	streamConfiguration(Camera *camera,
-			    std::vector<Stream *> &streams) override;
+			    std::set<Stream *> &streams) override;
 	int configureStreams(Camera *camera,
 			     std::map<Stream *, StreamConfiguration> &config) override;
 
@@ -95,7 +95,7 @@ PipelineHandlerIPU3::~PipelineHandlerIPU3()
 
 std::map<Stream *, StreamConfiguration>
 PipelineHandlerIPU3::streamConfiguration(Camera *camera,
-					 std::vector<Stream *> &streams)
+					 std::set<Stream *> &streams)
 {
 	IPU3CameraData *data = cameraData(camera);
 	std::map<Stream *, StreamConfiguration> configs;
@@ -374,7 +374,7 @@ void PipelineHandlerIPU3::registerCameras()
 		std::unique_ptr<IPU3CameraData> data = utils::make_unique<IPU3CameraData>();
 
 		std::string cameraName = sensor->name() + " " + std::to_string(id);
-		std::vector<Stream *> streams{ &data->stream_ };
+		std::set<Stream *> streams{ &data->stream_ };
 		std::shared_ptr<Camera> camera = Camera::create(this, cameraName, streams);
 
 		/*
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index b7b8ff109109e9c5..7b697c0685630d92 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -27,7 +27,7 @@ public:
 
 	std::map<Stream *, StreamConfiguration>
 	streamConfiguration(Camera *camera,
-			    std::vector<Stream *> &streams) override;
+			    std::set<Stream *> &streams) override;
 	int configureStreams(Camera *camera,
 			     std::map<Stream *, StreamConfiguration> &config) override;
 
@@ -63,7 +63,7 @@ PipelineHandlerUVC::~PipelineHandlerUVC()
 
 std::map<Stream *, StreamConfiguration>
 PipelineHandlerUVC::streamConfiguration(Camera *camera,
-					std::vector<Stream *> &streams)
+					std::set<Stream *> &streams)
 {
 	std::map<Stream *, StreamConfiguration> configs;
 
@@ -171,7 +171,7 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
 		return false;
 	}
 
-	std::vector<Stream *> streams{ &stream_ };
+	std::set<Stream *> streams{ &stream_ };
 	std::shared_ptr<Camera> camera = Camera::create(this, media_->model(), streams);
 	registerCamera(std::move(camera));
 	hotplugMediaDevice(media_.get());
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 812777cffbb3e618..9ba96323d335e010 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -27,7 +27,7 @@ public:
 
 	std::map<Stream *, StreamConfiguration>
 	streamConfiguration(Camera *camera,
-			    std::vector<Stream *> &streams) override;
+			    std::set<Stream *> &streams) override;
 	int configureStreams(Camera *camera,
 			     std::map<Stream *, StreamConfiguration> &config) override;
 
@@ -62,7 +62,7 @@ PipelineHandlerVimc::~PipelineHandlerVimc()
 
 std::map<Stream *, StreamConfiguration>
 PipelineHandlerVimc::streamConfiguration(Camera *camera,
-				     std::vector<Stream *> &streams)
+					 std::set<Stream *> &streams)
 {
 	std::map<Stream *, StreamConfiguration> configs;
 
@@ -171,7 +171,7 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
 		return false;
 	}
 
-	std::vector<Stream *> streams{ &stream_ };
+	std::set<Stream *> streams{ &stream_ };
 	std::shared_ptr<Camera> camera = Camera::create(this, "VIMC Sensor B",
 							streams);
 	registerCamera(std::move(camera));
