[v1,1/2] treewide: Use `std::span`
diff mbox series

Message ID 20260825123412.837696-2-barnabas.pocze@ideasonboard.com
State New
Headers show
Series
  • treewide: Use `std::span`
Related show

Commit Message

Barnabás Pőcze Aug. 25, 2026, 12:34 p.m. UTC
Now that C++20 is used, convert everything to use `std::span` instead of
`libcamera::Span`. This includes the public interfaces as well.

Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
 Documentation/guides/pipeline-handler.rst     |  4 +-
 include/libcamera/base/file.h                 | 10 ++--
 include/libcamera/base/span.h                 | 12 ++---
 include/libcamera/base/thread.h               |  4 +-
 include/libcamera/camera.h                    |  6 +--
 include/libcamera/controls.h                  | 22 ++++++---
 include/libcamera/framebuffer.h               | 10 ++--
 .../libcamera/internal/byte_stream_buffer.h   |  6 +--
 include/libcamera/internal/camera_sensor.h    |  6 +--
 .../converter/converter_dw100_vertexmap.h     |  5 +-
 include/libcamera/internal/egl.h              | 14 +++---
 include/libcamera/internal/framebuffer.h      |  4 +-
 .../libcamera/internal/mapped_framebuffer.h   |  4 +-
 include/libcamera/internal/matrix.h           | 26 +++++------
 include/libcamera/internal/pipeline_handler.h |  2 +-
 include/libcamera/internal/process.h          |  6 +--
 include/libcamera/internal/pub_key.h          |  7 ++-
 .../libcamera/internal/shared_mem_object.h    |  6 +--
 include/libcamera/internal/v4l2_device.h      |  6 +--
 include/libcamera/internal/vector.h           |  4 +-
 src/android/camera_buffer.h                   | 11 +++--
 src/android/camera_capabilities.cpp           |  3 +-
 src/android/camera_request.cpp                |  4 +-
 src/android/jpeg/encoder.h                    |  4 +-
 src/android/jpeg/encoder_jea.cpp              |  2 +-
 src/android/jpeg/encoder_jea.h                |  2 +-
 src/android/jpeg/encoder_libjpeg.cpp          | 10 ++--
 src/android/jpeg/encoder_libjpeg.h            | 12 ++---
 src/android/jpeg/exif.cpp                     |  2 +-
 src/android/jpeg/exif.h                       |  7 ++-
 src/android/jpeg/post_processor_jpeg.cpp      |  2 +-
 src/android/mm/cros_camera_buffer.cpp         |  4 +-
 .../mm/cros_frame_buffer_allocator.cpp        |  2 +-
 src/android/mm/generic_camera_buffer.cpp      |  4 +-
 .../mm/generic_frame_buffer_allocator.cpp     |  2 +-
 src/apps/cam/capture_script.cpp               | 12 ++---
 src/apps/cam/drm.cpp                          |  6 +--
 src/apps/cam/drm.h                            |  4 +-
 src/apps/cam/file_sink.cpp                    |  2 +-
 src/apps/cam/sdl_sink.cpp                     |  4 +-
 src/apps/cam/sdl_texture.h                    |  4 +-
 src/apps/cam/sdl_texture_1plane.cpp           |  2 +-
 src/apps/cam/sdl_texture_1plane.h             |  2 +-
 src/apps/cam/sdl_texture_mjpg.cpp             |  4 +-
 src/apps/cam/sdl_texture_mjpg.h               |  4 +-
 src/apps/cam/sdl_texture_yuv.cpp              |  2 +-
 src/apps/cam/sdl_texture_yuv.h                |  2 +-
 src/apps/common/dng_writer.cpp                |  4 +-
 src/apps/common/image.cpp                     |  6 +--
 src/apps/common/image.h                       | 10 ++--
 src/apps/common/ppm_writer.cpp                |  2 +-
 src/apps/common/ppm_writer.h                  |  4 +-
 src/apps/ipa-verify/main.cpp                  |  4 +-
 src/apps/lc-compliance/helpers/capture.cpp    |  2 +-
 src/apps/lc-compliance/helpers/capture.h      |  3 +-
 src/gstreamer/gstlibcamera-controls.cpp.in    |  4 +-
 src/gstreamer/gstlibcamera-utils.cpp          | 20 ++++----
 src/ipa/ipu3/algorithms/af.cpp                |  6 +--
 src/ipa/ipu3/algorithms/af.h                  |  2 +-
 src/ipa/ipu3/algorithms/agc.cpp               |  2 +-
 src/ipa/ipu3/ipu3.cpp                         |  8 ++--
 src/ipa/libipa/awb.h                          |  2 +-
 src/ipa/libipa/awb_bayes.cpp                  |  2 +-
 src/ipa/libipa/awb_bayes.h                    |  4 +-
 src/ipa/libipa/exposure_mode_helper.cpp       |  2 +-
 src/ipa/libipa/exposure_mode_helper.h         |  4 +-
 src/ipa/libipa/histogram.cpp                  |  4 +-
 src/ipa/libipa/histogram.h                    |  8 ++--
 src/ipa/libipa/lsc_base.h                     |  2 -
 src/ipa/libipa/lsc_polynomial.cpp             |  4 +-
 src/ipa/libipa/lsc_polynomial.h               |  7 ++-
 src/ipa/libipa/lsc_table.h                    |  1 -
 src/ipa/libipa/v4l2_params.cpp                | 12 ++---
 src/ipa/libipa/v4l2_params.h                  | 18 ++++----
 src/ipa/libipa/v4l2_stats.cpp                 |  8 ++--
 src/ipa/libipa/v4l2_stats.h                   | 13 +++---
 src/ipa/mali-c55/algorithms/agc.cpp           | 10 ++--
 src/ipa/mali-c55/mali-c55.cpp                 |  4 +-
 src/ipa/mali-c55/params.h                     |  2 +-
 src/ipa/rkisp1/algorithms/agc.cpp             |  2 +-
 src/ipa/rkisp1/algorithms/agc.h               |  7 +--
 src/ipa/rkisp1/algorithms/lsc.cpp             |  3 +-
 src/ipa/rkisp1/params.cpp                     |  2 +-
 src/ipa/rkisp1/params.h                       |  8 ++--
 src/ipa/rkisp1/rkisp1.cpp                     |  2 +-
 src/ipa/rpi/cam_helper/cam_helper.cpp         |  4 +-
 src/ipa/rpi/cam_helper/cam_helper.h           |  6 +--
 src/ipa/rpi/cam_helper/cam_helper_imx296.cpp  |  4 +-
 src/ipa/rpi/cam_helper/cam_helper_imx477.cpp  |  4 +-
 src/ipa/rpi/cam_helper/cam_helper_imx519.cpp  |  4 +-
 src/ipa/rpi/cam_helper/cam_helper_imx708.cpp  |  4 +-
 src/ipa/rpi/cam_helper/md_parser.h            |  9 ++--
 src/ipa/rpi/cam_helper/md_parser_smia.cpp     |  4 +-
 src/ipa/rpi/common/ipa_base.cpp               | 20 ++++----
 src/ipa/rpi/common/ipa_base.h                 |  2 +-
 src/ipa/rpi/controller/af_algorithm.h         |  5 +-
 src/ipa/rpi/controller/rpi/af.cpp             |  2 +-
 src/ipa/rpi/controller/rpi/af.h               |  2 +-
 src/ipa/rpi/controller/rpi/alsc.cpp           |  2 +-
 src/ipa/rpi/controller/rpi/awb_nn.cpp         |  3 +-
 src/ipa/rpi/pisp/pisp.cpp                     | 10 ++--
 src/ipa/rpi/vc4/vc4.cpp                       | 46 +++++++++----------
 src/libcamera/base/backtrace.cpp              |  8 ++--
 src/libcamera/base/file.cpp                   |  6 +--
 src/libcamera/base/thread.cpp                 |  2 +-
 src/libcamera/byte_stream_buffer.cpp          |  8 ++--
 src/libcamera/camera.cpp                      |  2 +-
 src/libcamera/control_ids_rpi.yaml            |  4 +-
 src/libcamera/control_serializer.cpp          |  2 +-
 src/libcamera/controls.cpp                    | 22 ++++-----
 src/libcamera/converter/converter_dw100.cpp   |  2 +-
 .../converter/converter_dw100_vertexmap.cpp   |  4 +-
 src/libcamera/egl.cpp                         | 12 ++---
 src/libcamera/framebuffer.cpp                 |  6 +--
 src/libcamera/ipa_data_serializer.cpp         |  2 +-
 src/libcamera/ipa_manager.cpp                 |  2 +-
 src/libcamera/ipa_module.cpp                  | 16 +++----
 src/libcamera/mapped_framebuffer.cpp          |  4 +-
 src/libcamera/matrix.cpp                      | 36 +++++++--------
 src/libcamera/pipeline/imx8-isi/imx8-isi.cpp  |  4 +-
 src/libcamera/pipeline/ipu3/ipu3.cpp          |  6 +--
 src/libcamera/pipeline/mali-c55/mali-c55.cpp  |  6 +--
 src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  6 +--
 src/libcamera/pipeline/rkisp1/rkisp1_path.cpp |  2 +-
 src/libcamera/pipeline/rkisp1/rkisp1_path.h   |  6 +--
 .../pipeline/rpi/common/pipeline_base.cpp     | 12 ++---
 .../pipeline/rpi/common/pipeline_base.h       |  2 +-
 src/libcamera/pipeline/rpi/pisp/pisp.cpp      |  4 +-
 src/libcamera/pipeline/rpi/vc4/vc4.cpp        |  2 +-
 src/libcamera/pipeline/simple/simple.cpp      |  4 +-
 src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  6 +--
 src/libcamera/pipeline/vimc/vimc.cpp          |  6 +--
 src/libcamera/pipeline/virtual/virtual.cpp    |  6 +--
 src/libcamera/process.cpp                     |  4 +-
 src/libcamera/pub_key.cpp                     |  6 +--
 src/libcamera/sensor/camera_sensor_legacy.cpp |  8 ++--
 src/libcamera/sensor/camera_sensor_raw.cpp    |  8 ++--
 src/libcamera/shared_mem_object.cpp           |  6 +--
 src/libcamera/software_isp/debayer_egl.cpp    |  6 +--
 src/libcamera/v4l2_device.cpp                 | 14 +++---
 src/libcamera/v4l2_videodevice.cpp            |  6 +--
 src/libcamera/value_node.cpp                  |  4 +-
 src/libcamera/vector.cpp                      |  2 +-
 src/libcamera/yaml_parser.cpp                 |  2 +-
 src/py/libcamera/py_helpers.cpp               |  2 +-
 src/py/libcamera/py_main.cpp                  |  4 +-
 src/v4l2/v4l2_camera_proxy.cpp                |  2 +-
 src/v4l2/v4l2_compat_manager.cpp              |  2 +-
 test/controls/control_value.cpp               | 28 +++++------
 test/file.cpp                                 |  2 +-
 test/utils.cpp                                |  4 +-
 test/v4l2_videodevice/controls.cpp            |  4 +-
 utils/codegen/controls.py                     |  4 +-
 utils/gen-debug-controls.py                   |  6 +--
 154 files changed, 481 insertions(+), 475 deletions(-)

Patch
diff mbox series

diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst
index b33d8b8574..e630199a5f 100644
--- a/Documentation/guides/pipeline-handler.rst
+++ b/Documentation/guides/pipeline-handler.rst
@@ -202,7 +202,7 @@  stub implementations for the overridden class members.
           PipelineHandlerVivid(CameraManager *manager);
 
           std::unique_ptr<CameraConfiguration>
-          generateConfiguration(Camera *camera, Span<const StreamRole> roles) override;
+          generateConfiguration(Camera *camera, std::span<const StreamRole> roles) override;
           int configure(Camera *camera, CameraConfiguration *config) override;
 
           int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -223,7 +223,7 @@  stub implementations for the overridden class members.
 
    std::unique_ptr<CameraConfiguration>
    PipelineHandlerVivid::generateConfiguration(Camera *camera,
-                                               Span<const StreamRole> roles)
+                                               std::span<const StreamRole> roles)
    {
           return nullptr;
    }
diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
index 6d3f106d59..d99ff5f2db 100644
--- a/include/libcamera/base/file.h
+++ b/include/libcamera/base/file.h
@@ -8,6 +8,7 @@ 
 #pragma once
 
 #include <map>
+#include <span>
 #include <stdint.h>
 #include <string>
 #include <sys/types.h>
