diff --git a/include/libcamera/framebuffer.h b/include/libcamera/framebuffer.h
index e83825b466aa..653c1a96132f 100644
--- a/include/libcamera/framebuffer.h
+++ b/include/libcamera/framebuffer.h
@@ -58,7 +58,7 @@ public:
 		unsigned int length;
 	};
 
-	FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie = 0);
+	FrameBuffer(Span<const Plane> planes, unsigned int cookie = 0);
 	FrameBuffer(std::unique_ptr<Private> d);
 	virtual ~FrameBuffer() {}
 
diff --git a/include/libcamera/internal/framebuffer.h b/include/libcamera/internal/framebuffer.h
index 97b49d42063f..67b090fc307f 100644
--- a/include/libcamera/internal/framebuffer.h
+++ b/include/libcamera/internal/framebuffer.h
@@ -12,6 +12,7 @@
 #include <utility>
 
 #include <libcamera/base/class.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/fence.h>
 #include <libcamera/framebuffer.h>
@@ -23,7 +24,7 @@ class FrameBuffer::Private : public Extensible::Private
 	LIBCAMERA_DECLARE_PUBLIC(FrameBuffer)
 
 public:
-	Private(const std::vector<Plane> &planes, uint64_t cookie = 0);
+	Private(Span<const Plane> planes, uint64_t cookie = 0);
 	virtual ~Private();
 
 	void setRequest(Request *request) { request_ = request; }
diff --git a/src/android/mm/cros_frame_buffer_allocator.cpp b/src/android/mm/cros_frame_buffer_allocator.cpp
index 264c0d481272..7ec116e1500d 100644
--- a/src/android/mm/cros_frame_buffer_allocator.cpp
+++ b/src/android/mm/cros_frame_buffer_allocator.cpp
@@ -29,7 +29,7 @@ class CrosFrameBufferData : public FrameBuffer::Private
 
 public:
 	CrosFrameBufferData(cros::ScopedBufferHandle scopedHandle,
-			    const std::vector<FrameBuffer::Plane> &planes)
+			    Span<const FrameBuffer::Plane> planes)
 		: FrameBuffer::Private(planes), scopedHandle_(std::move(scopedHandle))
 	{
 	}
diff --git a/src/android/mm/generic_frame_buffer_allocator.cpp b/src/android/mm/generic_frame_buffer_allocator.cpp
index 79625a9a3c75..25ad6b035e73 100644
--- a/src/android/mm/generic_frame_buffer_allocator.cpp
+++ b/src/android/mm/generic_frame_buffer_allocator.cpp
@@ -35,7 +35,7 @@ class GenericFrameBufferData : public FrameBuffer::Private
 public:
 	GenericFrameBufferData(struct alloc_device_t *allocDevice,
 			       buffer_handle_t handle,
-			       const std::vector<FrameBuffer::Plane> &planes)
+			       Span<const FrameBuffer::Plane> planes)
 		: FrameBuffer::Private(planes), allocDevice_(allocDevice),
 		  handle_(handle)
 	{
diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
index 219db50d6527..cb849b8e40fe 100644
--- a/src/libcamera/framebuffer.cpp
+++ b/src/libcamera/framebuffer.cpp
@@ -130,9 +130,9 @@ LOG_DEFINE_CATEGORY(Buffer)
  * \param[in] planes The frame memory planes
  * \param[in] cookie Cookie
  */
-FrameBuffer::Private::Private(const std::vector<Plane> &planes, uint64_t cookie)
-	: planes_(planes), cookie_(cookie), request_(nullptr),
-	  isContiguous_(true)
+FrameBuffer::Private::Private(Span<const Plane> planes, uint64_t cookie)
+	: planes_(std::begin(planes), std::end(planes)), cookie_(cookie),
+	  request_(nullptr), isContiguous_(true)
 {
 	metadata_.planes_.resize(planes_.size());
 }
@@ -315,7 +315,7 @@ ino_t fileDescriptorInode(const SharedFD &fd)
  * \param[in] planes The frame memory planes
  * \param[in] cookie Cookie
  */
-FrameBuffer::FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie)
+FrameBuffer::FrameBuffer(Span<const Plane> planes, unsigned int cookie)
 	: FrameBuffer(std::make_unique<Private>(planes, cookie))
 {
 }