@@ -16,7 +17,6 @@ 
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/flags.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/unique_fd.h>
 
 namespace libcamera {
@@ -59,11 +59,11 @@  public:
 	off_t pos() const;
 	off_t seek(off_t pos);
 
-	ssize_t read(const Span<uint8_t> &data);
-	ssize_t write(const Span<const uint8_t> &data);
+	ssize_t read(std::span<uint8_t> data);
+	ssize_t write(std::span<const uint8_t> data);
 
-	Span<uint8_t> map(off_t offset = 0, ssize_t size = -1,
-			  MapFlags flags = MapFlag::NoOption);
+	std::span<uint8_t> map(off_t offset = 0, ssize_t size = -1,
+			       MapFlags flags = MapFlag::NoOption);
 	bool unmap(uint8_t *addr);
 
 	static bool exists(const std::string &name);
diff --git a/include/libcamera/base/span.h b/include/libcamera/base/span.h
index 806db106e8..5c7a98d8e7 100644
--- a/include/libcamera/base/span.h
+++ b/include/libcamera/base/span.h
@@ -30,11 +30,11 @@  struct is_array<std::array<U, N>> : public std::true_type {
 };
 
 template<typename U>
-struct is_span : public std::false_type {
+struct is_libcamera_span : public std::false_type {
 };
 
 template<typename U, std::size_t Extent>
-struct is_span<Span<U, Extent>> : public std::true_type {
+struct is_libcamera_span<Span<U, Extent>> : public std::true_type {
 };
 
 } /* namespace details */
@@ -153,7 +153,7 @@  public:
 
 	template<class Container>
 	explicit constexpr Span(Container &cont,
-				std::enable_if_t<!details::is_span<Container>::value &&
+				std::enable_if_t<!details::is_libcamera_span<Container>::value &&
 						 !details::is_array<Container>::value &&
 						 !std::is_array<Container>::value &&
 						 std::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],
@@ -165,7 +165,7 @@  public:
 
 	template<class Container>
 	explicit constexpr Span(const Container &cont,
-				std::enable_if_t<!details::is_span<Container>::value &&
+				std::enable_if_t<!details::is_libcamera_span<Container>::value &&
 						 !details::is_array<Container>::value &&
 						 !std::is_array<Container>::value &&
 						 std::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],
@@ -315,7 +315,7 @@  public:
 
 	template<class Container>
 	constexpr Span(Container &cont,
-		       std::enable_if_t<!details::is_span<Container>::value &&
+		       std::enable_if_t<!details::is_libcamera_span<Container>::value &&
 					!details::is_array<Container>::value &&
 					!std::is_array<Container>::value &&
 					std::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],
@@ -327,7 +327,7 @@  public:
 
 	template<class Container>
 	constexpr Span(const Container &cont,
-		       std::enable_if_t<!details::is_span<Container>::value &&
+		       std::enable_if_t<!details::is_libcamera_span<Container>::value &&
 					!details::is_array<Container>::value &&
 					!std::is_array<Container>::value &&
 					std::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],
diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h
index 6aa36fa1bf..758439840d 100644
--- a/include/libcamera/base/thread.h
+++ b/include/libcamera/base/thread.h
@@ -8,6 +8,7 @@ 
 #pragma once
 
 #include <memory>
+#include <span>
 #include <string>
 #include <sys/types.h>
 #include <thread>
@@ -17,7 +18,6 @@ 
 #include <libcamera/base/class.h>
 #include <libcamera/base/message.h>
 #include <libcamera/base/signal.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 namespace libcamera {
@@ -38,7 +38,7 @@  public:
 	void exit(int code = 0);
 	bool wait(utils::duration duration = utils::duration::max());
 
-	int setThreadAffinity(const Span<const unsigned int> &cpus);
+	int setThreadAffinity(std::span<const unsigned int> cpus);
 
 	bool isRunning();
 
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index 443116b588..c767f0f76f 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -11,6 +11,7 @@ 
 #include <memory>
 #include <optional>
 #include <set>
+#include <span>
 #include <stdint.h>
 #include <string>
 
@@ -18,7 +19,6 @@ 
 #include <libcamera/base/flags.h>
 #include <libcamera/base/object.h>
 #include <libcamera/base/signal.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/controls.h>
 #include <libcamera/geometry.h>
@@ -136,12 +136,12 @@  public:
 	const std::set<Stream *> &streams() const;
 
 	std::unique_ptr<CameraConfiguration>
-	generateConfiguration(Span<const StreamRole> roles = {});
+	generateConfiguration(std::span<const StreamRole> roles = {});
 
 	std::unique_ptr<CameraConfiguration>
 	generateConfiguration(std::initializer_list<StreamRole> roles)
 	{
-		return generateConfiguration(Span(roles.begin(), roles.end()));
+		return generateConfiguration(std::span(roles.begin(), roles.end()));
 	}
 
 	int configure(CameraConfiguration *config);
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 44ff49647a..b3ddee29ab 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -10,6 +10,7 @@ 
 #include <assert.h>
 #include <map>
 #include <optional>
+#include <span>
 #include <stdint.h>
 #include <string>
 #include <string_view>
@@ -18,7 +19,6 @@ 
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/flags.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/geometry.h>
 
@@ -43,6 +43,14 @@  enum ControlType {
 
 namespace details {
 
+template<typename>
+struct is_span : public std::false_type {
+};
+
+template<typename T, std::size_t N>
+struct is_span<std::span<T, N>> : public std::true_type {
+};
+
 template<typename T, typename = void>
 struct control_type {
 };
@@ -120,7 +128,7 @@  struct control_type<Point> {
 };
 
 template<typename T, std::size_t N>
-struct control_type<Span<T, N>, std::enable_if_t<control_type<std::remove_cv_t<T>>::size == 0>> : public control_type<std::remove_cv_t<T>> {
+struct control_type<std::span<T, N>, std::enable_if_t<control_type<std::remove_cv_t<T>>::size == 0>> : public control_type<std::remove_cv_t<T>> {
 	static constexpr std::size_t size = N;
 };
 
@@ -169,8 +177,8 @@  public:
 	bool isNone() const { return type_ == ControlTypeNone; }
 	bool isArray() const { return isArray_; }
 	std::size_t numElements() const { return numElements_; }
-	Span<const uint8_t> data() const;
-	Span<uint8_t> data();
+	std::span<const uint8_t> data() const;
+	std::span<uint8_t> data();
 
 	std::string toString() const;
 
@@ -332,7 +340,7 @@  public:
 	explicit ControlInfo(const ControlValue &min = {},
 			     const ControlValue &max = {},
 			     const ControlValue &def = {});
-	explicit ControlInfo(Span<const ControlValue> values,
+	explicit ControlInfo(std::span<const ControlValue> values,
 			     const ControlValue &def = {});
 
 	const ControlValue &min() const { return min_; }
@@ -458,13 +466,13 @@  public:
 	}
 
 	template<typename T, typename V, size_t Size>
-	void set(const Control<Span<T, Size>> &ctrl, const std::initializer_list<V> &value)
+	void set(const Control<std::span<T, Size>> &ctrl, const std::initializer_list<V> &value)
 	{
 		ControlValue *val = find(ctrl.id());
 		if (!val)
 			return;
 
-		val->set(Span<const typename std::remove_cv_t<V>, Size>{ value.begin(), value.size() });
+		val->set(std::span<const typename std::remove_cv_t<V>, Size>{ value.begin(), value.size() });
 	}
 
 	const ControlValue &get(unsigned int id) const;
diff --git a/include/libcamera/framebuffer.h b/include/libcamera/framebuffer.h
index 723525d052..95da059ce2 100644
--- a/include/libcamera/framebuffer.h
+++ b/include/libcamera/framebuffer.h
@@ -9,12 +9,12 @@ 
 
 #include <limits>
 #include <memory>
+#include <span>
 #include <stdint.h>
 #include <vector>
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/shared_fd.h>
-#include <libcamera/base/span.h>
 
 namespace libcamera {
 
@@ -37,8 +37,8 @@  struct FrameMetadata {
 	unsigned int sequence;
 	uint64_t timestamp;
 
-	Span<Plane> planes() { return planes_; }
-	Span<const Plane> planes() const { return planes_; }
+	std::span<Plane> planes() { return planes_; }
+	std::span<const Plane> planes() const { return planes_; }
 
 private:
 	friend class FrameBuffer;
@@ -58,11 +58,11 @@  public:
 		unsigned int length;
 	};
 
-	FrameBuffer(Span<const Plane> planes, unsigned int cookie = 0);
+	FrameBuffer(std::span<const Plane> planes, unsigned int cookie = 0);
 	FrameBuffer(std::unique_ptr<Private> d);
 	virtual ~FrameBuffer() {}
 
-	Span<const Plane> planes() const;
+	std::span<const Plane> planes() const;
 	Request *request() const;
 	const FrameMetadata &metadata() const;
 
diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h
index 5b1c10ab89..0ea0f37032 100644
--- a/include/libcamera/internal/byte_stream_buffer.h
+++ b/include/libcamera/internal/byte_stream_buffer.h
@@ -7,12 +7,12 @@ 
 
 #pragma once
 
+#include <span>
 #include <stddef.h>
 #include <stdint.h>
 #include <type_traits>
 
 #include <libcamera/base/class.h>
-#include <libcamera/base/span.h>
 
 namespace libcamera {
 
@@ -39,7 +39,7 @@  public:
 	}
 
 	template<typename T>
-	int read(const Span<T> &data)
+	int read(std::span<T> data)
 	{
 		return read(reinterpret_cast<uint8_t *>(data.data()),
 			    data.size_bytes());
@@ -59,7 +59,7 @@  public:
 	}
 
 	template<typename T>
-	int write(const Span<T> &data)
+	int write(std::span<T> data)
 	{
 		return write(reinterpret_cast<const uint8_t *>(data.data()),
 			     data.size_bytes());
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index e6b72d22ac..613eff5d08 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -8,13 +8,13 @@ 
 #pragma once
 
 #include <memory>
+#include <span>
 #include <stdint.h>
 #include <string>
 #include <variant>
 #include <vector>
 
 #include <libcamera/base/class.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/control_ids.h>
 #include <libcamera/controls.h>
@@ -54,7 +54,7 @@  public:
 	virtual Size resolution() const = 0;
 
 	virtual V4L2SubdeviceFormat
-	getFormat(Span<const unsigned int> mbusCodes,
+	getFormat(std::span<const unsigned int> mbusCodes,
 		  const Size &size, const Size maxSize = Size()) const = 0;
 	virtual int setFormat(V4L2SubdeviceFormat *format,
 			      Transform transform = Transform::Identity) = 0;
@@ -76,7 +76,7 @@  public:
 	virtual Orientation mountingOrientation() const = 0;
 
 	virtual const ControlInfoMap &controls() const = 0;
-	virtual ControlList getControls(Span<const uint32_t> ids) = 0;
+	virtual ControlList getControls(std::span<const uint32_t> ids) = 0;
 	virtual int setControls(ControlList *ctrls) = 0;
 
 	virtual const std::vector<controls::draft::TestPatternModeEnum> &
diff --git a/include/libcamera/internal/converter/converter_dw100_vertexmap.h b/include/libcamera/internal/converter/converter_dw100_vertexmap.h
index 8cb86ed546..e37e8e8c1c 100644
--- a/include/libcamera/internal/converter/converter_dw100_vertexmap.h
+++ b/include/libcamera/internal/converter/converter_dw100_vertexmap.h
@@ -10,11 +10,10 @@ 
 #include <assert.h>
 #include <cmath>
 #include <optional>
+#include <span>
 #include <stdint.h>
 #include <vector>
 
-#include <libcamera/base/span.h>
-
 #include <libcamera/geometry.h>
 #include <libcamera/transform.h>
 
@@ -39,7 +38,7 @@  public:
 		{
 		}
 
-		int setCoefficients(Span<const double> coeffs);
+		int setCoefficients(std::span<const double> coeffs);
 
 		Matrix<double, 3, 3> cm;
 		Matrix<double, 3, 3> cmNew;
diff --git a/include/libcamera/internal/egl.h b/include/libcamera/internal/egl.h
index 8f2ef296c3..7d062b32d6 100644
--- a/include/libcamera/internal/egl.h
+++ b/include/libcamera/internal/egl.h
@@ -9,11 +9,11 @@ 
 
 #pragma once
 
+#include <span>
 #include <sys/types.h>
 #include <unistd.h>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/thread.h>
 #include <libcamera/base/utils.h>
 
@@ -118,10 +118,10 @@  public:
 
 	void pushEnv(std::vector<std::string> &shaderEnv, const char *str);
 
-	int compileVertexShader(GLuint &shaderId, Span<const unsigned char> shaderData,
-				Span<const std::string> shaderEnv);
-	int compileFragmentShader(GLuint &shaderId, Span<const unsigned char> shaderData,
-				  Span<const std::string> shaderEnv);
+	int compileVertexShader(GLuint &shaderId, std::span<const unsigned char> shaderData,
+				std::span<const std::string> shaderEnv);
+	int compileFragmentShader(GLuint &shaderId, std::span<const unsigned char> shaderData,
+				  std::span<const std::string> shaderEnv);
 	int linkProgram(GLuint &programId, GLuint fragmentshaderId, GLuint vertexshaderId);
 	void dumpShaderSource(GLuint shaderId);
 	void syncOutput();
@@ -140,8 +140,8 @@  private:
 	EGLDisplay display_ = EGL_NO_DISPLAY;
 	EGLContext context_ = EGL_NO_CONTEXT;
 
-	int compileShader(int shaderType, GLuint &shaderId, Span<const unsigned char> shaderData,
-			  Span<const std::string> shaderEnv);
+	int compileShader(int shaderType, GLuint &shaderId, std::span<const unsigned char> shaderData,
+			  std::span<const std::string> shaderEnv);
 
 	int createDMABufTexture2D(eGLImage &eglImage, int fd, bool output);
 
diff --git a/include/libcamera/internal/framebuffer.h b/include/libcamera/internal/framebuffer.h
index 67b090fc30..66ddba9001 100644
--- a/include/libcamera/internal/framebuffer.h
+++ b/include/libcamera/internal/framebuffer.h
@@ -8,11 +8,11 @@ 
 #pragma once
 
 #include <memory>
+#include <span>
 #include <stdint.h>
 #include <utility>
 
 #include <libcamera/base/class.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/fence.h>
 #include <libcamera/framebuffer.h>
@@ -24,7 +24,7 @@  class FrameBuffer::Private : public Extensible::Private
 	LIBCAMERA_DECLARE_PUBLIC(FrameBuffer)
 
 public:
-	Private(Span<const Plane> planes, uint64_t cookie = 0);
+	Private(std::span<const Plane> planes, uint64_t cookie = 0);
 	virtual ~Private();
 
 	void setRequest(Request *request) { request_ = request; }
diff --git a/include/libcamera/internal/mapped_framebuffer.h b/include/libcamera/internal/mapped_framebuffer.h
index 6aaabf5086..62d16a1fff 100644
--- a/include/libcamera/internal/mapped_framebuffer.h
+++ b/include/libcamera/internal/mapped_framebuffer.h
@@ -7,12 +7,12 @@ 
 
 #pragma once
 
+#include <span>
 #include <stdint.h>
 #include <vector>
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/flags.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/framebuffer.h>
 
@@ -21,7 +21,7 @@  namespace libcamera {
 class MappedBuffer
 {
 public:
-	using Plane = Span<uint8_t>;
+	using Plane = std::span<uint8_t>;
 
 	~MappedBuffer();
 
diff --git a/include/libcamera/internal/matrix.h b/include/libcamera/internal/matrix.h
index 137eb65e0c..f74cda103c 100644
--- a/include/libcamera/internal/matrix.h
+++ b/include/libcamera/internal/matrix.h
@@ -7,12 +7,12 @@ 
 #pragma once
 
 #include <algorithm>
+#include <span>
 #include <sstream>
 #include <type_traits>
 #include <vector>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include "libcamera/internal/value_node.h"
 
@@ -22,8 +22,8 @@  LOG_DECLARE_CATEGORY(Matrix)
 
 #ifndef __DOXYGEN__
 template<typename T>
-bool matrixInvert(Span<const T> dataIn, Span<T> dataOut, unsigned int dim,
-		  Span<T> scratchBuffer, Span<unsigned int> swapBuffer);
+bool matrixInvert(std::span<const T> dataIn, std::span<T> dataOut, unsigned int dim,
+		  std::span<T> scratchBuffer, std::span<unsigned int> swapBuffer);
 #endif /* __DOXYGEN__ */
 
 template<typename T, unsigned int Rows, unsigned int Cols>
@@ -41,7 +41,7 @@  public:
 		std::copy(data.begin(), data.end(), data_.begin());
 	}
 
-	Matrix(const Span<const T, Rows * Cols> data)
+	Matrix(std::span<const T, Rows * Cols> data)
 	{
 		std::copy(data.begin(), data.end(), data_.begin());
 	}
@@ -74,16 +74,16 @@  public:
 		return out.str();
 	}
 
-	constexpr Span<const T, Rows * Cols> data() const { return data_; }
+	constexpr std::span<const T, Rows * Cols> data() const { return data_; }
 
-	constexpr Span<const T, Cols> operator[](size_t i) const
+	constexpr std::span<const T, Cols> operator[](size_t i) const
 	{
-		return Span<const T, Cols>{ &data_.data()[i * Cols], Cols };
+		return std::span<const T, Cols>{ &data_.data()[i * Cols], Cols };
 	}
 
-	constexpr Span<T, Cols> operator[](size_t i)
+	constexpr std::span<T, Cols> operator[](size_t i)
 	{
-		return Span<T, Cols>{ &data_.data()[i * Cols], Cols };
+		return std::span<T, Cols>{ &data_.data()[i * Cols], Cols };
 	}
 
 #ifndef __DOXYGEN__
@@ -105,11 +105,11 @@  public:
 		Matrix<T, Rows, Cols> inverse;
 		std::array<T, Rows * Cols * 2> scratchBuffer;
 		std::array<unsigned int, Rows> swapBuffer;
-		bool res = matrixInvert(Span<const T>(data_),
-					Span<T>(inverse.data_),
+		bool res = matrixInvert(std::span<const T>(data_),
+					std::span<T>(inverse.data_),
 					Rows,
-					Span<T>(scratchBuffer),
-					Span<unsigned int>(swapBuffer));
+					std::span<T>(scratchBuffer),
+					std::span<unsigned int>(swapBuffer));
 		if (ok)
 			*ok = res;
 		return inverse;
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index 2a2ba95a41..6a018fe428 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -47,7 +47,7 @@  public:
 	void release(Camera *camera);
 
 	virtual std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-									   Span<const StreamRole> roles) = 0;
+									   std::span<const StreamRole> roles) = 0;
 	virtual int configure(Camera *camera, CameraConfiguration *config) = 0;
 
 	virtual int exportFrameBuffers(Camera *camera, Stream *stream,
diff --git a/include/libcamera/internal/process.h b/include/libcamera/internal/process.h
index 27d4b92583..596e967de8 100644
--- a/include/libcamera/internal/process.h
+++ b/include/libcamera/internal/process.h
@@ -7,11 +7,11 @@ 
 
 #pragma once
 
+#include <span>
 #include <string>
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/signal.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/unique_fd.h>
 
 namespace libcamera {
@@ -31,8 +31,8 @@  public:
 	~Process();
 
 	int start(const std::string &path,
-		  Span<const std::string> args = {},
-		  Span<const int> fds = {});
+		  std::span<const std::string> args = {},
+		  std::span<const int> fds = {});
 
 	ExitStatus exitStatus() const { return exitStatus_; }
 	int exitCode() const { return exitCode_; }
diff --git a/include/libcamera/internal/pub_key.h b/include/libcamera/internal/pub_key.h
index c8cc04cb40..0e0f538199 100644
--- a/include/libcamera/internal/pub_key.h
+++ b/include/libcamera/internal/pub_key.h
@@ -7,10 +7,9 @@ 
 
 #pragma once
 
+#include <span>
 #include <stdint.h>
 
-#include <libcamera/base/span.h>
-
 #if HAVE_CRYPTO
 struct evp_pkey_st;
 #elif HAVE_GNUTLS
@@ -22,11 +21,11 @@  namespace libcamera {
 class PubKey
 {
 public:
-	PubKey(Span<const uint8_t> key);
+	PubKey(std::span<const uint8_t> key);
 	~PubKey();
 
 	bool isValid() const { return valid_; }
-	bool verify(Span<const uint8_t> data, Span<const uint8_t> sig) const;
+	bool verify(std::span<const uint8_t> data, std::span<const uint8_t> sig) const;
 
 private:
 	bool valid_;
diff --git a/include/libcamera/internal/shared_mem_object.h b/include/libcamera/internal/shared_mem_object.h
index 21e025513f..fcc267757f 100644
--- a/include/libcamera/internal/shared_mem_object.h
+++ b/include/libcamera/internal/shared_mem_object.h
@@ -8,6 +8,7 @@ 
  */
 #pragma once
 
+#include <span>
 #include <stdint.h>
 #include <string>
 #include <sys/mman.h>
@@ -16,7 +17,6 @@ 
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/shared_fd.h>
-#include <libcamera/base/span.h>
 
 namespace libcamera {
 
@@ -37,7 +37,7 @@  public:
 		return fd_;
 	}
 
-	Span<uint8_t> mem() const
+	std::span<uint8_t> mem() const
 	{
 		return mem_;
 	}
@@ -52,7 +52,7 @@  private:
 
 	SharedFD fd_;
 
-	Span<uint8_t> mem_;
+	std::span<uint8_t> mem_;
 };
 
 template<class T, typename = std::enable_if_t<std::is_standard_layout<T>::value>>
diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h
index 8c4c59bf77..1a63fc547e 100644
--- a/include/libcamera/internal/v4l2_device.h
+++ b/include/libcamera/internal/v4l2_device.h
@@ -10,6 +10,7 @@ 
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <stdint.h>
 #include <vector>
 
@@ -17,7 +18,6 @@ 
 
 #include <libcamera/base/log.h>
 #include <libcamera/base/signal.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/unique_fd.h>
 
 #include <libcamera/color_space.h>
@@ -38,7 +38,7 @@  public:
 
 	const ControlInfoMap &controls() const { return controls_; }
 
-	ControlList getControls(Span<const uint32_t> ids, const V4L2Request *request = nullptr);
+	ControlList getControls(std::span<const uint32_t> ids, const V4L2Request *request = nullptr);
 	int setControls(ControlList *ctrls, const V4L2Request *request = nullptr);
 
 	const struct v4l2_query_ext_ctrl *controlInfo(uint32_t id) const;
@@ -78,7 +78,7 @@  private:
 
 	void listControls();
 	void updateControls(ControlList *ctrls,
-			    Span<const v4l2_ext_control> v4l2Ctrls);
+			    std::span<const v4l2_ext_control> v4l2Ctrls);
 
 	void eventAvailable();
 
diff --git a/include/libcamera/internal/vector.h b/include/libcamera/internal/vector.h
index 0af629e69d..4fb610dbc0 100644
--- a/include/libcamera/internal/vector.h
+++ b/include/libcamera/internal/vector.h
@@ -13,10 +13,10 @@ 
 #include <numeric>
 #include <optional>
 #include <ostream>
+#include <span>
 #include <type_traits>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include "libcamera/internal/matrix.h"
 #include "libcamera/internal/value_node.h"
@@ -46,7 +46,7 @@  public:
 		std::copy(data.begin(), data.end(), data_.begin());
 	}
 
-	constexpr Vector(const Span<const T, Rows> data)
+	constexpr Vector(std::span<const T, Rows> data)
 	{
 		std::copy(data.begin(), data.end(), data_.begin());
 	}
diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h
index 96669962b8..88946bdee8 100644
--- a/src/android/camera_buffer.h
+++ b/src/android/camera_buffer.h
@@ -7,10 +7,11 @@ 
 
 #pragma once
 
+#include <span>
+
 #include <hardware/camera3.h>
 
 #include <libcamera/base/class.h>
-#include <libcamera/base/span.h>
 #include <libcamera/geometry.h>
 #include <libcamera/pixel_format.h>
 
@@ -28,8 +29,8 @@  public:
 
 	unsigned int numPlanes() const;
 
-	libcamera::Span<const uint8_t> plane(unsigned int plane) const;
-	libcamera::Span<uint8_t> plane(unsigned int plane);
+	std::span<const uint8_t> plane(unsigned int plane) const;
+	std::span<uint8_t> plane(unsigned int plane);
 
 	unsigned int stride(unsigned int plane) const;
 	unsigned int offset(unsigned int plane) const;
@@ -58,11 +59,11 @@  unsigned int CameraBuffer::numPlanes() const				\
 {									\
 	return _d()->numPlanes();					\
 }									\
-Span<const uint8_t> CameraBuffer::plane(unsigned int plane) const	\
+std::span<const uint8_t> CameraBuffer::plane(unsigned int plane) const	\
 {									\
 	return const_cast<Private *>(_d())->plane(plane);		\
 }									\
-Span<uint8_t> CameraBuffer::plane(unsigned int plane)			\
+std::span<uint8_t> CameraBuffer::plane(unsigned int plane)		\
 {									\
 	return _d()->plane(plane);					\
 }									\
diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
index 6b58dd5548..795abc2d03 100644
--- a/src/android/camera_capabilities.cpp
+++ b/src/android/camera_capabilities.cpp
@@ -11,6 +11,7 @@ 
 #include <array>
 #include <cmath>
 #include <map>
+#include <span>
 #include <stdint.h>
 #include <type_traits>
 
@@ -1083,7 +1084,7 @@  int CameraCapabilities::initializeStaticMetadata()
 	}
 
 	{
-		const Span<const Rectangle> rects =
+		const std::span<const Rectangle> rects =
 			properties.get(properties::PixelArrayActiveAreas).value_or(utils::defopt);
 		std::vector<int32_t> data{
 			static_cast<int32_t>(rects[0].x),
diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
index 0d45960d90..49059bff5c 100644
--- a/src/android/camera_request.cpp
+++ b/src/android/camera_request.cpp
@@ -7,7 +7,7 @@ 
 
 #include "camera_request.h"
 
-#include <libcamera/base/span.h>
+#include <span>
 
 #include "camera_buffer.h"
 
@@ -114,7 +114,7 @@  Camera3RequestDescriptor::Camera3RequestDescriptor(
 	frameNumber_ = camera3Request->frame_number;
 
 	/* Copy the camera3 request stream information for later access. */
-	const Span<const camera3_stream_buffer_t> buffers{
+	const std::span<const camera3_stream_buffer_t> buffers{
 		camera3Request->output_buffers,
 		camera3Request->num_output_buffers
 	};
diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h
index ed033c191c..83c3924bc2 100644
--- a/src/android/jpeg/encoder.h
+++ b/src/android/jpeg/encoder.h
@@ -7,7 +7,7 @@ 
 
 #pragma once
 
-#include <libcamera/base/span.h>
+#include <span>
 
 #include <libcamera/framebuffer.h>
 #include <libcamera/stream.h>
@@ -21,6 +21,6 @@  public:
 
 	virtual int configure(const libcamera::StreamConfiguration &cfg) = 0;
 	virtual int encode(Camera3RequestDescriptor::StreamBuffer *buffer,
-			   libcamera::Span<const uint8_t> exifData,
+			   std::span<const uint8_t> exifData,
 			   unsigned int quality) = 0;
 };
diff --git a/src/android/jpeg/encoder_jea.cpp b/src/android/jpeg/encoder_jea.cpp
index 25dc43173e..35687e47bc 100644
--- a/src/android/jpeg/encoder_jea.cpp
+++ b/src/android/jpeg/encoder_jea.cpp
@@ -34,7 +34,7 @@  int EncoderJea::configure(const libcamera::StreamConfiguration &cfg)
 }
 
 int EncoderJea::encode(Camera3RequestDescriptor::StreamBuffer *buffer,
-		       libcamera::Span<const uint8_t> exifData,
+		       std::span<const uint8_t> exifData,
 		       unsigned int quality)
 {
 	if (!jpegCompressor_)
diff --git a/src/android/jpeg/encoder_jea.h b/src/android/jpeg/encoder_jea.h
index 91115d2e9b..a89dde2d01 100644
--- a/src/android/jpeg/encoder_jea.h
+++ b/src/android/jpeg/encoder_jea.h
@@ -21,7 +21,7 @@  public:
 
 	int configure(const libcamera::StreamConfiguration &cfg) override;
 	int encode(Camera3RequestDescriptor::StreamBuffer *buffer,
-		   libcamera::Span<const uint8_t> exifData,
+		   std::span<const uint8_t> exifData,
 		   unsigned int quality) override;
 
 private:
diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp
index cb242b5ec6..e988bcd615 100644
--- a/src/android/jpeg/encoder_libjpeg.cpp
+++ b/src/android/jpeg/encoder_libjpeg.cpp
@@ -105,7 +105,7 @@  int EncoderLibJpeg::configure(const StreamConfiguration &cfg)
 	return 0;
 }
 
-void EncoderLibJpeg::compressRGB(const std::vector<Span<uint8_t>> &planes)
+void EncoderLibJpeg::compressRGB(const std::vector<std::span<uint8_t>> &planes)
 {
 	unsigned char *src = const_cast<unsigned char *>(planes[0].data());
 	/* \todo Stride information should come from buffer configuration. */
@@ -123,7 +123,7 @@  void EncoderLibJpeg::compressRGB(const std::vector<Span<uint8_t>> &planes)
  * Compress the incoming buffer from a supported NV format.
  * This naively unpacks the semi-planar NV12 to a YUV888 format for libjpeg.
  */
-void EncoderLibJpeg::compressNV(const std::vector<Span<uint8_t>> &planes)
+void EncoderLibJpeg::compressNV(const std::vector<std::span<uint8_t>> &planes)
 {
 	std::vector<uint8_t> tmprowbuf(compress_.image_width * 3);
 
@@ -181,7 +181,7 @@  void EncoderLibJpeg::compressNV(const std::vector<Span<uint8_t>> &planes)
 }
 
 int EncoderLibJpeg::encode(Camera3RequestDescriptor::StreamBuffer *buffer,
-			   libcamera::Span<const uint8_t> exifData,
+			   std::span<const uint8_t> exifData,
 			   unsigned int quality)
 {
 	MappedFrameBuffer frame(buffer->srcBuffer,
@@ -196,8 +196,8 @@  int EncoderLibJpeg::encode(Camera3RequestDescriptor::StreamBuffer *buffer,
 		      exifData, quality);
 }
 
-int EncoderLibJpeg::encode(const std::vector<Span<uint8_t>> &src,
-			   Span<uint8_t> dest, Span<const uint8_t> exifData,
+int EncoderLibJpeg::encode(const std::vector<std::span<uint8_t>> &src,
+			   std::span<uint8_t> dest, std::span<const uint8_t> exifData,
 			   unsigned int quality)
 {
 	unsigned char *destination = dest.data();
diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h
index 4ac85c22e9..8783664772 100644
--- a/src/android/jpeg/encoder_libjpeg.h
+++ b/src/android/jpeg/encoder_libjpeg.h
@@ -23,16 +23,16 @@  public:
 
 	int configure(const libcamera::StreamConfiguration &cfg) override;
 	int encode(Camera3RequestDescriptor::StreamBuffer *buffer,
-		   libcamera::Span<const uint8_t> exifData,
+		   std::span<const uint8_t> exifData,
 		   unsigned int quality) override;
-	int encode(const std::vector<libcamera::Span<uint8_t>> &planes,
-		   libcamera::Span<uint8_t> destination,
-		   libcamera::Span<const uint8_t> exifData,
+	int encode(const std::vector<std::span<uint8_t>> &planes,
+		   std::span<uint8_t> destination,
+		   std::span<const uint8_t> exifData,
 		   unsigned int quality);
 
 private:
-	void compressRGB(const std::vector<libcamera::Span<uint8_t>> &planes);
-	void compressNV(const std::vector<libcamera::Span<uint8_t>> &planes);
+	void compressRGB(const std::vector<std::span<uint8_t>> &planes);
+	void compressNV(const std::vector<std::span<uint8_t>> &planes);
 
 	struct jpeg_compress_struct compress_;
 	struct jpeg_error_mgr jerr_;
diff --git a/src/android/jpeg/exif.cpp b/src/android/jpeg/exif.cpp
index b8c871dfe1..c045203967 100644
--- a/src/android/jpeg/exif.cpp
+++ b/src/android/jpeg/exif.cpp
@@ -190,7 +190,7 @@  void Exif::setRational(ExifIfd ifd, ExifTag tag, ExifRational item)
 	setRational(ifd, tag, { &item, 1 });
 }
 
-void Exif::setRational(ExifIfd ifd, ExifTag tag, Span<const ExifRational> items)
+void Exif::setRational(ExifIfd ifd, ExifTag tag, std::span<const ExifRational> items)
 {
 	ExifEntry *entry = createEntry(ifd, tag, EXIF_FORMAT_RATIONAL,
 				       items.size(),
diff --git a/src/android/jpeg/exif.h b/src/android/jpeg/exif.h
index 446d53f380..c58a652b79 100644
--- a/src/android/jpeg/exif.h
+++ b/src/android/jpeg/exif.h
@@ -8,14 +8,13 @@ 
 #pragma once
 
 #include <chrono>
+#include <span>
 #include <string>
 #include <time.h>
 #include <vector>
 
 #include <libexif/exif-data.h>
 
-#include <libcamera/base/span.h>
-
 #include <libcamera/geometry.h>
 
 class Exif
@@ -76,7 +75,7 @@  public:
 	void setFlash(Flash flash);
 	void setWhiteBalance(WhiteBalance wb);
 
-	libcamera::Span<const uint8_t> data() const { return { exifData_, size_ }; }
+	std::span<const uint8_t> data() const { return { exifData_, size_ }; }
 	[[nodiscard]] int generate();
 
 private:
@@ -92,7 +91,7 @@  private:
 		       StringEncoding encoding = NoEncoding);
 	void setRational(ExifIfd ifd, ExifTag tag, ExifRational item);
 	void setRational(ExifIfd ifd, ExifTag tag,
-			 libcamera::Span<const ExifRational> items);
+			 std::span<const ExifRational> items);
 
 	std::tuple<int, int, int> degreesToDMS(double decimalDegrees);
 	void setGPSDMS(ExifIfd ifd, ExifTag tag, int deg, int min, int sec);
diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp
index 89b8a401e6..222fcdb00a 100644
--- a/src/android/jpeg/post_processor_jpeg.cpp
+++ b/src/android/jpeg/post_processor_jpeg.cpp
@@ -89,7 +89,7 @@  void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
 		 * Thumbnailer::createThumbnailer above and remove the manual
 		 * planes split from here.
 		 */
-		std::vector<Span<uint8_t>> thumbnailPlanes;
+		std::vector<std::span<uint8_t>> thumbnailPlanes;
 		const PixelFormatInfo &formatNV12 = PixelFormatInfo::info(formats::NV12);
 		size_t yPlaneSize = formatNV12.planeSize(targetSize, 0);
 		size_t uvPlaneSize = formatNV12.planeSize(targetSize, 1);
diff --git a/src/android/mm/cros_camera_buffer.cpp b/src/android/mm/cros_camera_buffer.cpp
index e2a44a2a34..55eaa49c93 100644
--- a/src/android/mm/cros_camera_buffer.cpp
+++ b/src/android/mm/cros_camera_buffer.cpp
@@ -29,7 +29,7 @@  public:
 
 	unsigned int numPlanes() const;
 
-	Span<uint8_t> plane(unsigned int plane);
+	std::span<uint8_t> plane(unsigned int plane);
 
 	unsigned int stride(unsigned int plane) const;
 	unsigned int offset(unsigned int plane) const;
@@ -99,7 +99,7 @@  unsigned int CameraBuffer::Private::numPlanes() const
 	return bufferManager_->GetNumPlanes(handle_);
 }
 
-Span<uint8_t> CameraBuffer::Private::plane(unsigned int plane)
+std::span<uint8_t> CameraBuffer::Private::plane(unsigned int plane)
 {
 	if (!mapped_)
 		map();
diff --git a/src/android/mm/cros_frame_buffer_allocator.cpp b/src/android/mm/cros_frame_buffer_allocator.cpp
index 7ec116e150..5d524b7da0 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,
-			    Span<const FrameBuffer::Plane> planes)
+			    std::span<const FrameBuffer::Plane> planes)
 		: FrameBuffer::Private(planes), scopedHandle_(std::move(scopedHandle))
 	{
 	}
diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp
index 0ffcb445c9..4aeb254749 100644
--- a/src/android/mm/generic_camera_buffer.cpp
+++ b/src/android/mm/generic_camera_buffer.cpp
@@ -31,7 +31,7 @@  public:
 
 	unsigned int numPlanes() const;
 
-	Span<uint8_t> plane(unsigned int plane);
+	std::span<uint8_t> plane(unsigned int plane);
 
 	unsigned int stride(unsigned int plane) const;
 	unsigned int offset(unsigned int plane) const;
@@ -133,7 +133,7 @@  unsigned int CameraBuffer::Private::numPlanes() const
 	return planeInfo_.size();
 }
 
-Span<uint8_t> CameraBuffer::Private::plane(unsigned int plane)
+std::span<uint8_t> CameraBuffer::Private::plane(unsigned int plane)
 {
 	if (!mapped_)
 		map();
diff --git a/src/android/mm/generic_frame_buffer_allocator.cpp b/src/android/mm/generic_frame_buffer_allocator.cpp
index 25ad6b035e..c23d24e742 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,
-			       Span<const FrameBuffer::Plane> planes)
+			       std::span<const FrameBuffer::Plane> planes)
 		: FrameBuffer::Private(planes), allocDevice_(allocDevice),
 		  handle_(handle)
 	{
diff --git a/src/apps/cam/capture_script.cpp b/src/apps/cam/capture_script.cpp
index bc4c7c3a07..caa7e630ad 100644
--- a/src/apps/cam/capture_script.cpp
+++ b/src/apps/cam/capture_script.cpp
@@ -355,7 +355,7 @@  ControlValue CaptureScript::parseRectangles()
 	if (rectangles.size() == 1)
 		controlValue.set(rectangles.at(0));
 	else
-		controlValue.set(Span<const Rectangle>(rectangles));
+		controlValue.set(std::span<const Rectangle>(rectangles));
 
 	return controlValue;
 }
@@ -537,7 +537,7 @@  ControlValue CaptureScript::parseArrayControl(const ControlId *id,
 			}
 		}
 
-		value = Span<bool>(values.get(), repr.size());
+		value = std::span<bool>(values.get(), repr.size());
 		break;
 	}
 	case ControlTypeByte: {
@@ -547,7 +547,7 @@  ControlValue CaptureScript::parseArrayControl(const ControlId *id,
 			values.push_back(val);
 		}
 
-		value = Span<const uint8_t>(values.data(), values.size());
+		value = std::span<const uint8_t>(values.data(), values.size());
 		break;
 	}
 	case ControlTypeInteger32: {
@@ -557,7 +557,7 @@  ControlValue CaptureScript::parseArrayControl(const ControlId *id,
 			values.push_back(val);
 		}
 
-		value = Span<const int32_t>(values.data(), values.size());
+		value = std::span<const int32_t>(values.data(), values.size());
 		break;
 	}
 	case ControlTypeInteger64: {
@@ -567,7 +567,7 @@  ControlValue CaptureScript::parseArrayControl(const ControlId *id,
 			values.push_back(val);
 		}
 
-		value = Span<const int64_t>(values.data(), values.size());
+		value = std::span<const int64_t>(values.data(), values.size());
 		break;
 	}
 	case ControlTypeFloat: {
@@ -575,7 +575,7 @@  ControlValue CaptureScript::parseArrayControl(const ControlId *id,
 		for (const std::string &s : repr)
 			values.push_back(strtof(s.c_str(), NULL));
 
-		value = Span<const float>(values.data(), values.size());
+		value = std::span<const float>(values.data(), values.size());
 		break;
 	}
 	default:
diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp
index 8e2dfd9a64..59927af39e 100644
--- a/src/apps/cam/drm.cpp
+++ b/src/apps/cam/drm.cpp
@@ -104,7 +104,7 @@  Property::Property(Device *dev, drmModePropertyRes *property)
 		enums_[property->enums[i].value] = property->enums[i].name;
 }
 
-Blob::Blob(Device *dev, const libcamera::Span<const uint8_t> &data)
+Blob::Blob(Device *dev, std::span<const uint8_t> data)
 	: Object(dev, 0, Object::TypeBlob)
 {
 	drmModeCreatePropertyBlob(dev->fd(), data.data(), data.size(), &id_);
@@ -123,8 +123,8 @@  Mode::Mode(const drmModeModeInfo &mode)
 
 std::unique_ptr<Blob> Mode::toBlob(Device *dev) const
 {
-	libcamera::Span<const uint8_t> data{ reinterpret_cast<const uint8_t *>(this),
-					     sizeof(*this) };
+	std::span<const uint8_t> data{ reinterpret_cast<const uint8_t *>(this),
+				       sizeof(*this) };
 	return std::make_unique<Blob>(dev, data);
 }
 
diff --git a/src/apps/cam/drm.h b/src/apps/cam/drm.h
index 30a916d7e9..69a2a8d233 100644
--- a/src/apps/cam/drm.h
+++ b/src/apps/cam/drm.h
@@ -11,12 +11,12 @@ 
 #include <list>
 #include <map>
 #include <memory>
+#include <span>
 #include <stdint.h>
 #include <string>
 #include <vector>
 
 #include <libcamera/base/signal.h>
-#include <libcamera/base/span.h>
 
 #include <libdrm/drm.h>
 #include <xf86drm.h>
@@ -129,7 +129,7 @@  private:
 class Blob : public Object
 {
 public:
-	Blob(Device *dev, const libcamera::Span<const uint8_t> &data);
+	Blob(Device *dev, std::span<const uint8_t> data);
 	~Blob();
 
 	bool isValid() const { return id() != 0; }
diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp
index 65794a2f90..28827e1dd4 100644
--- a/src/apps/cam/file_sink.cpp
+++ b/src/apps/cam/file_sink.cpp
@@ -158,7 +158,7 @@  void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer,
 		 */
 		const unsigned int bytesused = buffer->metadata().planes()[i].bytesused;
 
-		Span<uint8_t> data = image->data(i);
+		std::span<uint8_t> data = image->data(i);
 		const unsigned int length = std::min<unsigned int>(bytesused, data.size());
 
 		if (bytesused > data.size())
diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp
index 17a9e04b59..d16e4dc14c 100644
--- a/src/apps/cam/sdl_sink.cpp
+++ b/src/apps/cam/sdl_sink.cpp
@@ -230,13 +230,13 @@  void SDLSink::renderBuffer(FrameBuffer *buffer)
 {
 	Image *image = mappedBuffers_[buffer].get();
 
-	std::vector<Span<const uint8_t>> planes;
+	std::vector<std::span<const uint8_t>> planes;
 	unsigned int i = 0;
 
 	planes.reserve(buffer->metadata().planes().size());
 
 	for (const FrameMetadata::Plane &meta : buffer->metadata().planes()) {
-		Span<uint8_t> data = image->data(i);
+		std::span<uint8_t> data = image->data(i);
 		if (meta.bytesused > data.size())
 			std::cerr << "payload size " << meta.bytesused
 				  << " larger than plane size " << data.size()
diff --git a/src/apps/cam/sdl_texture.h b/src/apps/cam/sdl_texture.h
index 39e1c7b38a..e9669ba8c2 100644
--- a/src/apps/cam/sdl_texture.h
+++ b/src/apps/cam/sdl_texture.h
@@ -7,7 +7,7 @@ 
 
 #pragma once
 
-#include <libcamera/base/span.h>
+#include <span>
 
 #include <SDL2/SDL.h>
 
@@ -19,7 +19,7 @@  public:
 	SDLTexture(const SDL_Rect &rect, uint32_t pixelFormat, const int stride);
 	virtual ~SDLTexture();
 	int create(SDL_Renderer *renderer);
-	virtual void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) = 0;
+	virtual void update(std::span<const std::span<const uint8_t>> data) = 0;
 	SDL_Texture *get() const { return ptr_; }
 
 protected:
diff --git a/src/apps/cam/sdl_texture_1plane.cpp b/src/apps/cam/sdl_texture_1plane.cpp
index b97015bc1c..421e5226c1 100644
--- a/src/apps/cam/sdl_texture_1plane.cpp
+++ b/src/apps/cam/sdl_texture_1plane.cpp
@@ -9,7 +9,7 @@ 
 
 #include <assert.h>
 
-void SDLTexture1Plane::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)
+void SDLTexture1Plane::update(std::span<const std::span<const uint8_t>> data)
 {
 	assert(data.size() == 1);
 	assert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));
diff --git a/src/apps/cam/sdl_texture_1plane.h b/src/apps/cam/sdl_texture_1plane.h
index 795e1fa4f2..1cb2c2939d 100644
--- a/src/apps/cam/sdl_texture_1plane.h
+++ b/src/apps/cam/sdl_texture_1plane.h
@@ -14,5 +14,5 @@  class SDLTexture1Plane final : public SDLTexture
 public:
 	using SDLTexture::SDLTexture;
 
-	void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;
+	void update(std::span<const std::span<const uint8_t>> data) override;
 };
diff --git a/src/apps/cam/sdl_texture_mjpg.cpp b/src/apps/cam/sdl_texture_mjpg.cpp
index ca49a11429..7bb1592a3a 100644
--- a/src/apps/cam/sdl_texture_mjpg.cpp
+++ b/src/apps/cam/sdl_texture_mjpg.cpp
@@ -43,7 +43,7 @@  SDLTextureMJPG::SDLTextureMJPG(const SDL_Rect &rect)
 {
 }
 
-int SDLTextureMJPG::decompress(Span<const uint8_t> data)
+int SDLTextureMJPG::decompress(std::span<const uint8_t> data)
 {
 	struct jpeg_decompress_struct cinfo;
 
@@ -76,7 +76,7 @@  int SDLTextureMJPG::decompress(Span<const uint8_t> data)
 	return 0;
 }
 
-void SDLTextureMJPG::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)
+void SDLTextureMJPG::update(std::span<const std::span<const uint8_t>> data)
 {
 	decompress(data[0]);
 	SDL_UpdateTexture(ptr_, nullptr, rgb_.get(), stride_);
diff --git a/src/apps/cam/sdl_texture_mjpg.h b/src/apps/cam/sdl_texture_mjpg.h
index be8a55fe7f..0eaba9962b 100644
--- a/src/apps/cam/sdl_texture_mjpg.h
+++ b/src/apps/cam/sdl_texture_mjpg.h
@@ -14,10 +14,10 @@  class SDLTextureMJPG : public SDLTexture
 public:
 	SDLTextureMJPG(const SDL_Rect &rect);
 
-	void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;
+	void update(std::span<const std::span<const uint8_t>> data) override;
 
 private:
-	int decompress(libcamera::Span<const uint8_t> data);
+	int decompress(std::span<const uint8_t> data);
 
 	std::unique_ptr<unsigned char[]> rgb_;
 };
diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp
index 9062a0347f..42c9d2ddfb 100644
--- a/src/apps/cam/sdl_texture_yuv.cpp
+++ b/src/apps/cam/sdl_texture_yuv.cpp
@@ -18,7 +18,7 @@  SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned
 	assert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);
 }
 
-void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)
+void SDLTextureNV::update(std::span<const std::span<const uint8_t>> data)
 {
 	assert(data.size() == 2);
 	assert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));
diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h
index a91658b3f3..5a5ac011f7 100644
--- a/src/apps/cam/sdl_texture_yuv.h
+++ b/src/apps/cam/sdl_texture_yuv.h
@@ -14,6 +14,6 @@  class SDLTextureNV : public SDLTexture
 {
 public:
 	SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);
-	void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;
+	void update(std::span<const std::span<const uint8_t>> data) override;
 };
 #endif
diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp
index 8d57023e1e..0d9b725b93 100644
--- a/src/apps/common/dng_writer.cpp
+++ b/src/apps/common/dng_writer.cpp
@@ -51,7 +51,7 @@  struct Matrix3d {
 		m[6] = m6, m[7] = m7, m[8] = m8;
 	}
 
-	Matrix3d(const Span<const float> &span)
+	Matrix3d(std::span<const float> span)
 		: Matrix3d(span[0], span[1], span[2],
 			   span[3], span[4], span[5],
 			   span[6], span[7], span[8])
@@ -708,7 +708,7 @@  int DNGWriter::write(const char *filename, const Camera *camera,
 
 	const auto &blackLevels = metadata.get(controls::SensorBlackLevels);
 	if (blackLevels) {
-		Span<const int32_t, 4> levels = *blackLevels;
+		std::span<const int32_t, 4> levels = *blackLevels;
 
 		/*
 		 * The black levels control is specified in R, Gr, Gb, B order.
diff --git a/src/apps/common/image.cpp b/src/apps/common/image.cpp
index 9a67238aa4..a705806dd7 100644
--- a/src/apps/common/image.cpp
+++ b/src/apps/common/image.cpp
@@ -87,7 +87,7 @@  Image::Image() = default;
 
 Image::~Image()
 {
-	for (Span<uint8_t> &map : maps_)
+	for (std::span<uint8_t> &map : maps_)
 		munmap(map.data(), map.size());
 }
 
@@ -96,13 +96,13 @@  unsigned int Image::numPlanes() const
 	return planes_.size();
 }
 
-Span<uint8_t> Image::data(unsigned int plane)
+std::span<uint8_t> Image::data(unsigned int plane)
 {
 	assert(plane < planes_.size());
 	return planes_[plane];
 }
 
-Span<const uint8_t> Image::data(unsigned int plane) const
+std::span<const uint8_t> Image::data(unsigned int plane) const
 {
 	assert(plane < planes_.size());
 	return planes_[plane];
diff --git a/src/apps/common/image.h b/src/apps/common/image.h
index e47e446b19..938face9cf 100644
--- a/src/apps/common/image.h
+++ b/src/apps/common/image.h
@@ -8,12 +8,12 @@ 
 #pragma once
 
 #include <memory>
+#include <span>
 #include <stdint.h>
 #include <vector>
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/flags.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/framebuffer.h>
 
@@ -33,16 +33,16 @@  public:
 
 	unsigned int numPlanes() const;
 
-	libcamera::Span<uint8_t> data(unsigned int plane);
-	libcamera::Span<const uint8_t> data(unsigned int plane) const;
+	std::span<uint8_t> data(unsigned int plane);
+	std::span<const uint8_t> data(unsigned int plane) const;
 
 private:
 	LIBCAMERA_DISABLE_COPY(Image)
 
 	Image();
 
-	std::vector<libcamera::Span<uint8_t>> maps_;
-	std::vector<libcamera::Span<uint8_t>> planes_;
+	std::vector<std::span<uint8_t>> maps_;
+	std::vector<std::span<uint8_t>> planes_;
 };
 
 namespace libcamera {
diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp
index 6f0bbbe9ee..f6ba2302db 100644
--- a/src/apps/common/ppm_writer.cpp
+++ b/src/apps/common/ppm_writer.cpp
@@ -19,7 +19,7 @@  using namespace libcamera;
 
 int PPMWriter::write(const char *filename,
 		     const StreamConfiguration &config,
-		     const Span<uint8_t> &data)
+		     std::span<uint8_t> data)
 {
 	struct FormatTransformation {
 		unsigned int rPos;
diff --git a/src/apps/common/ppm_writer.h b/src/apps/common/ppm_writer.h
index 8c8d2e15a6..db466e7f33 100644
--- a/src/apps/common/ppm_writer.h
+++ b/src/apps/common/ppm_writer.h
@@ -7,7 +7,7 @@ 
 
 #pragma once
 
-#include <libcamera/base/span.h>
+#include <span>
 
 #include <libcamera/stream.h>
 
@@ -16,5 +16,5 @@  class PPMWriter
 public:
 	static int write(const char *filename,
 			 const libcamera::StreamConfiguration &config,
-			 const libcamera::Span<uint8_t> &data);
+			 std::span<uint8_t> data);
 };
diff --git a/src/apps/ipa-verify/main.cpp b/src/apps/ipa-verify/main.cpp
index 0903cd8512..b115cae480 100644
--- a/src/apps/ipa-verify/main.cpp
+++ b/src/apps/ipa-verify/main.cpp
@@ -7,9 +7,9 @@ 
 
 #include <iostream>
 #include <libgen.h>
+#include <span>
 
 #include <libcamera/base/file.h>
-#include <libcamera/base/span.h>
 
 #include "libcamera/internal/ipa_manager.h"
 #include "libcamera/internal/ipa_module.h"
@@ -24,7 +24,7 @@  bool isSignatureValid(IPAModule *ipa)
 	if (!file.open(File::OpenModeFlag::ReadOnly))
 		return false;
 
-	Span<uint8_t> data = file.map();
+	std::span<uint8_t> data = file.map();
 	if (data.empty())
 		return false;
 
diff --git a/src/apps/lc-compliance/helpers/capture.cpp b/src/apps/lc-compliance/helpers/capture.cpp
index d83269d4a9..9ab476efa6 100644
--- a/src/apps/lc-compliance/helpers/capture.cpp
+++ b/src/apps/lc-compliance/helpers/capture.cpp
@@ -23,7 +23,7 @@  Capture::~Capture()
 	stop();
 }
 
-void Capture::configure(libcamera::Span<const libcamera::StreamRole> roles)
+void Capture::configure(std::span<const libcamera::StreamRole> roles)
 {
 	assert(!roles.empty());
 
diff --git a/src/apps/lc-compliance/helpers/capture.h b/src/apps/lc-compliance/helpers/capture.h
index ea01c11c11..17fc47bc43 100644
--- a/src/apps/lc-compliance/helpers/capture.h
+++ b/src/apps/lc-compliance/helpers/capture.h
@@ -9,6 +9,7 @@ 
 
 #include <memory>
 #include <optional>
+#include <span>
 
 #include <libcamera/libcamera.h>
 
@@ -20,7 +21,7 @@  public:
 	Capture(std::shared_ptr<libcamera::Camera> camera);
 	~Capture();
 
-	void configure(libcamera::Span<const libcamera::StreamRole> roles);
+	void configure(std::span<const libcamera::StreamRole> roles);
 	void run(unsigned int captureLimit, std::optional<unsigned int> queueLimit = {});
 
 private:
diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in
index c3f0695f9b..97bfd1f918 100644
--- a/src/gstreamer/gstlibcamera-controls.cpp.in
+++ b/src/gstreamer/gstlibcamera-controls.cpp.in
@@ -213,9 +213,9 @@  bool GstCameraControls::setProperty(guint propId, const GValue *value,
 		}
 
 {%- if ctrl.size == 0 %}
-		Span<const {{ ctrl.element_type }}> val(values.data(), size);
+		std::span<const {{ ctrl.element_type }}> val(values.data(), size);
 {%- else %}
-		Span<const {{ ctrl.element_type }}, {{ ctrl.size }}> val(values.data(), size);
+		std::span<const {{ ctrl.element_type }}, {{ ctrl.size }}> val(values.data(), size);
 {%- endif %}
 {%- else %}
 {%- if ctrl.is_rectangle %}
diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
index 6541d478c8..7dd8b550ad 100644
--- a/src/gstreamer/gstlibcamera-utils.cpp
+++ b/src/gstreamer/gstlibcamera-utils.cpp
@@ -749,7 +749,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 	switch (value.type()) {
 	case ControlTypeBool:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const bool>>()) {
+			for (const auto &item : value.get<std::span<const bool>>()) {
 				g_value_init(&x, type);
 				g_value_set_boolean(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -761,7 +761,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeByte:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const uint8_t>>()) {
+			for (const auto &item : value.get<std::span<const uint8_t>>()) {
 				g_value_init(&x, type);
 				g_value_set_uint(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -773,7 +773,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeUnsigned16:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const uint16_t>>()) {
+			for (const auto &item : value.get<std::span<const uint16_t>>()) {
 				g_value_init(&x, type);
 				g_value_set_uint(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -785,7 +785,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeUnsigned32:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const uint32_t>>()) {
+			for (const auto &item : value.get<std::span<const uint32_t>>()) {
 				g_value_init(&x, type);
 				g_value_set_uint(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -797,7 +797,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeInteger32:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const int32_t>>()) {
+			for (const auto &item : value.get<std::span<const int32_t>>()) {
 				g_value_init(&x, type);
 				g_value_set_int(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -822,7 +822,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeInteger64:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const int64_t>>()) {
+			for (const auto &item : value.get<std::span<const int64_t>>()) {
 				g_value_init(&x, type);
 				g_value_set_int64(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -834,7 +834,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeFloat:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const float>>()) {
+			for (const auto &item : value.get<std::span<const float>>()) {
 				g_value_init(&x, type);
 				g_value_set_float(&x, item);
 				gst_value_array_append_and_take_value(&v, &x);
@@ -855,7 +855,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeSize:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const Size>>())
+			for (const auto &item : value.get<std::span<const Size>>())
 				gst_libcamera_gvalue_set_size(&v, item);
 		} else {
 			gst_libcamera_gvalue_set_size(&v, value.get<const Size>());
@@ -863,7 +863,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypePoint:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const Point>>())
+			for (const auto &item : value.get<std::span<const Point>>())
 				gst_libcamera_gvalue_set_point(&v, item);
 		} else {
 			gst_libcamera_gvalue_set_point(&v, value.get<const Point>());
@@ -871,7 +871,7 @@  int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *
 		break;
 	case ControlTypeRectangle:
 		if (is_array) {
-			for (const auto &item : value.get<Span<const Rectangle>>())
+			for (const auto &item : value.get<std::span<const Rectangle>>())
 				gst_libcamera_gvalue_set_rectangle(&v, item);
 		} else {
 			gst_libcamera_gvalue_set_rectangle(&v, value.get<const Rectangle>());
diff --git a/src/ipa/ipu3/algorithms/af.cpp b/src/ipa/ipu3/algorithms/af.cpp
index cf68fb59c4..331e1feaa1 100644
--- a/src/ipa/ipu3/algorithms/af.cpp
+++ b/src/ipa/ipu3/algorithms/af.cpp
@@ -354,7 +354,7 @@  void Af::afIgnoreFrameReset()
  *
  * \return The variance of the values in the data set \a y_item selected by \a isY1
  */
-double Af::afEstimateVariance(Span<const y_table_item_t> y_items, bool isY1)
+double Af::afEstimateVariance(std::span<const y_table_item_t> y_items, bool isY1)
 {
 	uint32_t total = 0;
 	double mean;
@@ -430,8 +430,8 @@  void Af::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
 
 	ASSERT(afRawBufferLen < IPU3_UAPI_AF_Y_TABLE_MAX_SIZE);
 
-	Span<const y_table_item_t> y_items(reinterpret_cast<const y_table_item_t *>(&stats->af_raw_buffer.y_table),
-					   afRawBufferLen);
+	const std::span y_items(reinterpret_cast<const y_table_item_t *>(&stats->af_raw_buffer.y_table),
+				afRawBufferLen);
 
 	/*
 	 * Calculate the mean and the variance of AF statistics for a given grid.
diff --git a/src/ipa/ipu3/algorithms/af.h b/src/ipa/ipu3/algorithms/af.h
index 68126d4630..320b674962 100644
--- a/src/ipa/ipu3/algorithms/af.h
+++ b/src/ipa/ipu3/algorithms/af.h
@@ -46,7 +46,7 @@  private:
 	void afReset(IPAContext &context);
 	bool afNeedIgnoreFrame();
 	void afIgnoreFrameReset();
-	double afEstimateVariance(Span<const y_table_item_t> y_items, bool isY1);
+	double afEstimateVariance(std::span<const y_table_item_t> y_items, bool isY1);
 
 	bool afIsOutOfFocus(IPAContext &context);
 
diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
index d6a7036c65..37f7e329c3 100644
--- a/src/ipa/ipu3/algorithms/agc.cpp
+++ b/src/ipa/ipu3/algorithms/agc.cpp
@@ -153,7 +153,7 @@  Histogram Agc::parseStatistics(const ipu3_uapi_stats_3a *stats,
 		}
 	}
 
-	return Histogram(Span<uint32_t>(hist));
+	return Histogram(std::span<uint32_t>(hist));
 }
 
 /**
diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
index 42d475ecc6..07fae3a0c9 100644
--- a/src/ipa/ipu3/ipu3.cpp
+++ b/src/ipa/ipu3/ipu3.cpp
@@ -11,6 +11,7 @@ 
 #include <limits>
 #include <map>
 #include <memory>
+#include <span>
 #include <stdint.h>
 #include <utility>
 #include <vector>
@@ -20,7 +21,6 @@ 
 
 #include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include <libcamera/control_ids.h>
@@ -283,7 +283,7 @@  void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,
 	}
 	controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
 							       frameDurations[1],
-							       Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });
+							       std::span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });
 
 	controls.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());
 	*ipaControls = ControlInfoMap(std::move(controls), controls::controls);
@@ -546,7 +546,7 @@  void IPAIPU3::computeParams(const uint32_t frame, const uint32_t bufferId)
 		return;
 	}
 
-	Span<uint8_t> mem = it->second.planes()[0];
+	std::span<uint8_t> mem = it->second.planes()[0];
 	ipu3_uapi_params *params =
 		reinterpret_cast<ipu3_uapi_params *>(mem.data());
 
@@ -590,7 +590,7 @@  void IPAIPU3::processStats(const uint32_t frame,
 		return;
 	}
 
-	Span<uint8_t> mem = it->second.planes()[0];
+	std::span<uint8_t> mem = it->second.planes()[0];
 	const ipu3_uapi_stats_3a *stats =
 		reinterpret_cast<ipu3_uapi_stats_3a *>(mem.data());
 
diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h
index d35a85167c..ef9e78b1e8 100644
--- a/src/ipa/libipa/awb.h
+++ b/src/ipa/libipa/awb.h
@@ -122,7 +122,7 @@  public:
 
 		controls_[&controls::ColourGains] =
 			ControlInfo(gainMin_, gainMax_,
-				    Span<const float, 2>{ { 1.0f, 1.0f } });
+				    std::span<const float, 2>{ { 1.0f, 1.0f } });
 
 		controls.insert(controls_.begin(), controls_.end());
 
diff --git a/src/ipa/libipa/awb_bayes.cpp b/src/ipa/libipa/awb_bayes.cpp
index 2c10f9c4c8..10e05962b8 100644
--- a/src/ipa/libipa/awb_bayes.cpp
+++ b/src/ipa/libipa/awb_bayes.cpp
@@ -307,7 +307,7 @@  AwbBayes::calculateAwb(const AwbStats &stats, unsigned int lux,
 }
 
 double AwbBayes::coarseSearch(const ipa::Pwl &prior, const AwbStats &stats,
-			      Span<double> range) const
+			      std::span<double> range) const
 {
 	std::vector<Pwl::Point> points;
 	size_t bestPoint = 0;
diff --git a/src/ipa/libipa/awb_bayes.h b/src/ipa/libipa/awb_bayes.h
index 8d4cff076d..04c18f52c7 100644
--- a/src/ipa/libipa/awb_bayes.h
+++ b/src/ipa/libipa/awb_bayes.h
@@ -7,6 +7,8 @@ 
 
 #pragma once
 
+#include <span>
+
 #include <libcamera/controls.h>
 
 #include "libcamera/internal/value_node.h"
@@ -37,7 +39,7 @@  private:
 	void fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior,
 			const AwbStats &stats) const;
 	double coarseSearch(const ipa::Pwl &prior, const AwbStats &stats,
-			    Span<double> range) const;
+			    std::span<double> range) const;
 	double interpolateQuadratic(ipa::Pwl::Point const &a,
 				    ipa::Pwl::Point const &b,
 				    ipa::Pwl::Point const &c) const;
diff --git a/src/ipa/libipa/exposure_mode_helper.cpp b/src/ipa/libipa/exposure_mode_helper.cpp
index 01c5cba8e2..04a9403961 100644
--- a/src/ipa/libipa/exposure_mode_helper.cpp
+++ b/src/ipa/libipa/exposure_mode_helper.cpp
@@ -69,7 +69,7 @@  namespace ipa {
  * The vector of stages may be empty. In that case, the helper will simply use
  * the runtime limits set through setLimits() instead.
  */
-ExposureModeHelper::ExposureModeHelper(const Span<std::pair<utils::Duration, double>> stages)
+ExposureModeHelper::ExposureModeHelper(std::span<std::pair<utils::Duration, double>> stages)
 	: lineDuration_(1us), minExposureTime_(0us), maxExposureTime_(0us),
 	  minGain_(0), maxGain_(0), sensorHelper_(nullptr)
 {
diff --git a/src/ipa/libipa/exposure_mode_helper.h b/src/ipa/libipa/exposure_mode_helper.h
index 968192ddc5..dc310c0896 100644
--- a/src/ipa/libipa/exposure_mode_helper.h
+++ b/src/ipa/libipa/exposure_mode_helper.h
@@ -7,11 +7,11 @@ 
 
 #pragma once
 
+#include <span>
 #include <tuple>
 #include <utility>
 #include <vector>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include "camera_sensor_helper.h"
@@ -23,7 +23,7 @@  namespace ipa {
 class ExposureModeHelper
 {
 public:
-	ExposureModeHelper(const Span<std::pair<utils::Duration, double>> stages);
+	ExposureModeHelper(std::span<std::pair<utils::Duration, double>> stages);
 	~ExposureModeHelper() = default;
 
 	void configure(utils::Duration lineLength, const CameraSensorHelper *sensorHelper);
diff --git a/src/ipa/libipa/histogram.cpp b/src/ipa/libipa/histogram.cpp
index bcf2639082..bfbadea281 100644
--- a/src/ipa/libipa/histogram.cpp
+++ b/src/ipa/libipa/histogram.cpp
@@ -41,7 +41,7 @@  namespace ipa {
  * \brief Create a cumulative histogram
  * \param[in] data A (non-cumulative) histogram
  */
-Histogram::Histogram(Span<const uint32_t> data)
+Histogram::Histogram(std::span<const uint32_t> data)
 {
 	cumulative_.resize(data.size() + 1);
 	cumulative_[0] = 0;
@@ -50,7 +50,7 @@  Histogram::Histogram(Span<const uint32_t> data)
 }
 
 /**
- * \fn Histogram::Histogram(Span<const uint32_t> data, Transform transform)
+ * \fn Histogram::Histogram(std::span<const uint32_t> data, Transform transform)
  * \brief Create a cumulative histogram
  * \param[in] data A (non-cumulative) histogram
  * \param[in] transform The transformation function to apply to every bin
diff --git a/src/ipa/libipa/histogram.h b/src/ipa/libipa/histogram.h
index 8cf8bb6d16..1d702fd827 100644
--- a/src/ipa/libipa/histogram.h
+++ b/src/ipa/libipa/histogram.h
@@ -8,11 +8,11 @@ 
 #pragma once
 
 #include <limits.h>
+#include <span>
 #include <stdint.h>
 #include <type_traits>
 #include <vector>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 namespace libcamera {
@@ -23,11 +23,11 @@  class Histogram
 {
 public:
 	Histogram() { cumulative_.push_back(0); }
-	Histogram(Span<const uint32_t> data);
+	Histogram(std::span<const uint32_t> data);
 
 	template<typename Transform,
 		 std::enable_if_t<std::is_invocable_v<Transform, uint32_t>> * = nullptr>
-	Histogram(Span<const uint32_t> data, Transform transform)
+	Histogram(std::span<const uint32_t> data, Transform transform)
 	{
 		cumulative_.resize(data.size() + 1);
 		cumulative_[0] = 0;
@@ -36,7 +36,7 @@  public:
 	}
 
 	size_t bins() const { return cumulative_.size() - 1; }
-	Span<const uint64_t> data() const { return cumulative_; }
+	std::span<const uint64_t> data() const { return cumulative_; }
 	uint64_t total() const { return cumulative_[cumulative_.size() - 1]; }
 	uint64_t cumulativeFrequency(double bin) const;
 	double quantile(double q, uint32_t first = 0, uint32_t last = UINT_MAX) const;
diff --git a/src/ipa/libipa/lsc_base.h b/src/ipa/libipa/lsc_base.h
index d53736cb71..0f417f5b92 100644
--- a/src/ipa/libipa/lsc_base.h
+++ b/src/ipa/libipa/lsc_base.h
@@ -12,8 +12,6 @@ 
 #include <string>
 #include <vector>
 
-#include <libcamera/base/span.h>
-
 #include <libcamera/geometry.h>
 
 #include "libcamera/internal/value_node.h"
diff --git a/src/ipa/libipa/lsc_polynomial.cpp b/src/ipa/libipa/lsc_polynomial.cpp
index 6c38c7f7ee..da1659c759 100644
--- a/src/ipa/libipa/lsc_polynomial.cpp
+++ b/src/ipa/libipa/lsc_polynomial.cpp
@@ -214,8 +214,8 @@  LscPolynomial::sampleForCrop(const Rectangle &cropRectangle,
 
 std::vector<float>
 LscPolynomial::samplePolynomial(const lsc::Polynomial &poly,
-				Span<const double> xPositions,
-				Span<const double> yPositions,
+				std::span<const double> xPositions,
+				std::span<const double> yPositions,
 				const Rectangle &cropRectangle)
 {
 	double m = poly.getM();
diff --git a/src/ipa/libipa/lsc_polynomial.h b/src/ipa/libipa/lsc_polynomial.h
index b9d3d83466..72d874f45c 100644
--- a/src/ipa/libipa/lsc_polynomial.h
+++ b/src/ipa/libipa/lsc_polynomial.h
@@ -8,10 +8,9 @@ 
 
 #include <array>
 #include <map>
+#include <span>
 #include <vector>
 
-#include <libcamera/base/span.h>
-
 #include <libcamera/geometry.h>
 
 #include "libcamera/internal/value_node.h"
@@ -66,8 +65,8 @@  public:
 
 private:
 	std::vector<float> samplePolynomial(const lsc::Polynomial &poly,
-					    Span<const double> xPositions,
-					    Span<const double> yPositions,
+					    std::span<const double> xPositions,
+					    std::span<const double> yPositions,
 					    const Rectangle &cropRectangle);
 	PolynomialComponentsMap lscData_;
 };
diff --git a/src/ipa/libipa/lsc_table.h b/src/ipa/libipa/lsc_table.h
index 9f39b38e25..5af6eec137 100644
--- a/src/ipa/libipa/lsc_table.h
+++ b/src/ipa/libipa/lsc_table.h
@@ -9,7 +9,6 @@ 
 #include <vector>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/geometry.h>
 
diff --git a/src/ipa/libipa/v4l2_params.cpp b/src/ipa/libipa/v4l2_params.cpp
index 4c40515a29..16632e2858 100644
--- a/src/ipa/libipa/v4l2_params.cpp
+++ b/src/ipa/libipa/v4l2_params.cpp
@@ -131,7 +131,7 @@  namespace ipa {
  * \param[in] data Reference to the v4l2-buffer memory mapped area
  * \param[in] version The ISP parameters version the implementation supports
  */
-V4L2ParamsBase::V4L2ParamsBase(Span<uint8_t> data, unsigned int version)
+V4L2ParamsBase::V4L2ParamsBase(std::span<uint8_t> data, unsigned int version)
 	: data_(data)
 {
 	struct v4l2_isp_params_buffer *params =
@@ -167,8 +167,8 @@  V4L2ParamsBase::V4L2ParamsBase(Span<uint8_t> data, unsigned int version)
  * retrieve the memory area that will be used to construct a V4L2ParamsBlock<T>
  * before returning it to the caller.
  */
-Span<uint8_t> V4L2ParamsBase::block(uint16_t type, unsigned int blockType,
-				    size_t blockSize)
+std::span<uint8_t> V4L2ParamsBase::block(uint16_t type, unsigned int blockType,
+					 size_t blockSize)
 {
 	/*
 	 * Look up the block in the cache first. If an algorithm
@@ -182,7 +182,7 @@  Span<uint8_t> V4L2ParamsBase::block(uint16_t type, unsigned int blockType,
 	/*
 	 * Make sure we don't run out of space. Assert as otherwise
 	 * we get a segfault as soon as someone tries to access the
-	 * empty Span<> returned from here.
+	 * empty span returned from here.
 	 */
 	if (blockSize > data_.size() - used_) {
 		LOG(Fatal)
@@ -191,7 +191,7 @@  Span<uint8_t> V4L2ParamsBase::block(uint16_t type, unsigned int blockType,
 	}
 
 	/* Allocate a new block, clear its memory, and initialize its header. */
-	Span<uint8_t> block = data_.subspan(used_, blockSize);
+	std::span<uint8_t> block = data_.subspan(used_, blockSize);
 	memset(block.data(), 0, block.size());
 
 	struct v4l2_isp_params_block_header *header =
@@ -279,7 +279,7 @@  Span<uint8_t> V4L2ParamsBase::block(uint16_t type, unsigned int blockType,
  * class MyISPParams : public V4L2Params<params_traits>
  * {
  * public:
- * 	MyISPParams::MyISPParams(Span<uint8_t> data)
+ * 	MyISPParams::MyISPParams(std::span<uint8_t> data)
  * 		: V4L2Params(data, kVersion)
  * 	{
  * 	}
diff --git a/src/ipa/libipa/v4l2_params.h b/src/ipa/libipa/v4l2_params.h
index 581a8ecadd..c87dadc529 100644
--- a/src/ipa/libipa/v4l2_params.h
+++ b/src/ipa/libipa/v4l2_params.h
@@ -8,13 +8,13 @@ 
 #pragma once
 
 #include <map>
+#include <span>
 #include <stdint.h>
 #include <string.h>
 
 #include <linux/media/v4l2-isp.h>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 namespace libcamera {
@@ -27,7 +27,7 @@  template<typename T>
 class V4L2ParamsBlock
 {
 public:
-	V4L2ParamsBlock(const Span<uint8_t> data)
+	V4L2ParamsBlock(std::span<uint8_t> data)
 		: data_(data)
 	{
 	}
@@ -66,25 +66,25 @@  public:
 	}
 
 protected:
-	Span<uint8_t> data_;
+	std::span<uint8_t> data_;
 };
 
 class V4L2ParamsBase
 {
 protected:
-	V4L2ParamsBase(Span<uint8_t> data, unsigned int version);
+	V4L2ParamsBase(std::span<uint8_t> data, unsigned int version);
 
 public:
 	size_t bytesused() const { return used_; }
 
 protected:
-	Span<uint8_t> block(uint16_t type, unsigned int blockType,
-			    size_t blockSize);
+	std::span<uint8_t> block(uint16_t type, unsigned int blockType,
+				 size_t blockSize);
 
-	Span<uint8_t> data_;
+	std::span<uint8_t> data_;
 	size_t used_;
 
-	std::map<uint16_t, Span<uint8_t>> blocks_;
+	std::map<uint16_t, std::span<uint8_t>> blocks_;
 };
 
 template<typename Traits>
@@ -93,7 +93,7 @@  class V4L2Params : public V4L2ParamsBase
 public:
 	static_assert(std::is_same_v<std::underlying_type_t<typename Traits::id_type>, uint16_t>);
 
-	V4L2Params(Span<uint8_t> data, unsigned int version)
+	V4L2Params(std::span<uint8_t> data, unsigned int version)
 		: V4L2ParamsBase(data, version)
 	{
 	}
diff --git a/src/ipa/libipa/v4l2_stats.cpp b/src/ipa/libipa/v4l2_stats.cpp
index e3e3ab9fed..7a9a7f607c 100644
--- a/src/ipa/libipa/v4l2_stats.cpp
+++ b/src/ipa/libipa/v4l2_stats.cpp
@@ -54,7 +54,7 @@  LOG_DEFINE_CATEGORY(V4L2Stats)
  * After construction users of this class shall check the validity of the
  * constructed instance using operator bool().
  */
-V4L2StatsBase::V4L2StatsBase(Span<uint8_t> data, unsigned int version)
+V4L2StatsBase::V4L2StatsBase(std::span<uint8_t> data, unsigned int version)
 	: data_(data), valid_(false)
 {
 	const struct v4l2_isp_buffer *stats =
@@ -116,10 +116,10 @@  V4L2StatsBase::V4L2StatsBase(Span<uint8_t> data, unsigned int version)
  * Retrieve a span to the statistics block memory location by accessing the
  * cache built at class construction time.
  *
- * \return The memory location of the ISP statistics block, or an empty Span
+ * \return The memory location of the ISP statistics block, or an empty span
  * if \a blockType is not supported
  */
-Span<const uint8_t> V4L2StatsBase::block(unsigned int blockType, size_t blockSize) const
+std::span<const uint8_t> V4L2StatsBase::block(unsigned int blockType, size_t blockSize) const
 {
 	const auto it = cache_.find(blockType);
 	if (it == cache_.end()) {
@@ -201,7 +201,7 @@  Span<const uint8_t> V4L2StatsBase::block(unsigned int blockType, size_t blockSiz
  * class MyISPStats : public V4L2Stats<stats_traits>
  * {
  * public:
- * 	MyISPStats::MyISPStats(Span<uint8_t> data)
+ * 	MyISPStats::MyISPStats(std::span<uint8_t> data)
  * 		: V4L2Stats(data, V4L2_ISP_VERSION_V1)
  * 	{
  * 	}
diff --git a/src/ipa/libipa/v4l2_stats.h b/src/ipa/libipa/v4l2_stats.h
index b96395e5f5..53b69c309f 100644
--- a/src/ipa/libipa/v4l2_stats.h
+++ b/src/ipa/libipa/v4l2_stats.h
@@ -8,12 +8,11 @@ 
 #pragma once
 
 #include <map>
+#include <span>
 #include <stdint.h>
 
 #include <linux/media/v4l2-isp.h>
 
-#include <libcamera/base/span.h>
-
 namespace libcamera {
 
 namespace ipa {
@@ -21,17 +20,17 @@  namespace ipa {
 class V4L2StatsBase
 {
 public:
-	V4L2StatsBase(Span<uint8_t> data, unsigned int version);
+	V4L2StatsBase(std::span<uint8_t> data, unsigned int version);
 
-	Span<const uint8_t> block(unsigned int blockType, size_t blockSize) const;
+	std::span<const uint8_t> block(unsigned int blockType, size_t blockSize) const;
 	constexpr explicit operator bool()
 	{
 		return valid_;
 	}
 
 private:
-	std::map<uint16_t, Span<const uint8_t>> cache_;
-	Span<uint8_t> data_;
+	std::map<uint16_t, std::span<const uint8_t>> cache_;
+	std::span<uint8_t> data_;
 	bool valid_;
 };
 
@@ -41,7 +40,7 @@  class V4L2Stats : public V4L2StatsBase
 public:
 	static_assert(std::is_same_v<std::underlying_type_t<typename Traits::id_type>, uint16_t>);
 
-	V4L2Stats(Span<uint8_t> data, unsigned int version)
+	V4L2Stats(std::span<uint8_t> data, unsigned int version)
 		: V4L2StatsBase(data, version)
 	{
 	}
diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp
index 83bbf69385..fc6415b311 100644
--- a/src/ipa/mali-c55/algorithms/agc.cpp
+++ b/src/ipa/mali-c55/algorithms/agc.cpp
@@ -120,10 +120,10 @@  void AgcStatistics::parseStatistics(const mali_c55_stats_buffer *stats)
 						  static_cast<double>(b[i]) } });
 	}
 
-	rHist = Histogram(Span<uint32_t>(r, kNumHistogramBins));
-	gHist = Histogram(Span<uint32_t>(g, kNumHistogramBins));
-	bHist = Histogram(Span<uint32_t>(b, kNumHistogramBins));
-	yHist = Histogram(Span<uint32_t>(y, kNumHistogramBins));
+	rHist = Histogram(std::span<uint32_t>(r, kNumHistogramBins));
+	gHist = Histogram(std::span<uint32_t>(g, kNumHistogramBins));
+	bHist = Histogram(std::span<uint32_t>(b, kNumHistogramBins));
+	yHist = Histogram(std::span<uint32_t>(y, kNumHistogramBins));
 }
 
 Agc::Agc()
@@ -298,7 +298,7 @@  void Agc::fillWeightsArrayBuffer(MaliC55Params *params, const enum MaliC55Blocks
 	 * histograms containing a true pixel count, which we can then use to
 	 * approximate colour channel averages for the image.
 	 */
-	Span<uint8_t> weights{
+	std::span<uint8_t> weights{
 		block->zone_weights,
 		MALI_C55_MAX_ZONES
 	};
diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp
index 37350eb28f..d4f65ce259 100644
--- a/src/ipa/mali-c55/mali-c55.cpp
+++ b/src/ipa/mali-c55/mali-c55.cpp
@@ -7,6 +7,7 @@ 
 
 #include <array>
 #include <map>
+#include <span>
 #include <string.h>
 #include <vector>
 
@@ -15,7 +16,6 @@ 
 
 #include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/control_ids.h>
 #include <libcamera/ipa/ipa_interface.h>
@@ -241,7 +241,7 @@  void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo,
 
 	ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
 							      frameDurations[1],
-							      Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });
+							      std::span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });
 
 	/*
 	 * Compute exposure time limits from the V4L2_CID_EXPOSURE control
diff --git a/src/ipa/mali-c55/params.h b/src/ipa/mali-c55/params.h
index 2ce5526203..dc4d199402 100644
--- a/src/ipa/mali-c55/params.h
+++ b/src/ipa/mali-c55/params.h
@@ -70,7 +70,7 @@  struct param_traits {
 class MaliC55Params : public V4L2Params<details::param_traits>
 {
 public:
-	MaliC55Params(Span<uint8_t> data)
+	MaliC55Params(std::span<uint8_t> data)
 		: V4L2Params(data, V4L2_ISP_PARAMS_VERSION_V1)
 	{
 	}
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index aace46a8d0..16a2e88fdf 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -420,7 +420,7 @@  void Agc::prepare(IPAContext &context, const uint32_t frame,
 	 */
 	hstConfig->mode = RKISP1_CIF_ISP_HISTOGRAM_MODE_RGB_COMBINED;
 
-	Span<uint8_t> weights{
+	std::span<uint8_t> weights{
 		hstConfig->hist_weight,
 		context.hw.numHistogramWeights
 	};
diff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h
index dec79f2f39..79cdb6b5d0 100644
--- a/src/ipa/rkisp1/algorithms/agc.h
+++ b/src/ipa/rkisp1/algorithms/agc.h
@@ -7,9 +7,10 @@ 
 
 #pragma once
 
+#include <span>
+
 #include <linux/rkisp1-config.h>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include <libcamera/geometry.h>
@@ -54,8 +55,8 @@  private:
 				  IPAFrameContext &frameContext,
 				  utils::Duration frameDuration);
 
-	Span<const uint8_t> expMeans_;
-	Span<const uint8_t> weights_;
+	std::span<const uint8_t> expMeans_;
+	std::span<const uint8_t> weights_;
 
 	std::map<int32_t, std::vector<uint8_t>> meteringModes_;
 };
diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp
index f285865602..36f9a344ed 100644
--- a/src/ipa/rkisp1/algorithms/lsc.cpp
+++ b/src/ipa/rkisp1/algorithms/lsc.cpp
@@ -10,6 +10,7 @@ 
 #include <algorithm>
 #include <cmath>
 #include <numeric>
+#include <span>
 
 #include <libcamera/base/log.h>
 #include <libcamera/base/utils.h>
@@ -68,7 +69,7 @@  std::vector<double> parseSizes(const ValueNode &tuningData,
  * input:   | 0.2 | 0.3 |
  * output: 0.0   0.2   0.5   0.8   1.0
  */
-std::vector<double> sizesListToPositions(Span<const double> sizes)
+std::vector<double> sizesListToPositions(std::span<const double> sizes)
 {
 	const int half = sizes.size();
 	std::vector<double> positions(half * 2 + 1);
diff --git a/src/ipa/rkisp1/params.cpp b/src/ipa/rkisp1/params.cpp
index 71df0a939d..441d26ad53 100644
--- a/src/ipa/rkisp1/params.cpp
+++ b/src/ipa/rkisp1/params.cpp
@@ -91,7 +91,7 @@  void RkISP1Params::setBlockEnabled(BlockType type, bool enabled)
 		cfg->module_ens &= ~info.enableBit;
 }
 
-Span<uint8_t> RkISP1Params::block(BlockType type)
+std::span<uint8_t> RkISP1Params::block(BlockType type)
 {
 	auto infoIt = kBlockTypeInfo.find(type);
 	if (infoIt == kBlockTypeInfo.end()) {
diff --git a/src/ipa/rkisp1/params.h b/src/ipa/rkisp1/params.h
index 8e3672ca83..953c7639db 100644
--- a/src/ipa/rkisp1/params.h
+++ b/src/ipa/rkisp1/params.h
@@ -95,7 +95,7 @@  class RkISP1Params : public V4L2Params<details::params_traits>
 public:
 	static constexpr unsigned int kVersion = RKISP1_EXT_PARAM_BUFFER_V1;
 
-	RkISP1Params(uint32_t format, Span<uint8_t> data)
+	RkISP1Params(uint32_t format, std::span<uint8_t> data)
 		: V4L2Params(data, kVersion), format_(format)
 	{
 		if (format_ == V4L2_META_FMT_RK_ISP1_PARAMS) {
@@ -116,7 +116,7 @@  public:
 	void setBlockEnabled(BlockType type, bool enabled);
 
 private:
-	Span<uint8_t> block(BlockType type);
+	std::span<uint8_t> block(BlockType type);
 
 	uint32_t format_;
 };
@@ -126,7 +126,7 @@  class RkISP1ParamsBlock final : public V4L2ParamsBlock<T>
 {
 public:
 	RkISP1ParamsBlock(RkISP1Params *params, BlockType type,
-			  const Span<uint8_t> data)
+			  std::span<uint8_t> data)
 		: V4L2ParamsBlock<T>(data)
 	{
 		params_ = params;
@@ -184,7 +184,7 @@  public:
 private:
 	RkISP1Params *params_;
 	BlockType type_;
-	Span<uint8_t> cifData_;
+	std::span<uint8_t> cifData_;
 };
 
 } /* namespace ipa::rkisp1 */
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index e0dde542c7..d540aace2f 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -440,7 +440,7 @@  void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,
 	/* \todo Move this (and other agc-related controls) to agc */
 	context_.ctrlMap[&controls::FrameDurationLimits] =
 		ControlInfo(frameDurations[0], frameDurations[1],
-			    ControlValue(Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } }));
+			    ControlValue(std::span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } }));
 
 	ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());
 	*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);
diff --git a/src/ipa/rpi/cam_helper/cam_helper.cpp b/src/ipa/rpi/cam_helper/cam_helper.cpp
index ce00401375..a480de0043 100644
--- a/src/ipa/rpi/cam_helper/cam_helper.cpp
+++ b/src/ipa/rpi/cam_helper/cam_helper.cpp
@@ -58,7 +58,7 @@  CamHelper::~CamHelper()
 {
 }
 
-void CamHelper::prepare(Span<const uint8_t> buffer,
+void CamHelper::prepare(std::span<const uint8_t> buffer,
 			Metadata &metadata)
 {
 	parseEmbeddedData(buffer, metadata);
@@ -210,7 +210,7 @@  unsigned int CamHelper::getMinDebinFactor() const
 	return 2;
 }
 
-void CamHelper::parseEmbeddedData(Span<const uint8_t> buffer,
+void CamHelper::parseEmbeddedData(std::span<const uint8_t> buffer,
 				  Metadata &metadata)
 {
 	MdParser::RegisterMap registers;
diff --git a/src/ipa/rpi/cam_helper/cam_helper.h b/src/ipa/rpi/cam_helper/cam_helper.h
index 5a022d305f..bbaf57a1f2 100644
--- a/src/ipa/rpi/cam_helper/cam_helper.h
+++ b/src/ipa/rpi/cam_helper/cam_helper.h
@@ -7,10 +7,10 @@ 
 #pragma once
 
 #include <memory>
+#include <span>
 #include <string>
 #include <utility>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include "controller/camera_mode.h"
@@ -77,7 +77,7 @@  public:
 	virtual ~CamHelper();
 	void setCameraMode(const CameraMode &mode);
 	void setHwConfig(const Controller::HardwareConfig &hwConfig);
-	virtual void prepare(libcamera::Span<const uint8_t> buffer,
+	virtual void prepare(std::span<const uint8_t> buffer,
 			     Metadata &metadata);
 	virtual void process(StatisticsPtr &stats, Metadata &metadata);
 	virtual uint32_t exposureLines(const libcamera::utils::Duration exposure,
@@ -101,7 +101,7 @@  public:
 	virtual unsigned int getMinDebinFactor() const;
 
 protected:
-	void parseEmbeddedData(libcamera::Span<const uint8_t> buffer,
+	void parseEmbeddedData(std::span<const uint8_t> buffer,
 			       Metadata &metadata);
 	virtual void populateMetadata(const MdParser::RegisterMap &registers,
 				      Metadata &metadata) const;
diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp
index cbb10a92d4..2d193863ea 100644
--- a/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp
+++ b/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp
@@ -36,7 +36,7 @@  public:
 	double gain(uint32_t gainCode) const override;
 	uint32_t exposureLines(const Duration exposure, const Duration lineLength) const override;
 	Duration exposure(uint32_t exposureLines, const Duration lineLength) const override;
-	void prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;
+	void prepare(std::span<const uint8_t> buffer, Metadata &metadata) override;
 	bool sensorEmbeddedDataPresent() const override;
 	void populateMetadata(const MdParser::RegisterMap &registers,
 			      Metadata &metadata) const override;
@@ -83,7 +83,7 @@  Duration CamHelperImx296::exposure(uint32_t exposureLines,
 	return std::max<uint32_t>(minExposureLines, exposureLines) * timePerLine + 14.26us;
 }
 
-void CamHelperImx296::prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)
+void CamHelperImx296::prepare(std::span<const uint8_t> buffer, Metadata &metadata)
 {
 	/*
 	 * The imx296 embedded data is ahead by a single frame, i.e. embedded
diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx477.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx477.cpp
index a72ac67d8a..dfc0f602e2 100644
--- a/src/ipa/rpi/cam_helper/cam_helper_imx477.cpp
+++ b/src/ipa/rpi/cam_helper/cam_helper_imx477.cpp
@@ -48,7 +48,7 @@  public:
 	CamHelperImx477();
 	uint32_t gainCode(double gain) const override;
 	double gain(uint32_t gainCode) const override;
-	void prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;
+	void prepare(std::span<const uint8_t> buffer, Metadata &metadata) override;
 	std::pair<uint32_t, uint32_t> getBlanking(Duration &exposure, Duration minFrameDuration,
 						  Duration maxFrameDuration) const override;
 	bool sensorEmbeddedDataPresent() const override;
@@ -83,7 +83,7 @@  double CamHelperImx477::gain(uint32_t gainCode) const
 	return 1024.0 / (1024 - gainCode);
 }
 
-void CamHelperImx477::prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)
+void CamHelperImx477::prepare(std::span<const uint8_t> buffer, Metadata &metadata)
 {
 	MdParser::RegisterMap registers;
 	DeviceStatus deviceStatus;
diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp
index 10cbea4852..f722428c94 100644
--- a/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp
+++ b/src/ipa/rpi/cam_helper/cam_helper_imx519.cpp
@@ -48,7 +48,7 @@  public:
 	CamHelperImx519();
 	uint32_t gainCode(double gain) const override;
 	double gain(uint32_t gainCode) const override;
-	void prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;
+	void prepare(std::span<const uint8_t> buffer, Metadata &metadata) override;
 	std::pair<uint32_t, uint32_t> getBlanking(Duration &exposure, Duration minFrameDuration,
 						  Duration maxFrameDuration) const override;
 	bool sensorEmbeddedDataPresent() const override;
@@ -83,7 +83,7 @@  double CamHelperImx519::gain(uint32_t gainCode) const
 	return 1024.0 / (1024 - gainCode);
 }
 
-void CamHelperImx519::prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)
+void CamHelperImx519::prepare(std::span<const uint8_t> buffer, Metadata &metadata)
 {
 	MdParser::RegisterMap registers;
 	DeviceStatus deviceStatus;
diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp
index e7b8d67121..2b61a83011 100644
--- a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp
+++ b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp
@@ -50,7 +50,7 @@  public:
 	CamHelperImx708();
 	uint32_t gainCode(double gain) const override;
 	double gain(uint32_t gain_code) const override;
-	void prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;
+	void prepare(std::span<const uint8_t> buffer, Metadata &metadata) override;
 	void process(StatisticsPtr &stats, Metadata &metadata) override;
 	std::pair<uint32_t, uint32_t> getBlanking(Duration &exposure, Duration minFrameDuration,
 						  Duration maxFrameDuration) const override;
@@ -104,7 +104,7 @@  double CamHelperImx708::gain(uint32_t gain_code) const
 	return 1024.0 / (1024 - gain_code);
 }
 
-void CamHelperImx708::prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)
+void CamHelperImx708::prepare(std::span<const uint8_t> buffer, Metadata &metadata)
 {
 	MdParser::RegisterMap registers;
 	DeviceStatus deviceStatus;
diff --git a/src/ipa/rpi/cam_helper/md_parser.h b/src/ipa/rpi/cam_helper/md_parser.h
index 227c376cea..abc69753c2 100644
--- a/src/ipa/rpi/cam_helper/md_parser.h
+++ b/src/ipa/rpi/cam_helper/md_parser.h
@@ -9,10 +9,9 @@ 
 #include <initializer_list>
 #include <map>
 #include <optional>
+#include <span>
 #include <stdint.h>
 
-#include <libcamera/base/span.h>
-
 /*
  * Camera metadata parser class. Usage as shown below.
  *
@@ -101,7 +100,7 @@  public:
 		lineLengthBytes_ = numBytes;
 	}
 
-	virtual Status parse(libcamera::Span<const uint8_t> buffer,
+	virtual Status parse(std::span<const uint8_t> buffer,
 			     RegisterMap &registers) = 0;
 
 protected:
@@ -123,7 +122,7 @@  class MdParserSmia final : public MdParser
 public:
 	MdParserSmia(std::initializer_list<uint32_t> registerList);
 
-	MdParser::Status parse(libcamera::Span<const uint8_t> buffer,
+	MdParser::Status parse(std::span<const uint8_t> buffer,
 			       RegisterMap &registers) override;
 
 private:
@@ -147,7 +146,7 @@  private:
 		BadPadding   = -5
 	};
 
-	ParseStatus findRegs(libcamera::Span<const uint8_t> buffer);
+	ParseStatus findRegs(std::span<const uint8_t> buffer);
 
 	OffsetMap offsets_;
 };
diff --git a/src/ipa/rpi/cam_helper/md_parser_smia.cpp b/src/ipa/rpi/cam_helper/md_parser_smia.cpp
index c7bdcf94f6..a877b7ebbe 100644
--- a/src/ipa/rpi/cam_helper/md_parser_smia.cpp
+++ b/src/ipa/rpi/cam_helper/md_parser_smia.cpp
@@ -33,7 +33,7 @@  MdParserSmia::MdParserSmia(std::initializer_list<uint32_t> registerList)
 		offsets_[r] = {};
 }
 
-MdParser::Status MdParserSmia::parse(libcamera::Span<const uint8_t> buffer,
+MdParser::Status MdParserSmia::parse(std::span<const uint8_t> buffer,
 				     RegisterMap &registers)
 {
 	if (reset_) {
@@ -72,7 +72,7 @@  MdParser::Status MdParserSmia::parse(libcamera::Span<const uint8_t> buffer,
 	return OK;
 }
 
-MdParserSmia::ParseStatus MdParserSmia::findRegs(libcamera::Span<const uint8_t> buffer)
+MdParserSmia::ParseStatus MdParserSmia::findRegs(std::span<const uint8_t> buffer)
 {
 	ASSERT(offsets_.size());
 
diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
index 7e00c2799b..ab80ef64b6 100644
--- a/src/ipa/rpi/common/ipa_base.cpp
+++ b/src/ipa/rpi/common/ipa_base.cpp
@@ -9,9 +9,9 @@ 
 
 #include <array>
 #include <cmath>
+#include <span>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/control_ids.h>
 #include <libcamera/property_ids.h>
 
@@ -78,8 +78,8 @@  const ControlInfoMap::Map ipaControls{
 	{ &controls::FrameDurationLimits,
 	  ControlInfo(static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),
 		      static_cast<int64_t>(defaultMaxFrameDuration.get<std::micro>()),
-		      Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),
-						static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } }) },
+		      std::span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),
+						     static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } }) },
 	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
 	{ &controls::rpi::StatsOutputEnable, ControlInfo(false, true, false) },
 };
@@ -101,7 +101,7 @@  const ControlInfoMap::Map ipaAfControls{
 	{ &controls::AfSpeed, ControlInfo(controls::AfSpeedValues) },
 	{ &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
 	{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535),
-					    Span<const Rectangle, 1>{ { Rectangle{} } }) },
+					    std::span<const Rectangle, 1>{ { Rectangle{} } }) },
 	{ &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
 	{ &controls::AfPause, ControlInfo(controls::AfPauseValues) },
 	{ &controls::LensPosition, ControlInfo(0.0f, 32.0f, 1.0f) }
@@ -250,8 +250,8 @@  int32_t IpaBase::configure(const IPACameraSensorInfo &sensorInfo, const ConfigPa
 	ctrlMap[&controls::FrameDurationLimits] =
 		ControlInfo(static_cast<int64_t>(mode_.minFrameDuration.get<std::micro>()),
 			    static_cast<int64_t>(mode_.maxFrameDuration.get<std::micro>()),
-			    Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),
-						      static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } });
+			    std::span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),
+						           static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } });
 
 	ctrlMap[&controls::AnalogueGain] =
 		ControlInfo(static_cast<float>(mode_.minAnalogueGain),
@@ -417,7 +417,7 @@  void IpaBase::prepareIsp(const PrepareParams &params)
 	int64_t frameTimestamp = params.sensorControls.get(controls::SensorTimestamp).value_or(0);
 	unsigned int ipaContext = params.ipaContext % rpiMetadata_.size();
 	RPiController::Metadata &rpiMetadata = rpiMetadata_[ipaContext];
-	Span<uint8_t> embeddedBuffer;
+	std::span<uint8_t> embeddedBuffer;
 
 	rpiMetadata.clear();
 	fillDeviceStatus(params.sensorControls, ipaContext);
@@ -1177,7 +1177,7 @@  void IpaBase::applyControls(const ControlList &controls)
 			if (monoSensor_)
 				break;
 
-			auto floats = ctrl.second.get<Span<const float>>();
+			auto floats = ctrl.second.get<std::span<const float>>();
 			RPiController::CcmAlgorithm *ccm = dynamic_cast<RPiController::CcmAlgorithm *>(
 				controller_.getAlgorithm("ccm"));
 			if (!ccm) {
@@ -1287,7 +1287,7 @@  void IpaBase::applyControls(const ControlList &controls)
 		}
 
 		case controls::FRAME_DURATION_LIMITS: {
-			auto frameDurations = ctrl.second.get<Span<const int64_t>>();
+			auto frameDurations = ctrl.second.get<std::span<const int64_t>>();
 			applyFrameDurations(frameDurations[0] * 1.0us, frameDurations[1] * 1.0us);
 			break;
 		}
@@ -1351,7 +1351,7 @@  void IpaBase::applyControls(const ControlList &controls)
 					<< "Could not set AF_WINDOWS - no AF algorithm";
 				break;
 			}
-			af->setWindows(ctrl.second.get<Span<const Rectangle>>());
+			af->setWindows(ctrl.second.get<std::span<const Rectangle>>());
 			break;
 		}
 
diff --git a/src/ipa/rpi/common/ipa_base.h b/src/ipa/rpi/common/ipa_base.h
index 90f018b28a..0d7842f1f7 100644
--- a/src/ipa/rpi/common/ipa_base.h
+++ b/src/ipa/rpi/common/ipa_base.h
@@ -90,7 +90,7 @@  private:
 	virtual void platformPrepareIsp(const PrepareParams &params,
 					RPiController::Metadata &rpiMetadata) = 0;
 	virtual void platformPrepareAgc(RPiController::Metadata &rpiMetadata) = 0;
-	virtual RPiController::StatisticsPtr platformProcessStats(Span<uint8_t> mem) = 0;
+	virtual RPiController::StatisticsPtr platformProcessStats(std::span<uint8_t> mem) = 0;
 
 	void setMode(const IPACameraSensorInfo &sensorInfo);
 	void setCameraTimeoutValue();
diff --git a/src/ipa/rpi/controller/af_algorithm.h b/src/ipa/rpi/controller/af_algorithm.h
index 39a8de5a35..32a0774d0f 100644
--- a/src/ipa/rpi/controller/af_algorithm.h
+++ b/src/ipa/rpi/controller/af_algorithm.h
@@ -7,8 +7,7 @@ 
 #pragma once
 
 #include <optional>
-
-#include <libcamera/base/span.h>
+#include <span>
 
 #include "algorithm.h"
 
@@ -65,7 +64,7 @@  public:
 	virtual void setMetering([[maybe_unused]] bool use_windows)
 	{
 	}
-	virtual void setWindows([[maybe_unused]] libcamera::Span<libcamera::Rectangle const> const &wins)
+	virtual void setWindows([[maybe_unused]] std::span<libcamera::Rectangle const> wins)
 	{
 	}
 	virtual void setMode(AfMode mode) = 0;
diff --git a/src/ipa/rpi/controller/rpi/af.cpp b/src/ipa/rpi/controller/rpi/af.cpp
index 47c2bf9358..dd5b565140 100644
--- a/src/ipa/rpi/controller/rpi/af.cpp
+++ b/src/ipa/rpi/controller/rpi/af.cpp
@@ -856,7 +856,7 @@  void Af::setMetering(bool mode)
 	}
 }
 
-void Af::setWindows(libcamera::Span<libcamera::Rectangle const> const &wins)
+void Af::setWindows(std::span<libcamera::Rectangle const> wins)
 {
 	windows_.clear();
 	for (auto &w : wins) {
diff --git a/src/ipa/rpi/controller/rpi/af.h b/src/ipa/rpi/controller/rpi/af.h
index b464927ba9..c9b48f863e 100644
--- a/src/ipa/rpi/controller/rpi/af.h
+++ b/src/ipa/rpi/controller/rpi/af.h
@@ -59,7 +59,7 @@  public:
 	void setRange(AfRange range) override;
 	void setSpeed(AfSpeed speed) override;
 	void setMetering(bool use_windows) override;
-	void setWindows(libcamera::Span<libcamera::Rectangle const> const &wins) override;
+	void setWindows(std::span<libcamera::Rectangle const> wins) override;
 	void setMode(AfMode mode) override;
 	AfMode getMode() const override;
 	double getDefaultLensPosition() const override;
diff --git a/src/ipa/rpi/controller/rpi/alsc.cpp b/src/ipa/rpi/controller/rpi/alsc.cpp
index 4c852db04f..e13d6c6c28 100644
--- a/src/ipa/rpi/controller/rpi/alsc.cpp
+++ b/src/ipa/rpi/controller/rpi/alsc.cpp
@@ -9,10 +9,10 @@ 
 #include <cmath>
 #include <functional>
 #include <numeric>
+#include <span>
 #include <vector>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include "../awb_status.h"
 #include "alsc.h"
diff --git a/src/ipa/rpi/controller/rpi/awb_nn.cpp b/src/ipa/rpi/controller/rpi/awb_nn.cpp
index 6543d8cb9b..b2ccbfa64b 100644
--- a/src/ipa/rpi/controller/rpi/awb_nn.cpp
+++ b/src/ipa/rpi/controller/rpi/awb_nn.cpp
@@ -16,6 +16,7 @@ 
  */
 
 #include <algorithm>
+#include <span>
 
 #include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
@@ -169,7 +170,7 @@  static bool checkTensorShape(TfLiteTensor *tensor, const int *expectedDims, cons
 
 static std::string buildDimString(const int *dims, const int dimsSize)
 {
-	return "[" + utils::join(Span(dims, dimsSize), ",") + "]";
+	return "[" + utils::join(std::span(dims, dimsSize), ",") + "]";
 }
 
 void AwbNN::loadModel()
diff --git a/src/ipa/rpi/pisp/pisp.cpp b/src/ipa/rpi/pisp/pisp.cpp
index 88deccfd18..b8e5ed86e9 100644
--- a/src/ipa/rpi/pisp/pisp.cpp
+++ b/src/ipa/rpi/pisp/pisp.cpp
@@ -109,7 +109,7 @@  int generateLut(const ipa::Pwl &pwl, uint32_t *lut, std::size_t lutSize,
 	return 0;
 }
 
-int generateDecompandLut(const ipa::Pwl &pwl, Span<uint16_t> lut)
+int generateDecompandLut(const ipa::Pwl &pwl, std::span<uint16_t> lut)
 {
 	if (pwl.empty())
 		return -EINVAL;
@@ -235,7 +235,7 @@  private:
 	void platformPrepareIsp(const PrepareParams &params,
 				RPiController::Metadata &rpiMetadata) override;
 	void platformPrepareAgc(RPiController::Metadata &rpiMetadata) override;
-	RPiController::StatisticsPtr platformProcessStats(Span<uint8_t> mem) override;
+	RPiController::StatisticsPtr platformProcessStats(std::span<uint8_t> mem) override;
 
 	void handleControls(const ControlList &controls) override;
 
@@ -503,7 +503,7 @@  void IpaPiSP::platformPrepareAgc(RPiController::Metadata &rpiMetadata)
 	be_->SetGlobal(global);
 }
 
-RPiController::StatisticsPtr IpaPiSP::platformProcessStats(Span<uint8_t> mem)
+RPiController::StatisticsPtr IpaPiSP::platformProcessStats(std::span<uint8_t> mem)
 {
 	using namespace RPiController;
 
@@ -537,8 +537,8 @@  RPiController::StatisticsPtr IpaPiSP::platformProcessStats(Span<uint8_t> mem)
 		statistics->focusRegions.set(i, { stats->cdaf.foms[i] >> 20, 0, 0 });
 
 	if (statsMetadataOutput_) {
-		Span<const uint8_t> statsSpan(reinterpret_cast<const uint8_t *>(stats),
-					      sizeof(pisp_statistics));
+		const std::span statsSpan(reinterpret_cast<const uint8_t *>(stats),
+					  sizeof(pisp_statistics));
 		libcameraMetadata_.set(controls::rpi::PispStatsOutput, statsSpan);
 	}
 
diff --git a/src/ipa/rpi/vc4/vc4.cpp b/src/ipa/rpi/vc4/vc4.cpp
index f30eee7ff0..17d71be488 100644
--- a/src/ipa/rpi/vc4/vc4.cpp
+++ b/src/ipa/rpi/vc4/vc4.cpp
@@ -5,13 +5,13 @@ 
  * Raspberry Pi VC4/BCM2835 ISP IPA.
  */
 
+#include <span>
 #include <string.h>
 #include <sys/mman.h>
 
 #include <linux/bcm2835-isp.h>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/control_ids.h>
 #include <libcamera/ipa/ipa_module_info.h>
 
@@ -61,7 +61,7 @@  private:
 
 	void platformPrepareIsp(const PrepareParams &params, RPiController::Metadata &rpiMetadata) override;
 	void platformPrepareAgc([[maybe_unused]] RPiController::Metadata &rpiMetadata) override;
-	RPiController::StatisticsPtr platformProcessStats(Span<uint8_t> mem) override;
+	RPiController::StatisticsPtr platformProcessStats(std::span<uint8_t> mem) override;
 
 	void handleControls(const ControlList &controls) override;
 	bool validateIspControls();
@@ -211,7 +211,7 @@  void IpaVc4::platformPrepareAgc(RPiController::Metadata &rpiMetadata)
 	ctrls_ = ControlList(ispCtrls_);
 }
 
-RPiController::StatisticsPtr IpaVc4::platformProcessStats(Span<uint8_t> mem)
+RPiController::StatisticsPtr IpaVc4::platformProcessStats(std::span<uint8_t> mem)
 {
 	using namespace RPiController;
 
@@ -282,8 +282,8 @@  RPiController::StatisticsPtr IpaVc4::platformProcessStats(Span<uint8_t> mem)
 						  stats->focus_stats[i].contrast_val_num[1][0] });
 
 	if (statsMetadataOutput_) {
-		Span<const uint8_t> statsSpan(reinterpret_cast<const uint8_t *>(stats),
-					      sizeof(bcm2835_isp_stats));
+		const std::span statsSpan(reinterpret_cast<const uint8_t *>(stats),
+					 sizeof(bcm2835_isp_stats));
 		libcameraMetadata_.set(controls::rpi::Bcm2835StatsOutput, statsSpan);
 	}
 
@@ -396,8 +396,8 @@  void IpaVc4::applyCCM(const struct CcmStatus *ccmStatus, ControlList &ctrls)
 	ccm.enabled = 1;
 	ccm.ccm.offsets[0] = ccm.ccm.offsets[1] = ccm.ccm.offsets[2] = 0;
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&ccm),
-					    sizeof(ccm) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&ccm),
+						 sizeof(ccm) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_CC_MATRIX, c);
 }
 
@@ -410,8 +410,8 @@  void IpaVc4::applyBlackLevel(const struct BlackLevelStatus *blackLevelStatus, Co
 	blackLevel.black_level_g = blackLevelStatus->blackLevelG;
 	blackLevel.black_level_b = blackLevelStatus->blackLevelB;
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&blackLevel),
-					    sizeof(blackLevel) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&blackLevel),
+						 sizeof(blackLevel) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL, c);
 }
 
@@ -432,8 +432,8 @@  void IpaVc4::applyGamma(const struct ContrastStatus *contrastStatus, ControlList
 	gamma.y[numGammaPoints - 1] = 65535;
 	gamma.enabled = 1;
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&gamma),
-					    sizeof(gamma) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&gamma),
+						 sizeof(gamma) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_GAMMA, c);
 }
 
@@ -446,8 +446,8 @@  void IpaVc4::applyGEQ(const struct GeqStatus *geqStatus, ControlList &ctrls)
 	geq.slope.den = 1000;
 	geq.slope.num = 1000 * geqStatus->slope;
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&geq),
-					    sizeof(geq) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&geq),
+						 sizeof(geq) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_GEQ, c);
 }
 
@@ -480,12 +480,12 @@  void IpaVc4::applyDenoise(const struct DenoiseStatus *denoiseStatus, ControlList
 		cdn.enabled = 0;
 	}
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&denoise),
-					    sizeof(denoise) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&denoise),
+						 sizeof(denoise) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_DENOISE, c);
 
-	c = ControlValue(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&cdn),
-					      sizeof(cdn) });
+	c = ControlValue(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&cdn),
+						   sizeof(cdn) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_CDN, c);
 }
 
@@ -501,8 +501,8 @@  void IpaVc4::applySharpen(const struct SharpenStatus *sharpenStatus, ControlList
 	sharpen.limit.num = 1000 * sharpenStatus->limit;
 	sharpen.limit.den = 1000;
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&sharpen),
-					    sizeof(sharpen) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&sharpen),
+						 sizeof(sharpen) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_SHARPEN, c);
 }
 
@@ -513,8 +513,8 @@  void IpaVc4::applyDPC(const struct DpcStatus *dpcStatus, ControlList &ctrls)
 	dpc.enabled = 1;
 	dpc.strength = dpcStatus->strength;
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&dpc),
-					    sizeof(dpc) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&dpc),
+						 sizeof(dpc) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_DPC, c);
 }
 
@@ -570,8 +570,8 @@  void IpaVc4::applyLS(const struct AlscStatus *lsStatus, ControlList &ctrls)
 		resampleTable(grid + 3 * w * h, lsStatus->b, w, h);
 	}
 
-	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&ls),
-					    sizeof(ls) });
+	ControlValue c(std::span<const uint8_t>{ reinterpret_cast<uint8_t *>(&ls),
+						 sizeof(ls) });
 	ctrls.set(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING, c);
 }
 
diff --git a/src/libcamera/base/backtrace.cpp b/src/libcamera/base/backtrace.cpp
index 0b04629c93..76dfc8978a 100644
--- a/src/libcamera/base/backtrace.cpp
+++ b/src/libcamera/base/backtrace.cpp
@@ -27,9 +27,9 @@ 
 #endif
 
 #include <cxxabi.h>
+#include <span>
 #include <sstream>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 /**
@@ -291,7 +291,7 @@  std::string Backtrace::toString(unsigned int skipLevels) const
 		return std::string();
 
 	if (!backtraceText_.empty()) {
-		Span<const std::string> trace{ backtraceText_ };
+		std::span<const std::string> trace{ backtraceText_ };
 		return utils::join(trace.subspan(skipLevels), "");
 	}
 
@@ -301,7 +301,7 @@  std::string Backtrace::toString(unsigned int skipLevels) const
 	if (dwfl.isValid()) {
 		std::ostringstream msg;
 
-		Span<void *const> trace{ backtrace_ };
+		std::span<void *const> trace{ backtrace_ };
 		for (const void *ip : trace.subspan(skipLevels)) {
 			if (ip)
 				msg << dwfl.stackEntry(ip) << std::endl;
@@ -314,7 +314,7 @@  std::string Backtrace::toString(unsigned int skipLevels) const
 #endif
 
 #if HAVE_BACKTRACE
-	Span<void *const> trace{ backtrace_ };
+	std::span<void *const> trace{ backtrace_ };
 	trace = trace.subspan(skipLevels);
 
 	char **strings = backtrace_symbols(trace.data(), trace.size());
diff --git a/src/libcamera/base/file.cpp b/src/libcamera/base/file.cpp
index 2b83a51775..275085c1dc 100644
--- a/src/libcamera/base/file.cpp
+++ b/src/libcamera/base/file.cpp
@@ -301,7 +301,7 @@  off_t File::seek(off_t pos)
  * \return The number of bytes read on success, or a negative error code
  * otherwise
  */
-ssize_t File::read(const Span<uint8_t> &data)
+ssize_t File::read(std::span<uint8_t> data)
 {
 	if (!isOpen())
 		return -EINVAL;
@@ -339,7 +339,7 @@  ssize_t File::read(const Span<uint8_t> &data)
  * \return The number of bytes written on success, or a negative error code
  * otherwise
  */
-ssize_t File::write(const Span<const uint8_t> &data)
+ssize_t File::write(std::span<const uint8_t> data)
 {
 	if (!isOpen())
 		return -EINVAL;
@@ -384,7 +384,7 @@  ssize_t File::write(const Span<const uint8_t> &data)
  *
  * \return The mapped memory on success, or an empty span otherwise
  */
-Span<uint8_t> File::map(off_t offset, ssize_t size, File::MapFlags flags)
+std::span<uint8_t> File::map(off_t offset, ssize_t size, File::MapFlags flags)
 {
 	if (!isOpen()) {
 		error_ = -EBADF;
diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp
index bcb25ba6ee..b204355a58 100644
--- a/src/libcamera/base/thread.cpp
+++ b/src/libcamera/base/thread.cpp
@@ -433,7 +433,7 @@  bool Thread::wait(utils::duration duration)
  *
  * \return 0 if all indices are valid, -EINVAL otherwise
  */
-int Thread::setThreadAffinity(const Span<const unsigned int> &cpus)
+int Thread::setThreadAffinity(std::span<const unsigned int> cpus)
 {
 	const unsigned int numCpus = std::thread::hardware_concurrency();
 
diff --git a/src/libcamera/byte_stream_buffer.cpp b/src/libcamera/byte_stream_buffer.cpp
index fba9a6f3a0..3f173f0d3e 100644
--- a/src/libcamera/byte_stream_buffer.cpp
+++ b/src/libcamera/byte_stream_buffer.cpp
@@ -234,9 +234,9 @@  int ByteStreamBuffer::skip(size_t size)
  */
 
 /**
- * \fn template<typename T> int ByteStreamBuffer::read(const Span<T> &data)
- * \brief Read data from the managed memory buffer into Span \a data
- * \param[out] data Span representing the destination memory
+ * \fn template<typename T> int ByteStreamBuffer::read(std::span<T> data)
+ * \brief Read data from the managed memory buffer into \a data
+ * \param[out] data The destination memory
  * \return 0 on success, a negative error code otherwise
  * \retval -EACCES attempting to read from a write buffer
  * \retval -ENOSPC no more space is available in the managed memory buffer
@@ -265,7 +265,7 @@  int ByteStreamBuffer::skip(size_t size)
  */
 
 /**
- * \fn template<typename T> int ByteStreamBuffer::write(const Span<T> &data)
+ * \fn template<typename T> int ByteStreamBuffer::write(std::span<T> data)
  * \brief Write \a data to the managed memory buffer
  * \param[in] data The data to write to memory
  * \return 0 on success, a negative error code otherwise
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 93b9e603dd..9dadc91a38 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -1119,7 +1119,7 @@  const std::set<Stream *> &Camera::streams() const
  * \return A CameraConfiguration if the requested roles can be satisfied, or a
  * null pointer otherwise.
  */
-std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(Span<const StreamRole> roles)
+std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(std::span<const StreamRole> roles)
 {
 	Private *const d = _d();
 
diff --git a/src/libcamera/control_ids_rpi.yaml b/src/libcamera/control_ids_rpi.yaml
index 0b7da5b2b7..2e6d1f4381 100644
--- a/src/libcamera/control_ids_rpi.yaml
+++ b/src/libcamera/control_ids_rpi.yaml
@@ -24,7 +24,7 @@  controls:
       size: [n]
       direction: out
       description: |
-        Span of the BCM2835 ISP generated statistics for the current frame.
+        The BCM2835 ISP generated statistics for the current frame.
 
         This is sent in the Request metadata if the StatsOutputEnable is set to
         true.  The statistics struct definition can be found in
@@ -64,7 +64,7 @@  controls:
       direction: out
       size: [n]
       description: |
-        Span of the PiSP Frontend ISP generated statistics for the current
+        The PiSP Frontend ISP generated statistics for the current
         frame. This is sent in the Request metadata if the StatsOutputEnable is
         set to true. The statistics struct definition can be found in
         https://github.com/raspberrypi/libpisp/blob/main/src/libpisp/frontend/pisp_statistics.h
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index c0285cc6ca..ed962d3de3 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -9,10 +9,10 @@ 
 
 #include <algorithm>
 #include <memory>
+#include <span>
 #include <vector>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/control_ids.h>
 #include <libcamera/controls.h>
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 1e1b49e6bd..f5581dbb88 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -112,7 +112,7 @@  ControlValue::ControlValue()
  * \param[in] value Initial value
  *
  * This function constructs a new instance of ControlValue and stores the \a
- * value inside it. If the type \a T is equivalent to Span<R>, the instance
+ * value inside it. If the type \a T is equivalent to std::span<R>, the instance
  * stores an array of values of type \a R. Otherwise the instance stores a
  * single value of type \a T. The numElements() and type() are updated to
  * reflect the stored value.
@@ -189,7 +189,7 @@  ControlValue &ControlValue::operator=(const ControlValue &other)
  * \brief Retrieve the raw data of a control value
  * \return The raw data of the control value as a span of uint8_t
  */
-Span<const uint8_t> ControlValue::data() const
+std::span<const uint8_t> ControlValue::data() const
 {
 	std::size_t size = numElements_ * ControlValueSize[type_];
 	const uint8_t *data = size > sizeof(value_)
@@ -201,9 +201,9 @@  Span<const uint8_t> ControlValue::data() const
 /**
  * \copydoc ControlValue::data() const
  */
-Span<uint8_t> ControlValue::data()
+std::span<uint8_t> ControlValue::data()
 {
-	Span<const uint8_t> data = const_cast<const ControlValue *>(this)->data();
+	std::span<const uint8_t> data = const_cast<const ControlValue *>(this)->data();
 	return { const_cast<uint8_t *>(data.data()), data.size() };
 }
 
@@ -324,12 +324,12 @@  bool ControlValue::operator==(const ControlValue &other) const
  * This function returns the contained value as an instance of \a T. If the
  * ControlValue instance stores a single value, the type \a T shall match the
  * stored value type(). If the instance stores an array of values, the type
- * \a T should be equal to Span<const R>, and the type \a R shall match the
+ * \a T should be equal to std::span<const R>, and the type \a R shall match the
  * stored value type(). The behaviour is undefined otherwise.
  *
  * Note that a ControlValue instance that stores a non-array value is not
  * equivalent to an instance that stores an array value containing a single
- * element. The latter shall be accessed through a Span<const R> type, while
+ * element. The latter shall be accessed through a std::span<const R> type, while
  * the former shall be accessed through a type \a T corresponding to type().
  *
  * \return The control value
@@ -341,13 +341,13 @@  bool ControlValue::operator==(const ControlValue &other) const
  * \param[in] value The control value
  *
  * This function stores the \a value in the instance. If the type \a T is
- * equivalent to Span<R>, the instance stores an array of values of type \a R.
+ * equivalent to std::span<R>, the instance stores an array of values of type \a R.
  * Otherwise the instance stores a single value of type \a T. The numElements()
  * and type() are updated to reflect the stored value.
  *
  * The entire content of \a value is copied to the instance, no reference to \a
  * value or to the data it references is retained. This may be an expensive
- * operation for Span<> values that refer to large arrays.
+ * operation for std::span<> values that refer to large arrays.
  */
 
 void ControlValue::set(ControlType type, bool isArray, const void *data,
@@ -357,7 +357,7 @@  void ControlValue::set(ControlType type, bool isArray, const void *data,
 
 	reserve(type, isArray, numElements);
 
-	Span<uint8_t> storage = ControlValue::data();
+	std::span<uint8_t> storage = ControlValue::data();
 	memcpy(storage.data(), data, storage.size());
 }
 
@@ -613,7 +613,7 @@  ControlInfo::ControlInfo(const ControlValue &min,
  * values list respectively. The default value is set to \a def if provided, or
  * to the minimum value otherwise.
  */
-ControlInfo::ControlInfo(Span<const ControlValue> values,
+ControlInfo::ControlInfo(std::span<const ControlValue> values,
 			 const ControlValue &def)
 {
 	min_ = values.front();
@@ -1074,7 +1074,7 @@  bool ControlList::contains(unsigned int id) const
  */
 
 /**
- * \fn ControlList::set(const Control<Span<T, Size>> &ctrl, const std::initializer_list<V> &value)
+ * \fn ControlList::set(const Control<std::span<T, Size>> &ctrl, const std::initializer_list<V> &value)
  * \copydoc ControlList::set(const Control<T> &ctrl, const V &value)
  */
 
diff --git a/src/libcamera/converter/converter_dw100.cpp b/src/libcamera/converter/converter_dw100.cpp
index 77f778c7f1..290883124d 100644
--- a/src/libcamera/converter/converter_dw100.cpp
+++ b/src/libcamera/converter/converter_dw100.cpp
@@ -501,7 +501,7 @@  int ConverterDW100Module::applyControls(const Stream *stream, const V4L2Request
 		return 0;
 
 	std::vector<uint32_t> map = info.map.getVertexMap();
-	auto value = Span<const int32_t>(reinterpret_cast<const int32_t *>(&map[0]), map.size());
+	auto value = std::span<const int32_t>(reinterpret_cast<const int32_t *>(&map[0]), map.size());
 
 	ControlList ctrls;
 	ctrls.set(V4L2_CID_DW100_DEWARPING_16x16_VERTEX_MAP, value);
diff --git a/src/libcamera/converter/converter_dw100_vertexmap.cpp b/src/libcamera/converter/converter_dw100_vertexmap.cpp
index d5fbfdaafd..5b81343570 100644
--- a/src/libcamera/converter/converter_dw100_vertexmap.cpp
+++ b/src/libcamera/converter/converter_dw100_vertexmap.cpp
@@ -10,12 +10,12 @@ 
 #include <algorithm>
 #include <assert.h>
 #include <cmath>
+#include <span>
 #include <stdint.h>
 #include <utility>
 #include <vector>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/geometry.h>
 #include <libcamera/transform.h>
@@ -255,7 +255,7 @@  int dw100VerticesForLength(const int length)
  *
  * \return 0 on success or -EINVAL if \a coeffs has the wrong size
  */
-int Dw100VertexMap::DewarpParams::setCoefficients(Span<const double> coeffs)
+int Dw100VertexMap::DewarpParams::setCoefficients(std::span<const double> coeffs)
 {
 	size_t s = coeffs.size();
 	if (!(s == 4 || s == 5 || s == 8 || s == 12))
diff --git a/src/libcamera/egl.cpp b/src/libcamera/egl.cpp
index 92024c8e88..3cde9040a9 100644
--- a/src/libcamera/egl.cpp
+++ b/src/libcamera/egl.cpp
@@ -515,8 +515,8 @@  void eGL::pushEnv(std::vector<std::string> &shaderEnv, const char *str)
  * \return 0 on success, or -EINVAL on compilation failure
  */
 int eGL::compileVertexShader(GLuint &shaderId,
-			     Span<const unsigned char> shaderData,
-			     Span<const std::string> shaderEnv)
+			     std::span<const unsigned char> shaderData,
+			     std::span<const std::string> shaderEnv)
 {
 	return compileShader(GL_VERTEX_SHADER, shaderId, shaderData, shaderEnv);
 }
@@ -533,8 +533,8 @@  int eGL::compileVertexShader(GLuint &shaderId,
  * \return 0 on success, or -EINVAL on compilation failure
  */
 int eGL::compileFragmentShader(GLuint &shaderId,
-			       Span<const unsigned char> shaderData,
-			       Span<const std::string> shaderEnv)
+			       std::span<const unsigned char> shaderData,
+			       std::span<const std::string> shaderEnv)
 {
 	return compileShader(GL_FRAGMENT_SHADER, shaderId, shaderData, shaderEnv);
 }
@@ -552,8 +552,8 @@  int eGL::compileFragmentShader(GLuint &shaderId,
  * \return 0 on success, or -EINVAL on compilation failure
  */
 int eGL::compileShader(int shaderType, GLuint &shaderId,
-		       Span<const unsigned char> shaderData,
-		       Span<const std::string> shaderEnv)
+		       std::span<const unsigned char> shaderData,
+		       std::span<const std::string> shaderEnv)
 {
 	GLint success;
 	size_t i;
diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
index 6ea4d6ea21..0e9942953c 100644
--- a/src/libcamera/framebuffer.cpp
+++ b/src/libcamera/framebuffer.cpp
@@ -130,7 +130,7 @@  LOG_DEFINE_CATEGORY(Buffer)
  * \param[in] planes The frame memory planes
  * \param[in] cookie Cookie
  */
-FrameBuffer::Private::Private(Span<const Plane> planes, uint64_t cookie)
+FrameBuffer::Private::Private(std::span<const Plane> planes, uint64_t cookie)
 	: planes_(planes.begin(), planes.end()), cookie_(cookie),
 	  request_(nullptr), isContiguous_(true)
 {
@@ -309,7 +309,7 @@  ino_t fileDescriptorInode(const SharedFD &fd)
  * \param[in] planes The frame memory planes
  * \param[in] cookie Cookie
  */
-FrameBuffer::FrameBuffer(Span<const Plane> planes, unsigned int cookie)
+FrameBuffer::FrameBuffer(std::span<const Plane> planes, unsigned int cookie)
 	: FrameBuffer(std::make_unique<Private>(planes, cookie))
 {
 }
@@ -359,7 +359,7 @@  FrameBuffer::FrameBuffer(std::unique_ptr<Private> d)
  * \brief Retrieve the static plane descriptors
  * \return Array of plane descriptors
  */
-Span<const FrameBuffer::Plane> FrameBuffer::planes() const
+std::span<const FrameBuffer::Plane> FrameBuffer::planes() const
 {
 	return _d()->planes_;
 }
diff --git a/src/libcamera/ipa_data_serializer.cpp b/src/libcamera/ipa_data_serializer.cpp
index 0537f785b1..f10b300c80 100644
--- a/src/libcamera/ipa_data_serializer.cpp
+++ b/src/libcamera/ipa_data_serializer.cpp
@@ -29,7 +29,7 @@  LOG_DEFINE_CATEGORY(IPADataSerializer)
  * Static template class that provides functions for serializing and
  * deserializing IPA data.
  *
- * \todo Switch to Span instead of byte and fd vector
+ * \todo Switch to std::span instead of byte and fd vector
  *
  * \todo Harden the vector and map deserializer
  *
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
index 845a09f107..0fd17e5818 100644
--- a/src/libcamera/ipa_manager.cpp
+++ b/src/libcamera/ipa_manager.cpp
@@ -300,7 +300,7 @@  bool IPAManager::isSignatureValid([[maybe_unused]] IPAModule *ipa) const
 	if (!file.open(File::OpenModeFlag::ReadOnly))
 		return false;
 
-	Span<uint8_t> data = file.map();
+	std::span<uint8_t> data = file.map();
 	if (data.empty())
 		return false;
 
diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp
index 264bb1f2df..cc7d533c44 100644
--- a/src/libcamera/ipa_module.cpp
+++ b/src/libcamera/ipa_module.cpp
@@ -14,6 +14,7 @@ 
 #include <errno.h>
 #include <fcntl.h>
 #include <link.h>
+#include <span>
 #include <string.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -21,7 +22,6 @@ 
 
 #include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 /**
@@ -41,7 +41,7 @@  LOG_DEFINE_CATEGORY(IPAModule)
 namespace {
 
 template<typename T>
-typename std::remove_extent_t<T> *elfPointer(Span<const uint8_t> elf,
+typename std::remove_extent_t<T> *elfPointer(std::span<const uint8_t> elf,
 					     off_t offset, size_t objSize)
 {
 	size_t size = offset + objSize;
@@ -53,13 +53,13 @@  typename std::remove_extent_t<T> *elfPointer(Span<const uint8_t> elf,
 }
 
 template<typename T>
-typename std::remove_extent_t<T> *elfPointer(Span<const uint8_t> elf,
+typename std::remove_extent_t<T> *elfPointer(std::span<const uint8_t> elf,
 					     off_t offset)
 {
 	return elfPointer<T>(elf, offset, sizeof(T));
 }
 
-int elfVerifyIdent(Span<const uint8_t> elf)
+int elfVerifyIdent(std::span<const uint8_t> elf)
 {
 	const char *e_ident = elfPointer<const char[EI_NIDENT]>(elf, 0);
 	if (!e_ident)
@@ -85,7 +85,7 @@  int elfVerifyIdent(Span<const uint8_t> elf)
 	return 0;
 }
 
-const ElfW(Shdr) *elfSection(Span<const uint8_t> elf, const ElfW(Ehdr) *eHdr,
+const ElfW(Shdr) *elfSection(std::span<const uint8_t> elf, const ElfW(Ehdr) *eHdr,
 			     ElfW(Half) idx)
 {
 	if (idx >= eHdr->e_shnum)
@@ -104,7 +104,7 @@  const ElfW(Shdr) *elfSection(Span<const uint8_t> elf, const ElfW(Ehdr) *eHdr,
  * \return The memory region storing the symbol on success, or an empty span
  * otherwise
  */
-Span<const uint8_t> elfLoadSymbol(Span<const uint8_t> elf, const char *symbol)
+std::span<const uint8_t> elfLoadSymbol(std::span<const uint8_t> elf, const char *symbol)
 {
 	const ElfW(Ehdr) *eHdr = elfPointer<const ElfW(Ehdr)>(elf, 0);
 	if (!eHdr)
@@ -274,14 +274,14 @@  int IPAModule::loadIPAModuleInfo()
 		return file.error();
 	}
 
-	Span<const uint8_t> data = file.map();
+	std::span<const uint8_t> data = file.map();
 	int ret = elfVerifyIdent(data);
 	if (ret) {
 		LOG(IPAModule, Error) << "IPA module is not an ELF file";
 		return ret;
 	}
 
-	Span<const uint8_t> info = elfLoadSymbol(data, "ipaModuleInfo");
+	std::span<const uint8_t> info = elfLoadSymbol(data, "ipaModuleInfo");
 	if (info.size() < sizeof(info_)) {
 		LOG(IPAModule, Error) << "IPA module has no valid info";
 		return -EINVAL;
diff --git a/src/libcamera/mapped_framebuffer.cpp b/src/libcamera/mapped_framebuffer.cpp
index f54bbf21f1..53087dc27f 100644
--- a/src/libcamera/mapped_framebuffer.cpp
+++ b/src/libcamera/mapped_framebuffer.cpp
@@ -43,7 +43,7 @@  LOG_DECLARE_CATEGORY(Buffer)
  * \typedef MappedBuffer::Plane
  * \brief A mapped region of memory accessible to the CPU
  *
- * The MappedBuffer::Plane uses the Span interface to describe the mapped memory
+ * The MappedBuffer::Plane uses std::span to describe the mapped memory
  * region.
  */
 
@@ -117,7 +117,7 @@  MappedBuffer::~MappedBuffer()
  * \brief Retrieve the mapped planes
  *
  * This function retrieves the successfully mapped planes stored as a vector
- * of Span<uint8_t> to provide access to the mapped memory.
+ * of std::span<uint8_t> to provide access to the mapped memory.
  *
  * \return A vector of the mapped planes
  */
diff --git a/src/libcamera/matrix.cpp b/src/libcamera/matrix.cpp
index 0950408bb8..9cb0885b3b 100644
--- a/src/libcamera/matrix.cpp
+++ b/src/libcamera/matrix.cpp
@@ -48,11 +48,11 @@  LOG_DEFINE_CATEGORY(Matrix)
  */
 
 /**
- * \fn Matrix::Matrix(const Span<const T, Rows * Cols> data)
+ * \fn Matrix::Matrix(std::span<const T, Rows * Cols> data)
  * \brief Construct a matrix from supplied data
  * \param[in] data Data from which to construct a matrix
  *
- * \a data is a one-dimensional Span and will be turned into a matrix in
+ * \a data is a one-dimensional span and will be turned into a matrix in
  * row-major order. The size of \a data must be equal to the product of the
  * number of rows and columns of the matrix (Rows x Cols).
  */
@@ -80,17 +80,17 @@  LOG_DEFINE_CATEGORY(Matrix)
  */
 
 /**
- * \fn Span<const T, Cols> Matrix::operator[](size_t i) const
+ * \fn std::span<const T, Cols> Matrix::operator[](size_t i) const
  * \brief Index to a row in the matrix
  * \param[in] i Index of row to retrieve
  *
- * This operator[] returns a Span, which can then be indexed into again with
+ * This operator[] returns a span, which can then be indexed into again with
  * another operator[], allowing a convenient m[i][j] to access elements of the
- * matrix. Note that the lifetime of the Span returned by this first-level
+ * matrix. Note that the lifetime of the span returned by this first-level
  * operator[] is bound to that of the Matrix itself, so it is not recommended
- * to save the Span that is the result of this operator[].
+ * to save the span that is the result of this operator[].
  *
- * \return Row \a i from the matrix, as a Span
+ * \return Row \a i from the matrix, as a span
  */
 
 /**
@@ -164,8 +164,8 @@  LOG_DEFINE_CATEGORY(Matrix)
 
 #ifndef __DOXYGEN__
 template<typename T>
-bool matrixInvert(Span<const T> dataIn, Span<T> dataOut, unsigned int dim,
-		  Span<T> scratchBuffer, Span<unsigned int> swapBuffer)
+bool matrixInvert(std::span<const T> dataIn, std::span<T> dataOut, unsigned int dim,
+		  std::span<T> scratchBuffer, std::span<unsigned int> swapBuffer)
 {
 	/*
 	 * Convenience class to access matrix data, providing a row-major (i,j)
@@ -175,7 +175,7 @@  bool matrixInvert(Span<const T> dataIn, Span<T> dataOut, unsigned int dim,
 	class MatrixAccessor
 	{
 	public:
-		MatrixAccessor(Span<T> data, Span<unsigned int> swapBuffer, unsigned int rows, unsigned int cols)
+		MatrixAccessor(std::span<T> data, std::span<unsigned int> swapBuffer, unsigned int rows, unsigned int cols)
 			: data_(data), swap_(swapBuffer), rows_(rows), cols_(cols)
 		{
 			ASSERT(swap_.size() == rows);
@@ -200,8 +200,8 @@  bool matrixInvert(Span<const T> dataIn, Span<T> dataOut, unsigned int dim,
 			return swap_[row] * cols_ + col;
 		}
 
-		Span<T> data_;
-		Span<unsigned int> swap_;
+		std::span<T> data_;
+		std::span<unsigned int> swap_;
 		unsigned int rows_;
 		unsigned int cols_;
 	};
@@ -302,12 +302,12 @@  bool matrixInvert(Span<const T> dataIn, Span<T> dataOut, unsigned int dim,
 	return true;
 }
 
-template bool matrixInvert<float>(Span<const float> dataIn, Span<float> dataOut,
-				  unsigned int dim, Span<float> scratchBuffer,
-				  Span<unsigned int> swapBuffer);
-template bool matrixInvert<double>(Span<const double> data, Span<double> dataOut,
-				   unsigned int dim, Span<double> scratchBuffer,
-				   Span<unsigned int> swapBuffer);
+template bool matrixInvert<float>(std::span<const float> dataIn, std::span<float> dataOut,
+				  unsigned int dim, std::span<float> scratchBuffer,
+				  std::span<unsigned int> swapBuffer);
+template bool matrixInvert<double>(std::span<const double> data, std::span<double> dataOut,
+				   unsigned int dim, std::span<double> scratchBuffer,
+				   std::span<unsigned int> swapBuffer);
 
 /*
  * The value node shall be a list of numerical values. Its size shall be equal
diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
index c3d2695556..c907e4a609 100644
--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
@@ -107,7 +107,7 @@  public:
 	bool match(DeviceEnumerator *enumerator) override;
 
 	std::unique_ptr<CameraConfiguration>
-	generateConfiguration(Camera *camera, Span<const StreamRole> roles) override;
+	generateConfiguration(Camera *camera, std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -742,7 +742,7 @@  StreamConfiguration PipelineHandlerISI::generateRawConfiguration(Camera *camera)
 
 std::unique_ptr<CameraConfiguration>
 PipelineHandlerISI::generateConfiguration(Camera *camera,
-					  Span<const StreamRole> roles)
+					  std::span<const StreamRole> roles)
 {
 	ISICameraData *data = cameraData(camera);
 	std::unique_ptr<ISICameraConfiguration> config =
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 0f3e169d3b..14cab9e555 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -135,7 +135,7 @@  public:
 	PipelineHandlerIPU3(CameraManager *manager);
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -390,7 +390,7 @@  PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)
 }
 
 std::unique_ptr<CameraConfiguration>
-PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole> roles)
+PipelineHandlerIPU3::generateConfiguration(Camera *camera, std::span<const StreamRole> roles)
 {
 	IPU3CameraData *data = cameraData(camera);
 	std::unique_ptr<IPU3CameraConfiguration> config =
@@ -679,7 +679,7 @@  int PipelineHandlerIPU3::allocateBuffers(Camera *camera)
 
 	auto pushBuffers = [&](const std::vector<std::unique_ptr<FrameBuffer>> &buffers) {
 		for (const std::unique_ptr<FrameBuffer> &buffer : buffers) {
-			Span<const FrameBuffer::Plane> planes = buffer->planes();
+			std::span<const FrameBuffer::Plane> planes = buffer->planes();
 
 			buffer->setCookie(ipaBufferId++);
 			ipaBuffers_.emplace_back(buffer->cookie(),
diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
index 599ff88b59..73a03373c8 100644
--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
@@ -679,7 +679,7 @@  public:
 	PipelineHandlerMaliC55(CameraManager *manager);
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -792,7 +792,7 @@  PipelineHandlerMaliC55::PipelineHandlerMaliC55(CameraManager *manager)
 
 std::unique_ptr<CameraConfiguration>
 PipelineHandlerMaliC55::generateConfiguration(Camera *camera,
-					      Span<const StreamRole> roles)
+					      std::span<const StreamRole> roles)
 {
 	MaliC55CameraData *data = cameraData(camera);
 	std::unique_ptr<CameraConfiguration> config =
@@ -1248,7 +1248,7 @@  int PipelineHandlerMaliC55::allocateBuffers(Camera *camera)
 			       std::queue<FrameBuffer *> &queue,
 			       std::vector<IPABuffer> &ipaBuffers) {
 		for (const std::unique_ptr<FrameBuffer> &buffer : buffers) {
-			Span<const FrameBuffer::Plane> planes = buffer->planes();
+			std::span<const FrameBuffer::Plane> planes = buffer->planes();
 
 			buffer->setCookie(ipaBufferId++);
 			ipaBuffers.emplace_back(buffer->cookie(),
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 4f9c0aa741..96382c93a4 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -187,7 +187,7 @@  public:
 	PipelineHandlerRkISP1(CameraManager *manager);
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -788,7 +788,7 @@  PipelineHandlerRkISP1::PipelineHandlerRkISP1(CameraManager *manager)
 
 std::unique_ptr<CameraConfiguration>
 PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
-					     Span<const StreamRole> roles)
+					     std::span<const StreamRole> roles)
 {
 	RkISP1CameraData *data = cameraData(camera);
 
@@ -1176,7 +1176,7 @@  int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
 	auto pushBuffers = [&](const std::vector<std::unique_ptr<FrameBuffer>> &buffers,
 			       std::queue<FrameBuffer *> &queue) {
 		for (const std::unique_ptr<FrameBuffer> &buffer : buffers) {
-			Span<const FrameBuffer::Plane> planes = buffer->planes();
+			std::span<const FrameBuffer::Plane> planes = buffer->planes();
 
 			buffer->setCookie(ipaBufferId++);
 			data->ipaBuffers_.emplace_back(buffer->cookie(),
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
index ef9cfbdc32..2015733702 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
@@ -56,7 +56,7 @@  const std::map<PixelFormat, uint32_t> formatToMediaBus = {
 
 } /* namespace */
 
-RkISP1Path::RkISP1Path(const char *name, const Span<const PixelFormat> &formats,
+RkISP1Path::RkISP1Path(const char *name, std::span<const PixelFormat> formats,
 		       const Size &minResolution, const Size &maxResolution)
 	: name_(name), running_(false), formats_(formats),
 	  minResolution_(minResolution), maxResolution_(maxResolution),
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
index 0c68e9eb99..16e6890352 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
@@ -9,11 +9,11 @@ 
 
 #include <map>
 #include <memory>
+#include <span>
 #include <set>
 #include <vector>
 
 #include <libcamera/base/signal.h>
-#include <libcamera/base/span.h>
 
 #include <libcamera/camera.h>
 #include <libcamera/geometry.h>
@@ -34,7 +34,7 @@  struct V4L2SubdeviceFormat;
 class RkISP1Path
 {
 public:
-	RkISP1Path(const char *name, const Span<const PixelFormat> &formats,
+	RkISP1Path(const char *name, std::span<const PixelFormat> formats,
 		   const Size &minResolution, const Size &maxResolution);
 
 	bool init(std::shared_ptr<MediaDevice> media);
@@ -72,7 +72,7 @@  private:
 	const char *name_;
 	bool running_;
 
-	const Span<const PixelFormat> formats_;
+	const std::span<const PixelFormat> formats_;
 	std::set<PixelFormat> streamFormats_;
 	Size minResolution_;
 	Size maxResolution_;
diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
index 802b2b3c7e..71f3f26a4f 100644
--- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
@@ -388,7 +388,7 @@  V4L2DeviceFormat PipelineHandlerBase::toV4L2DeviceFormat(const V4L2VideoDevice *
 }
 
 std::unique_ptr<CameraConfiguration>
-PipelineHandlerBase::generateConfiguration(Camera *camera, Span<const StreamRole> roles)
+PipelineHandlerBase::generateConfiguration(Camera *camera, std::span<const StreamRole> roles)
 {
 	CameraData *data = cameraData(camera);
 	std::unique_ptr<CameraConfiguration> config =
@@ -903,7 +903,7 @@  void PipelineHandlerBase::mapBuffers(Camera *camera, const BufferMap &buffers, u
 	 * handler and the IPA.
 	 */
 	for (const auto &[id, buffer] : buffers) {
-		Span<const FrameBuffer::Plane> planes = buffer.buffer->planes();
+		std::span<const FrameBuffer::Plane> planes = buffer.buffer->planes();
 
 		bufferIds.emplace_back(mask | id,
 				       std::vector<FrameBuffer::Plane>{ planes.begin(), planes.end() });
@@ -1264,7 +1264,7 @@  void CameraData::metadataReady(const ControlList &metadata)
 			*notifyGainsUnity_,
 			static_cast<int32_t>((*colourGains)[0] * *notifyGainsUnity_)
 		};
-		ctrls.set(V4L2_CID_NOTIFY_GAINS, Span<const int32_t>{ gains });
+		ctrls.set(V4L2_CID_NOTIFY_GAINS, std::span<const int32_t>{ gains });
 
 		sensor_->setControls(&ctrls);
 	}
@@ -1322,7 +1322,7 @@  Rectangle CameraData::scaleIspCrop(const Rectangle &ispCrop) const
 
 void CameraData::applyScalerCrop(const ControlList &controls)
 {
-	const auto &scalerCropRPi = controls.get<Span<const Rectangle>>(controls::rpi::ScalerCrops);
+	const auto &scalerCropRPi = controls.get<std::span<const Rectangle>>(controls::rpi::ScalerCrops);
 	const auto &scalerCropCore = controls.get<Rectangle>(controls::ScalerCrop);
 	std::vector<Rectangle> scalerCrops;
 
@@ -1532,8 +1532,8 @@  void CameraData::fillRequestMetadata(const ControlList &bufferControls, Request
 		request->_d()->metadata().set(controls::ScalerCrop, crops[0]);
 		if (crops.size() > 1) {
 			request->_d()->metadata().set(controls::rpi::ScalerCrops,
-						      Span<const Rectangle>(crops.data(),
-									    crops.size()));
+						      std::span<const Rectangle>(crops.data(),
+										 crops.size()));
 		}
 	}
 }
diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h
index 758155ee0d..ca12a4875f 100644
--- a/src/libcamera/pipeline/rpi/common/pipeline_base.h
+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h
@@ -224,7 +224,7 @@  public:
 						   BayerFormat::Packing packingReq);
 
 	std::unique_ptr<CameraConfiguration>
-	generateConfiguration(Camera *camera, Span<const StreamRole> roles) override;
+	generateConfiguration(Camera *camera, std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, libcamera::Stream *stream,
diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp
index 406d683dc5..159c6b05ee 100644
--- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp
+++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp
@@ -2274,7 +2274,7 @@  void PiSPCameraData::prepareCfe()
 
 	{
 		std::scoped_lock<FrontEnd> l(*fe_);
-		Span<uint8_t> configBuffer = config.mapped->planes()[0];
+		std::span<uint8_t> configBuffer = config.mapped->planes()[0];
 		fe_->Prepare(reinterpret_cast<pisp_fe_config *>(configBuffer.data()));
 	}
 
@@ -2309,7 +2309,7 @@  void PiSPCameraData::prepareBe(uint32_t bufferId, bool stitchSwapBuffers)
 	const RPi::BufferObject &config = isp_[Isp::Config].acquireBuffer();
 	ASSERT(config.mapped);
 
-	Span<uint8_t> configBufferSpan = config.mapped->planes()[0];
+	std::span<uint8_t> configBufferSpan = config.mapped->planes()[0];
 	pisp_be_tiles_config *configBuffer = reinterpret_cast<pisp_be_tiles_config *>(configBufferSpan.data());
 	be_->Prepare(configBuffer);
 
diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
index 3e9a490589..200e3b5872 100644
--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp
+++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
@@ -893,7 +893,7 @@  void Vc4CameraData::setIspControls(const ControlList &controls)
 	if (ctrls.contains(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING)) {
 		ControlValue &value =
 			const_cast<ControlValue &>(ctrls.get(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING));
-		Span<uint8_t> s = value.data();
+		std::span<uint8_t> s = value.data();
 		bcm2835_isp_lens_shading *ls =
 			reinterpret_cast<bcm2835_isp_lens_shading *>(s.data());
 		ls->dmabuf = lsTable_.get();
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index e20f08b67d..e7e387342a 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -412,7 +412,7 @@  public:
 	SimplePipelineHandler(CameraManager *manager);
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -1407,7 +1407,7 @@  SimplePipelineHandler::SimplePipelineHandler(CameraManager *manager)
 }
 
 std::unique_ptr<CameraConfiguration>
-SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRole> roles)
+SimplePipelineHandler::generateConfiguration(Camera *camera, std::span<const StreamRole> roles)
 {
 	SimpleCameraData *data = cameraData(camera);
 	std::unique_ptr<CameraConfiguration> config =
diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index 3435a76046..4b09bd6e2f 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -84,7 +84,7 @@  public:
 	PipelineHandlerUVC(CameraManager *manager);
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -235,7 +235,7 @@  PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)
 
 std::unique_ptr<CameraConfiguration>
 PipelineHandlerUVC::generateConfiguration(Camera *camera,
-					  Span<const StreamRole> roles)
+					  std::span<const StreamRole> roles)
 {
 	UVCCameraData *data = cameraData(camera);
 	std::unique_ptr<CameraConfiguration> config =
@@ -830,7 +830,7 @@  void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
 			return;
 
 		info = ControlInfo{
-			Span<const ControlValue>{ values.data(), count },
+			std::span<const ControlValue>{ values.data(), count },
 			!lcDef ? values.front() : *lcDef,
 		};
 		break;
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index 01d8fb25a2..62bf1f03f8 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -87,7 +87,7 @@  public:
 	PipelineHandlerVimc(CameraManager *manager);
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -202,7 +202,7 @@  PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager)
 
 std::unique_ptr<CameraConfiguration>
 PipelineHandlerVimc::generateConfiguration(Camera *camera,
-					   Span<const StreamRole> roles)
+					   std::span<const StreamRole> roles)
 {
 	VimcCameraData *data = cameraData(camera);
 	std::unique_ptr<CameraConfiguration> config =
@@ -362,7 +362,7 @@  int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlLis
 	/* Map the mock IPA buffers to VIMC IPA to exercise IPC code paths. */
 	std::vector<IPABuffer> ipaBuffers;
 	for (auto [i, buffer] : utils::enumerate(data->mockIPABufs_)) {
-		Span<const FrameBuffer::Plane> planes = buffer->planes();
+		std::span<const FrameBuffer::Plane> planes = buffer->planes();
 
 		buffer->setCookie(i + 1);
 		ipaBuffers.emplace_back(buffer->cookie(),
diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp
index 9d59c26e22..e25dd85a73 100644
--- a/src/libcamera/pipeline/virtual/virtual.cpp
+++ b/src/libcamera/pipeline/virtual/virtual.cpp
@@ -78,7 +78,7 @@  public:
 	~PipelineHandlerVirtual();
 
 	std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
-								   Span<const StreamRole> roles) override;
+								   std::span<const StreamRole> roles) override;
 	int configure(Camera *camera, CameraConfiguration *config) override;
 
 	int exportFrameBuffers(Camera *camera, Stream *stream,
@@ -141,7 +141,7 @@  void VirtualCameraData::processRequest(Request *request)
 				fmd.sequence = streamConfig.seq++;
 				fmd.timestamp = currentTimestamp();
 
-				Span<const FrameBuffer::Plane> planes = buffer->planes();
+				std::span<const FrameBuffer::Plane> planes = buffer->planes();
 				for (const auto [i, p] : utils::enumerate(planes))
 					fmd.planes()[i].bytesused = p.length;
 
@@ -252,7 +252,7 @@  PipelineHandlerVirtual::~PipelineHandlerVirtual()
 
 std::unique_ptr<CameraConfiguration>
 PipelineHandlerVirtual::generateConfiguration(Camera *camera,
-					      Span<const StreamRole> roles)
+					      std::span<const StreamRole> roles)
 {
 	VirtualCameraData *data = cameraData(camera);
 	auto config = std::make_unique<VirtualCameraConfiguration>(data);
diff --git a/src/libcamera/process.cpp b/src/libcamera/process.cpp
index 3090d75681..eb5a363a53 100644
--- a/src/libcamera/process.cpp
+++ b/src/libcamera/process.cpp
@@ -139,8 +139,8 @@  Process::~Process()
  * or a negative error code otherwise
  */
 int Process::start(const std::string &path,
-		   Span<const std::string> args,
-		   Span<const int> fds)
+		   std::span<const std::string> args,
+		   std::span<const int> fds)
 {
 	if (pid_ > 0)
 		return -EBUSY;
diff --git a/src/libcamera/pub_key.cpp b/src/libcamera/pub_key.cpp
index f1d73a5c3e..ba15c56126 100644
--- a/src/libcamera/pub_key.cpp
+++ b/src/libcamera/pub_key.cpp
@@ -35,7 +35,7 @@  namespace libcamera {
  * \brief Construct a PubKey from key data
  * \param[in] key Key data encoded in DER format
  */
-PubKey::PubKey([[maybe_unused]] Span<const uint8_t> key)
+PubKey::PubKey([[maybe_unused]] std::span<const uint8_t> key)
 	: valid_(false)
 {
 #if HAVE_CRYPTO
@@ -87,8 +87,8 @@  PubKey::~PubKey()
  *
  * \return True if the signature is valid, false otherwise
  */
-bool PubKey::verify([[maybe_unused]] Span<const uint8_t> data,
-		    [[maybe_unused]] Span<const uint8_t> sig) const
+bool PubKey::verify([[maybe_unused]] std::span<const uint8_t> data,
+		    [[maybe_unused]] std::span<const uint8_t> sig) const
 {
 	if (!valid_)
 		return false;
diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp
index 4338abc523..0256a00a31 100644
--- a/src/libcamera/sensor/camera_sensor_legacy.cpp
+++ b/src/libcamera/sensor/camera_sensor_legacy.cpp
@@ -73,7 +73,7 @@  public:
 	std::vector<Size> sizes(unsigned int mbusCode) const override;
 	Size resolution() const override;
 
-	V4L2SubdeviceFormat getFormat(Span<const unsigned int> mbusCodes,
+	V4L2SubdeviceFormat getFormat(std::span<const unsigned int> mbusCodes,
 				      const Size &size,
 				      const Size maxSize) const override;
 	int setFormat(V4L2SubdeviceFormat *format,
@@ -91,7 +91,7 @@  public:
 	Orientation mountingOrientation() const override { return mountingOrientation_; }
 
 	const ControlInfoMap &controls() const override;
-	ControlList getControls(Span<const uint32_t> ids) override;
+	ControlList getControls(std::span<const uint32_t> ids) override;
 	int setControls(ControlList *ctrls) override;
 
 	const std::vector<controls::draft::TestPatternModeEnum> &
@@ -706,7 +706,7 @@  Size CameraSensorLegacy::resolution() const
 }
 
 V4L2SubdeviceFormat
-CameraSensorLegacy::getFormat(Span<const unsigned int> mbusCodes,
+CameraSensorLegacy::getFormat(std::span<const unsigned int> mbusCodes,
 			      const Size &size, Size maxSize) const
 {
 	unsigned int desiredArea = size.width * size.height;
@@ -998,7 +998,7 @@  const ControlInfoMap &CameraSensorLegacy::controls() const
 	return subdev_->controls();
 }
 
-ControlList CameraSensorLegacy::getControls(Span<const uint32_t> ids)
+ControlList CameraSensorLegacy::getControls(std::span<const uint32_t> ids)
 {
 	return subdev_->getControls(ids);
 }
diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp
index 849423dd20..e50111f1d5 100644
--- a/src/libcamera/sensor/camera_sensor_raw.cpp
+++ b/src/libcamera/sensor/camera_sensor_raw.cpp
@@ -74,7 +74,7 @@  public:
 	std::vector<Size> sizes(unsigned int mbusCode) const override;
 	Size resolution() const override;
 
-	V4L2SubdeviceFormat getFormat(Span<const unsigned int> mbusCodes,
+	V4L2SubdeviceFormat getFormat(std::span<const unsigned int> mbusCodes,
 				      const Size &size,
 				      const Size maxSize) const override;
 	int setFormat(V4L2SubdeviceFormat *format,
@@ -97,7 +97,7 @@  public:
 	Orientation mountingOrientation() const override { return mountingOrientation_; }
 
 	const ControlInfoMap &controls() const override;
-	ControlList getControls(Span<const uint32_t> ids) override;
+	ControlList getControls(std::span<const uint32_t> ids) override;
 	int setControls(ControlList *ctrls) override;
 
 	const std::vector<controls::draft::TestPatternModeEnum> &
@@ -767,7 +767,7 @@  Size CameraSensorRaw::resolution() const
 }
 
 V4L2SubdeviceFormat
-CameraSensorRaw::getFormat(Span<const unsigned int> mbusCodes,
+CameraSensorRaw::getFormat(std::span<const unsigned int> mbusCodes,
 			   const Size &size, Size maxSize) const
 {
 	unsigned int desiredArea = size.width * size.height;
@@ -1113,7 +1113,7 @@  const ControlInfoMap &CameraSensorRaw::controls() const
 	return subdev_->controls();
 }
 
-ControlList CameraSensorRaw::getControls(Span<const uint32_t> ids)
+ControlList CameraSensorRaw::getControls(std::span<const uint32_t> ids)
 {
 	return subdev_->getControls(ids);
 }
diff --git a/src/libcamera/shared_mem_object.cpp b/src/libcamera/shared_mem_object.cpp
index 6edab045d4..0c0cd7bf41 100644
--- a/src/libcamera/shared_mem_object.cpp
+++ b/src/libcamera/shared_mem_object.cpp
@@ -32,7 +32,7 @@  namespace libcamera {
  * backed by an anonymous file, using the memfd API.
  *
  * The allocated memory is exposed by the mem() function. If memory allocation
- * fails, the function returns an empty Span. This can be also checked using the
+ * fails, the function returns an empty span. This can be also checked using the
  * bool() operator.
  *
  * The file descriptor for the backing file is exposed as a SharedFD by the fd()
@@ -122,9 +122,9 @@  SharedMem &SharedMem::operator=(SharedMem &&rhs)
  */
 
 /**
- * \fn Span<uint8_t> SharedMem::mem() const
+ * \fn std::span<uint8_t> SharedMem::mem() const
  * \brief Retrieve the underlying shared memory
- * \return The memory buffer, or an empty Span if allocation failed
+ * \return The memory buffer, or an empty span if allocation failed
  */
 
 /**
diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp
index 97aa037935..2a20914b0c 100644
--- a/src/libcamera/software_isp/debayer_egl.cpp
+++ b/src/libcamera/software_isp/debayer_egl.cpp
@@ -12,12 +12,12 @@ 
 #include <algorithm>
 #include <assert.h>
 #include <memory>
+#include <span>
 #include <stdlib.h>
 #include <string>
 #include <tuple>
 #include <vector>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include <libcamera/formats.h>
@@ -132,9 +132,9 @@  int DebayerEGL::getShaderVariableLocations(void)
 
 int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputFormat)
 {
+	std::span<const unsigned char> fragmentShaderData;
+	std::span<const unsigned char> vertexShaderData;
 	std::vector<std::string> shaderEnv;
-	Span<const unsigned char> fragmentShaderData;
-	Span<const unsigned char> vertexShaderData;
 	GLenum err;
 
 	/* Target gles 100 glsl requires "#version x" as first directive in shader */
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 786c3855a5..258c82b8d2 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -178,7 +178,7 @@  void V4L2Device::close()
  * \return The control values in a ControlList on success, or an empty list on
  * error
  */
-ControlList V4L2Device::getControls(Span<const uint32_t> ids, const V4L2Request *request)
+ControlList V4L2Device::getControls(std::span<const uint32_t> ids, const V4L2Request *request)
 {
 	if (ids.empty())
 		return {};
@@ -210,7 +210,7 @@  ControlList V4L2Device::getControls(Span<const uint32_t> ids, const V4L2Request
 		if (info.flags & V4L2_CTRL_FLAG_HAS_PAYLOAD) {
 			ControlType type;
 			ControlValue &value = ctrl.second;
-			Span<uint8_t> data;
+			std::span<uint8_t> data;
 
 			switch (info.type) {
 			case V4L2_CTRL_TYPE_U8:
@@ -330,7 +330,7 @@  int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)
 		switch (iter->first->type()) {
 		case ControlTypeUnsigned16: {
 			if (value.isArray()) {
-				Span<uint8_t> data = value.data();
+				std::span<uint8_t> data = value.data();
 				v4l2Ctrl.p_u16 = reinterpret_cast<uint16_t *>(data.data());
 				v4l2Ctrl.size = data.size();
 			} else {
@@ -342,7 +342,7 @@  int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)
 
 		case ControlTypeUnsigned32: {
 			if (value.isArray()) {
-				Span<uint8_t> data = value.data();
+				std::span<uint8_t> data = value.data();
 				v4l2Ctrl.p_u32 = reinterpret_cast<uint32_t *>(data.data());
 				v4l2Ctrl.size = data.size();
 			} else {
@@ -354,7 +354,7 @@  int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)
 
 		case ControlTypeInteger32: {
 			if (value.isArray()) {
-				Span<uint8_t> data = value.data();
+				std::span<uint8_t> data = value.data();
 				v4l2Ctrl.p_u32 = reinterpret_cast<uint32_t *>(data.data());
 				v4l2Ctrl.size = data.size();
 			} else {
@@ -376,7 +376,7 @@  int V4L2Device::setControls(ControlList *ctrls, const V4L2Request *request)
 				return -EINVAL;
 			}
 
-			Span<uint8_t> data = value.data();
+			std::span<uint8_t> data = value.data();
 			v4l2Ctrl.p_u8 = data.data();
 			v4l2Ctrl.size = data.size();
 
@@ -805,7 +805,7 @@  void V4L2Device::updateControlInfo()
  * \param[in] v4l2Ctrls List of V4L2 extended controls as returned by the driver
  */
 void V4L2Device::updateControls(ControlList *ctrls,
-				Span<const v4l2_ext_control> v4l2Ctrls)
+				std::span<const v4l2_ext_control> v4l2Ctrls)
 {
 	for (const v4l2_ext_control &v4l2Ctrl : v4l2Ctrls) {
 		const unsigned int id = v4l2Ctrl.id;
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index ca87598309..41dc5d0f65 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -289,7 +289,7 @@  V4L2BufferCache::Entry::Entry(bool free, uint64_t lastUsed, const FrameBuffer &b
 
 bool V4L2BufferCache::Entry::operator==(const FrameBuffer &buffer) const
 {
-	Span<const FrameBuffer::Plane> planes = buffer.planes();
+	std::span<const FrameBuffer::Plane> planes = buffer.planes();
 
 	if (planes_.size() != planes.size())
 		return false;
@@ -1682,7 +1682,7 @@  int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer, const V4L2Request *request
 	}
 
 	bool multiPlanar = V4L2_TYPE_IS_MULTIPLANAR(buf.type);
-	Span<const FrameBuffer::Plane> planes = buffer->planes();
+	std::span<const FrameBuffer::Plane> planes = buffer->planes();
 	const unsigned int numV4l2Planes = format_.planesCount;
 
 	/*
@@ -1915,7 +1915,7 @@  FrameBuffer *V4L2VideoDevice::dequeueBuffer()
 	}
 	metadata.sequence -= firstFrame_.value();
 
-	Span<const FrameBuffer::Plane> framebufferPlanes = buffer->planes();
+	std::span<const FrameBuffer::Plane> framebufferPlanes = buffer->planes();
 	unsigned int numV4l2Planes = multiPlanar ? buf.length : 1;
 
 	if (numV4l2Planes != framebufferPlanes.size()) {
diff --git a/src/libcamera/value_node.cpp b/src/libcamera/value_node.cpp
index bb641ab643..3ea7c60060 100644
--- a/src/libcamera/value_node.cpp
+++ b/src/libcamera/value_node.cpp
@@ -10,11 +10,11 @@ 
 
 #include <charconv>
 #include <errno.h>
+#include <span>
 #include <string>
 #include <vector>
 
 #include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 /**
@@ -608,7 +608,7 @@  ValueNode *ValueNode::add(std::initializer_list<std::string_view> path,
 			node = node->add(std::string{ name },
 					 obj ? std::move(obj) : std::move(child));
 			if (!node) {
-				Span<const std::string_view> pathName{ std::data(path), i + 1 };
+				std::span<const std::string_view> pathName{ std::data(path), i + 1 };
 				LOG(ValueNode, Error)
 					<< "Failed to populate '"
 					<< utils::join(pathName, "/") << "'";
diff --git a/src/libcamera/vector.cpp b/src/libcamera/vector.cpp
index a135ab498e..66b310f64c 100644
--- a/src/libcamera/vector.cpp
+++ b/src/libcamera/vector.cpp
@@ -45,7 +45,7 @@  LOG_DEFINE_CATEGORY(Vector)
  */
 
 /**
- * \fn Vector::Vector(const Span<const T, Rows> data)
+ * \fn Vector::Vector(std::span<const T, Rows> data)
  * \brief Construct vector from supplied data
  * \param data Data from which to construct a vector
  *
diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
index 64b743767b..de1675c3ab 100644
--- a/src/libcamera/yaml_parser.cpp
+++ b/src/libcamera/yaml_parser.cpp
@@ -114,7 +114,7 @@  int YamlParserContext::yamlRead(void *data, unsigned char *buffer, size_t size,
 {
 	File *file = static_cast<File *>(data);
 
-	Span<unsigned char> buf{ buffer, size };
+	std::span<unsigned char> buf{ buffer, size };
 	ssize_t ret = file->read(buf);
 	if (ret < 0)
 		return 0;
diff --git a/src/py/libcamera/py_helpers.cpp b/src/py/libcamera/py_helpers.cpp
index b9142225c0..45d7848b3d 100644
--- a/src/py/libcamera/py_helpers.cpp
+++ b/src/py/libcamera/py_helpers.cpp
@@ -66,7 +66,7 @@  static ControlValue controlValueMaybeArray(const py::object &ob)
 {
 	if (py::isinstance<py::list>(ob) || py::isinstance<py::tuple>(ob)) {
 		std::vector<T> vec = ob.cast<std::vector<T>>();
-		return ControlValue(Span<const T>(vec));
+		return ControlValue(std::span<const T>(vec));
 	}
 
 	return ControlValue(ob.cast<T>());
diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
index 3b101f9961..c7f113bcf7 100644
--- a/src/py/libcamera/py_main.cpp
+++ b/src/py/libcamera/py_main.cpp
@@ -380,7 +380,7 @@  PYBIND11_MODULE(_libcamera, m)
 		     py::arg("planes"), py::arg("cookie") = 0)
 		.def_property_readonly("metadata", &FrameBuffer::metadata, py::return_value_policy::reference_internal)
 		.def_property_readonly("planes", [](const FrameBuffer &self) {
-			/* Convert from Span<> to std::vector<> */
+			/* Convert from std::span<> to std::vector<> */
 			/* Note: this creates copies */
 			auto planes = self.planes();
 			std::vector<FrameBuffer::Plane> v(planes.begin(), planes.end());
@@ -506,7 +506,7 @@  PYBIND11_MODULE(_libcamera, m)
 		.def_readonly("sequence", &FrameMetadata::sequence)
 		.def_readonly("timestamp", &FrameMetadata::timestamp)
 		.def_property_readonly("planes", [](const FrameMetadata &self) {
-			/* Convert from Span<> to std::vector<> */
+			/* Convert from std::span<> to std::vector<> */
 			/* Note: this creates a copy */
 			auto planes = self.planes();
 			std::vector<FrameMetadata::Plane> v(planes.begin(), planes.end());
diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
index 03cd4810cc..863dded741 100644
--- a/src/v4l2/v4l2_camera_proxy.cpp
+++ b/src/v4l2/v4l2_camera_proxy.cpp
@@ -200,7 +200,7 @@  void V4L2CameraProxy::setFmtFromConfig(const StreamConfiguration &streamConfig)
 	const auto &it = controls.find(&controls::FrameDurationLimits);
 
 	if (it != controls.end()) {
-		Span<const int64_t, 2> duration = it->second.def().get<Span<const int64_t, 2>>();
+		std::span<const int64_t, 2> duration = it->second.def().get<std::span<const int64_t, 2>>();
 
 		v4l2TimePerFrame_.numerator = duration[0];
 		v4l2TimePerFrame_.denominator = 1000000;
diff --git a/src/v4l2/v4l2_compat_manager.cpp b/src/v4l2/v4l2_compat_manager.cpp
index 1a0ba5fef3..b07f865fb2 100644
--- a/src/v4l2/v4l2_compat_manager.cpp
+++ b/src/v4l2/v4l2_compat_manager.cpp
@@ -115,7 +115,7 @@  int V4L2CompatManager::getCameraIndex(int fd)
 	 */
 	auto cameras = cm_->cameras();
 	for (auto [index, camera] : utils::enumerate(cameras)) {
-		Span<const int64_t> devices = camera->properties()
+		std::span<const int64_t> devices = camera->properties()
 						      .get(properties::SystemDevices)
 						      .value_or(utils::defopt);
 
diff --git a/test/controls/control_value.cpp b/test/controls/control_value.cpp
index 032050a778..c2f9fc4826 100644
--- a/test/controls/control_value.cpp
+++ b/test/controls/control_value.cpp
@@ -50,14 +50,14 @@  protected:
 		}
 
 		std::array<bool, 2> bools{ true, false };
-		value.set(Span<bool>(bools));
+		value.set(std::span<bool>(bools));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeBool) {
 			cerr << "Control type mismatch after setting to bool array" << endl;
 			return TestFail;
 		}
 
-		Span<const bool> boolsResult = value.get<Span<const bool>>();
+		std::span<const bool> boolsResult = value.get<std::span<const bool>>();
 		if (bools.size() != boolsResult.size() ||
 		    !std::equal(bools.begin(), bools.end(), boolsResult.begin())) {
 			cerr << "Control value mismatch after setting to bool" << endl;
@@ -90,14 +90,14 @@  protected:
 		}
 
 		std::array<uint8_t, 4> bytes{ 3, 14, 15, 9 };
-		value.set(Span<uint8_t>(bytes));
+		value.set(std::span<uint8_t>(bytes));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeByte) {
 			cerr << "Control type mismatch after setting to uint8_t array" << endl;
 			return TestFail;
 		}
 
-		Span<const uint8_t> int8sResult = value.get<Span<const uint8_t>>();
+		std::span<const uint8_t> int8sResult = value.get<std::span<const uint8_t>>();
 		if (bytes.size() != int8sResult.size() ||
 		    !std::equal(bytes.begin(), bytes.end(), int8sResult.begin())) {
 			cerr << "Control value mismatch after setting to uint8_t array" << endl;
@@ -130,14 +130,14 @@  protected:
 		}
 
 		std::array<uint16_t, 4> uint16s{ 3, 14, 15, 9 };
-		value.set(Span<uint16_t>(uint16s));
+		value.set(std::span<uint16_t>(uint16s));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeUnsigned16) {
 			cerr << "Control type mismatch after setting to uint16_t array" << endl;
 			return TestFail;
 		}
 
-		Span<const uint16_t> uint16sResult = value.get<Span<const uint16_t>>();
+		std::span<const uint16_t> uint16sResult = value.get<std::span<const uint16_t>>();
 		if (uint16s.size() != uint16sResult.size() ||
 		    !std::equal(uint16s.begin(), uint16s.end(), uint16sResult.begin())) {
 			cerr << "Control value mismatch after setting to uint16_t array" << endl;
@@ -170,14 +170,14 @@  protected:
 		}
 
 		std::array<uint32_t, 4> uint32s{ 3, 14, 15, 9 };
-		value.set(Span<uint32_t>(uint32s));
+		value.set(std::span<uint32_t>(uint32s));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeUnsigned32) {
 			cerr << "Control type mismatch after setting to uint32_t array" << endl;
 			return TestFail;
 		}
 
-		Span<const uint32_t> uint32sResult = value.get<Span<const uint32_t>>();
+		std::span<const uint32_t> uint32sResult = value.get<std::span<const uint32_t>>();
 		if (uint32s.size() != uint32sResult.size() ||
 		    !std::equal(uint32s.begin(), uint32s.end(), uint32sResult.begin())) {
 			cerr << "Control value mismatch after setting to uint32_t array" << endl;
@@ -210,14 +210,14 @@  protected:
 		}
 
 		std::array<int32_t, 4> int32s{ 3, 14, 15, 9 };
-		value.set(Span<int32_t>(int32s));
+		value.set(std::span<int32_t>(int32s));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeInteger32) {
 			cerr << "Control type mismatch after setting to int32_t array" << endl;
 			return TestFail;
 		}
 
-		Span<const int32_t> int32sResult = value.get<Span<const int32_t>>();
+		std::span<const int32_t> int32sResult = value.get<std::span<const int32_t>>();
 		if (int32s.size() != int32sResult.size() ||
 		    !std::equal(int32s.begin(), int32s.end(), int32sResult.begin())) {
 			cerr << "Control value mismatch after setting to int32_t array" << endl;
@@ -250,14 +250,14 @@  protected:
 		}
 
 		std::array<int64_t, 4> int64s{ 3, 14, 15, 9 };
-		value.set(Span<int64_t>(int64s));
+		value.set(std::span<int64_t>(int64s));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeInteger64) {
 			cerr << "Control type mismatch after setting to int64_t array" << endl;
 			return TestFail;
 		}
 
-		Span<const int64_t> int64sResult = value.get<Span<const int64_t>>();
+		std::span<const int64_t> int64sResult = value.get<std::span<const int64_t>>();
 		if (int64s.size() != int64sResult.size() ||
 		    !std::equal(int64s.begin(), int64s.end(), int64sResult.begin())) {
 			cerr << "Control value mismatch after setting to int64_t array" << endl;
@@ -290,14 +290,14 @@  protected:
 		}
 
 		std::array<float, 3> floats{ 3.141593, 2.718282, 299792458.0 };
-		value.set(Span<float>(floats));
+		value.set(std::span<float>(floats));
 		if (value.isNone() || !value.isArray() ||
 		    value.type() != ControlTypeFloat) {
 			cerr << "Control type mismatch after setting to float array" << endl;
 			return TestFail;
 		}
 
-		Span<const float> floatsResult = value.get<Span<const float>>();
+		std::span<const float> floatsResult = value.get<std::span<const float>>();
 		if (floats.size() != floatsResult.size() ||
 		    !std::equal(floats.begin(), floats.end(), floatsResult.begin())) {
 			cerr << "Control value mismatch after setting to float array" << endl;
diff --git a/test/file.cpp b/test/file.cpp
index 170e6ccdd0..9bf67cc4a9 100644
--- a/test/file.cpp
+++ b/test/file.cpp
@@ -280,7 +280,7 @@  protected:
 		file.setFileName(self());
 		file.open(File::OpenModeFlag::ReadOnly);
 
-		Span<uint8_t> data = file.map();
+		std::span<uint8_t> data = file.map();
 		if (data.empty()) {
 			cerr << "Mapping of complete file failed" << endl;
 			return TestFail;
diff --git a/test/utils.cpp b/test/utils.cpp
index eba3ed9fbf..0c73045fcd 100644
--- a/test/utils.cpp
+++ b/test/utils.cpp
@@ -8,11 +8,11 @@ 
 #include <iostream>
 #include <map>
 #include <optional>
+#include <span>
 #include <sstream>
 #include <string>
 #include <vector>
 
-#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include <libcamera/geometry.h>
@@ -99,7 +99,7 @@  protected:
 			return TestFail;
 		}
 
-		Span<const unsigned int> span{ integers };
+		std::span<const unsigned int> span{ integers };
 		i = 0;
 
 		for (auto [index, value] : utils::enumerate(span)) {
diff --git a/test/v4l2_videodevice/controls.cpp b/test/v4l2_videodevice/controls.cpp
index 7990f37dca..7919a95c89 100644
--- a/test/v4l2_videodevice/controls.cpp
+++ b/test/v4l2_videodevice/controls.cpp
@@ -95,7 +95,7 @@  protected:
 		uint8_t u8Min = u8.min().get<uint8_t>();
 		uint8_t u8Max = u8.max().get<uint8_t>();
 
-		Span<const uint8_t> u8Span = ctrls.get(VIVID_CID_U8_4D_ARRAY).get<Span<const uint8_t>>();
+		std::span<const uint8_t> u8Span = ctrls.get(VIVID_CID_U8_4D_ARRAY).get<std::span<const uint8_t>>();
 		bool valid = std::all_of(u8Span.begin(), u8Span.end(),
 					 [&](uint8_t v) { return v >= u8Min && v <= u8Max; });
 		if (!valid) {
@@ -112,7 +112,7 @@  protected:
 
 		std::array<uint8_t, VIVID_CID_U8_ARRAY_SIZE> u8Values;
 		std::fill(u8Values.begin(), u8Values.end(), u8.min().get<uint8_t>());
-		ctrls.set(VIVID_CID_U8_4D_ARRAY, Span<const uint8_t>(u8Values));
+		ctrls.set(VIVID_CID_U8_4D_ARRAY, std::span<const uint8_t>(u8Values));
 
 		int ret = capture_->setControls(&ctrls);
 		if (ret) {
diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
index 9399727bdb..083e22f088 100644
--- a/utils/codegen/controls.py
+++ b/utils/codegen/controls.py
@@ -117,9 +117,9 @@  class Control(object):
             return typ
 
         if self.__size:
-            return f"Span<const {typ}, {self.__size}>"
+            return f"std::span<const {typ}, {self.__size}>"
         else:
-            return f"Span<const {typ}>"
+            return f"std::span<const {typ}>"
 
     @property
     def direction(self):
diff --git a/utils/gen-debug-controls.py b/utils/gen-debug-controls.py
index a1c69bbd82..faf236ba81 100755
--- a/utils/gen-debug-controls.py
+++ b/utils/gen-debug-controls.py
@@ -56,7 +56,7 @@  def find_debug_controls(dir):
     files = [p for p in dir.rglob('*') if p.suffix in extensions]
 
     # The following regex was tested on
-    # set<Span<type>>( controls::debug::something , static_cast<type>(var) )
+    # set<std::span<type>>( controls::debug::something , static_cast<type>(var) )
     # set<>( controls::debug::something , static_cast<type>(var) )
     # set( controls::debug::something , static_cast<type> (var) )
     exp = re.compile(r'set'  # set function
@@ -71,10 +71,10 @@  def find_debug_controls(dir):
                 if match:
                     m = FoundMatch(file=p, line=idx, type=match.group(1),
                                    name=match.group(2), whole_match=match.group(0))
-                    if m.type is not None and m.type.startswith('Span'):
+                    if m.type is not None and m.type.startswith('std::span'):
                         # Simple span type detection treating the last word
                         # inside <> as type.
-                        r = re.match(r'Span<(?:.*\s+)(.*)>', m.type)
+                        r = re.match(r'std::span<(?:.*\s+)(.*)>', m.type)
                         m.type = r.group(1)
                         m.size = '[n]'
                     matches.append(m)