Replace ArrayView with std::span in api/

ArrayView is an alias to std::span. This change switch to use
std::span directly instead of through the alias.

Search&Replace MakeArrayView and ArrayView with std::span
Search&Replace include "api/array_view.h" with include <span>
Remove <span> include where std::span is not mentioned in the file
Remove build dependencies on array_view target

Updated comment in audio_frame.cc to be more accurate matching one of
the behavior changes between ArrayView and std::span

Bug: webrtc:439801349
Change-Id: Iec42e1bf3ff5539211e8a4c85773ba08cf1412dd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/461060
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Auto-Submit: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47315}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 3555ec0..df24e79 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -523,7 +523,6 @@
     "rtp_transceiver_interface.h",
   ]
   deps = [
-    ":array_view",
     ":ref_count",
     ":rtc_error",
     ":rtp_parameters",
@@ -594,7 +593,6 @@
     "video_track_source_proxy_factory.h",  # Used downstream
   ]
   deps = [
-    ":array_view",
     ":async_dns_resolver",
     ":audio_options_api",
     ":candidate",
@@ -684,7 +682,6 @@
     "frame_transformer_interface.h",
   ]
   deps = [
-    ":array_view",
     ":ref_count",
     ":scoped_refptr",
     "../rtc_base:checks",
@@ -784,7 +781,6 @@
   sources = [ "test/video_quality_analyzer_interface.h" ]
 
   deps = [
-    ":array_view",
     ":rtc_stats_api",
     ":scoped_refptr",
     ":stats_observer_interface",
@@ -838,7 +834,6 @@
     "rtp_parameters.h",
   ]
   deps = [
-    ":array_view",
     ":priority",
     ":rtc_error",
     ":rtp_transceiver_direction",
@@ -1040,10 +1035,7 @@
 rtc_source_set("data_channel_event_observer_interface") {
   visibility = [ "*" ]
   sources = [ "data_channel_event_observer_interface.h" ]
-  deps = [
-    ":array_view",
-    "//third_party/abseil-cpp/absl/strings:string_view",
-  ]
+  deps = [ "//third_party/abseil-cpp/absl/strings:string_view" ]
 }
 
 rtc_source_set("libjingle_logging_api") {
@@ -1098,7 +1090,6 @@
   ]
 
   deps = [
-    ":array_view",
     "../rtc_base:stringutils",
     "../rtc_base/system:rtc_export",
   ]
@@ -1110,7 +1101,7 @@
     "call/transport.cc",
     "call/transport.h",
   ]
-  deps = [ ":array_view" ]
+  deps = []
 }
 
 rtc_source_set("bitrate_allocation") {
@@ -1143,7 +1134,6 @@
     "test/network_emulation_manager.h",
   ]
   deps = [
-    ":array_view",
     ":field_trials_view",
     ":peer_network_dependencies",
     ":simulated_network_api",
@@ -1262,7 +1252,6 @@
   visibility = [ "*" ]
   sources = [ "datagram_connection.h" ]
   deps = [
-    ":array_view",
     ":candidate",
     ":ref_count",
     "../p2p:transport_description",
@@ -1459,7 +1448,6 @@
     testonly = true
     sources = [ "test/mock_frame_encryptor.h" ]
     deps = [
-      ":array_view",
       ":rtp_parameters",
       "../test:test_support",
       "crypto:frame_encryptor_interface",
@@ -1471,7 +1459,6 @@
     testonly = true
     sources = [ "test/mock_frame_decryptor.h" ]
     deps = [
-      ":array_view",
       ":rtp_parameters",
       "../test:test_support",
       "crypto:frame_decryptor_interface",
@@ -1509,7 +1496,6 @@
       "test/fake_frame_encryptor.h",
     ]
     deps = [
-      ":array_view",
       ":rtp_parameters",
       "../rtc_base:checks",
       "../rtc_base:refcount",
@@ -1525,7 +1511,6 @@
       "test/fake_frame_decryptor.h",
     ]
     deps = [
-      ":array_view",
       ":rtp_parameters",
       "../rtc_base:checks",
       "crypto:frame_decryptor_interface",
@@ -1616,7 +1601,6 @@
     testonly = true
     sources = [ "test/mock_transformable_frame.h" ]
     deps = [
-      ":array_view",
       ":frame_transformer_interface",
       "../test:test_support",
       "units:time_delta",
@@ -1662,7 +1646,6 @@
     ]
 
     deps = [
-      ":array_view",
       ":dtls_transport_interface",
       ":dtmf_sender_interface",
       ":frame_transformer_interface",
@@ -1690,7 +1673,6 @@
     sources = [ "test/mock_transformable_audio_frame.h" ]
 
     deps = [
-      ":array_view",
       ":frame_transformer_interface",
       "../test:test_support",
       "units:time_delta",
@@ -1704,7 +1686,6 @@
     sources = [ "test/mock_transformable_video_frame.h" ]
 
     deps = [
-      ":array_view",
       ":frame_transformer_interface",
       "../test:test_support",
       "units:time_delta",
@@ -1801,7 +1782,6 @@
     testonly = true
     sources = [ "test/mock_datagram_connection.h" ]
     deps = [
-      ":array_view",
       ":candidate",
       ":datagram_connection",
       "../p2p:transport_description",
@@ -1816,7 +1796,6 @@
     testonly = true
     sources = [ "test/mock_datagram_connection_observer.h" ]
     deps = [
-      ":array_view",
       ":candidate",
       ":datagram_connection",
       "//test:test_support",
diff --git a/api/audio/BUILD.gn b/api/audio/BUILD.gn
index db356e6..578930e 100644
--- a/api/audio/BUILD.gn
+++ b/api/audio/BUILD.gn
@@ -48,7 +48,6 @@
   ]
 
   deps = [
-    "..:array_view",
     "..:rtp_packet_info",
     "../../rtc_base:checks",
     "../../rtc_base:logging",
@@ -84,7 +83,6 @@
     ":aec3_config",
     ":audio_processing_statistics",
     ":echo_control",
-    "..:array_view",
     "..:ref_count",
     "..:scoped_refptr",
     "../../rtc_base:checks",
@@ -176,10 +174,7 @@
 rtc_source_set("neural_residual_echo_estimator_api") {
   visibility = [ "*" ]
   sources = [ "neural_residual_echo_estimator.h" ]
-  deps = [
-    ":aec3_config",
-    "..:array_view",
-  ]
+  deps = [ ":aec3_config" ]
 }
 
 if (rtc_enable_protobuf) {
diff --git a/api/audio/audio_frame.cc b/api/audio/audio_frame.cc
index b894673..14afade 100644
--- a/api/audio/audio_frame.cc
+++ b/api/audio/audio_frame.cc
@@ -13,9 +13,9 @@
 #include <cstdint>
 #include <cstring>
 #include <optional>
+#include <span>
 
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "api/audio/channel_layout.h"
 #include "api/rtp_packet_infos.h"
@@ -133,12 +133,10 @@
 InterleavedView<const int16_t> AudioFrame::data_view() const {
   // If you get a nullptr from `data_view()`, it's likely because the
   // samples_per_channel_ and/or num_channels_ members haven't been properly
-  // set. Since `data_view()` returns an InterleavedView<> (which internally
-  // uses ArrayView<>), we inherit the behavior in InterleavedView when
-  // the view size is 0 that ArrayView<>::data() returns nullptr. So, even when
-  // an AudioFrame is muted and we want to return `zeroed_data()`, if
-  // samples_per_channel_ or  num_channels_ is 0, the view will point to
-  // nullptr.
+  // set. `data_view()` returns an InterleavedView<> which internally
+  // uses std::span<>. So, even when an AudioFrame is muted and we want to
+  // return `zeroed_data()`, if samples_per_channel_ or  num_channels_ is 0,
+  // the view might point to nullptr.
   return InterleavedView<const int16_t>(muted_ ? &zeroed_data()[0] : &data_[0],
                                         samples_per_channel_, num_channels_);
 }
@@ -213,9 +211,9 @@
 }
 
 // static
-ArrayView<const int16_t> AudioFrame::zeroed_data() {
+std::span<const int16_t> AudioFrame::zeroed_data() {
   static int16_t* null_data = new int16_t[kMaxDataSizeSamples]();
-  return ArrayView<const int16_t>(null_data, kMaxDataSizeSamples);
+  return std::span<const int16_t>(null_data, kMaxDataSizeSamples);
 }
 
 }  // namespace webrtc
diff --git a/api/audio/audio_frame.h b/api/audio/audio_frame.h
index c4c9303..095db19 100644
--- a/api/audio/audio_frame.h
+++ b/api/audio/audio_frame.h
@@ -16,8 +16,8 @@
 
 #include <array>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "api/audio/channel_layout.h"
 #include "api/rtp_packet_infos.h"
@@ -199,7 +199,7 @@
   // A permanently zeroed out buffer to represent muted frames. This is a
   // header-only class, so the only way to avoid creating a separate zeroed
   // buffer per translation unit is to wrap a static in an inline function.
-  static ArrayView<const int16_t> zeroed_data();
+  static std::span<const int16_t> zeroed_data();
 
   std::array<int16_t, kMaxDataSizeSamples> data_;
   bool muted_ = true;
diff --git a/api/audio/audio_processing.h b/api/audio/audio_processing.h
index 1e0ea0b..a4f3f52 100644
--- a/api/audio/audio_processing.h
+++ b/api/audio/audio_processing.h
@@ -18,11 +18,11 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/base/nullability.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio/audio_processing_statistics.h"
 #include "api/audio/echo_control.h"
 #include "api/environment/environment.h"
@@ -582,7 +582,7 @@
   // representation of the input is returned. Returns true/false to indicate
   // whether an output returned.
   virtual bool GetLinearAecOutput(
-      ArrayView<std::array<float, 160>> linear_output) const = 0;
+      std::span<std::array<float, 160>> linear_output) const = 0;
 
   // This must be called prior to ProcessStream() if and only if adaptive analog
   // gain control is enabled, to pass the current analog level from the audio
@@ -864,10 +864,10 @@
                           int num_render_channels) = 0;
 
   // Analysis (not changing) of the first channel of the render signal.
-  virtual void AnalyzeRenderAudio(ArrayView<const float> render_audio) = 0;
+  virtual void AnalyzeRenderAudio(std::span<const float> render_audio) = 0;
 
   // Analysis (not changing) of the capture signal.
-  virtual void AnalyzeCaptureAudio(ArrayView<const float> capture_audio) = 0;
+  virtual void AnalyzeCaptureAudio(std::span<const float> capture_audio) = 0;
 
   struct Metrics {
     std::optional<double> echo_likelihood;
diff --git a/api/audio/audio_view.h b/api/audio/audio_view.h
index f3fcf8d..9f7291b 100644
--- a/api/audio/audio_view.h
+++ b/api/audio/audio_view.h
@@ -13,11 +13,11 @@
 
 #include <cstddef>
 #include <iterator>
+#include <span>
 #include <variant>
 #include <vector>
 
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
@@ -34,7 +34,7 @@
 //   buffer. Channels can be enumerated and accessing the individual channel
 //   data is done via MonoView<>.
 //
-// The views are comparable to and built on ArrayView<> but add
+// The views are comparable to and built on std::span<> but add
 // audio specific properties for the dimensions of the buffer and the above
 // specialized [de]interleaved support.
 //
@@ -45,7 +45,7 @@
 // can be either an single channel (mono) interleaved buffer (e.g. AudioFrame),
 // or a de-interleaved channel (e.g. from AudioBuffer).
 template <typename T>
-using MonoView = ArrayView<T>;
+using MonoView = std::span<T>;
 
 // The maximum number of audio channels supported by WebRTC encoders, decoders
 // and the AudioFrame class.
@@ -59,8 +59,8 @@
 class InterleavedView {
  public:
   using value_type = T;
-  using iterator = typename ArrayView<T>::iterator;
-  using const_iterator = typename ArrayView<const T>::iterator;
+  using iterator = typename std::span<T>::iterator;
+  using const_iterator = typename std::span<const T>::iterator;
 
   InterleavedView() = default;
 
@@ -90,7 +90,7 @@
 
   size_t num_channels() const { return num_channels_; }
   size_t samples_per_channel() const { return samples_per_channel_; }
-  ArrayView<T> data() const { return data_; }
+  std::span<T> data() const { return data_; }
   bool empty() const { return data_.empty(); }
   size_t size() const { return data_.size(); }
 
@@ -131,7 +131,7 @@
   // construction.
   size_t num_channels_ = 0u;
   size_t samples_per_channel_ = 0u;
-  ArrayView<T> data_;
+  std::span<T> data_;
 };
 
 template <typename T>
diff --git a/api/audio/neural_residual_echo_estimator.h b/api/audio/neural_residual_echo_estimator.h
index 87e8149..974bc67 100644
--- a/api/audio/neural_residual_echo_estimator.h
+++ b/api/audio/neural_residual_echo_estimator.h
@@ -12,8 +12,8 @@
 #define API_AUDIO_NEURAL_RESIDUAL_ECHO_ESTIMATOR_H_
 
 #include <array>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio/echo_canceller3_config.h"
 
 namespace webrtc {
@@ -45,14 +45,14 @@
   // Other inputs:
   //   * dominant_nearend: True if dominant nearend is active
   virtual void Estimate(const Block& render,
-                        ArrayView<const std::array<float, 64>> y,
-                        ArrayView<const std::array<float, 64>> e,
-                        ArrayView<const std::array<float, 65>> S2,
-                        ArrayView<const std::array<float, 65>> Y2,
-                        ArrayView<const std::array<float, 65>> E2,
+                        std::span<const std::array<float, 64>> y,
+                        std::span<const std::array<float, 64>> e,
+                        std::span<const std::array<float, 65>> S2,
+                        std::span<const std::array<float, 65>> Y2,
+                        std::span<const std::array<float, 65>> E2,
                         bool dominant_nearend,
-                        ArrayView<std::array<float, 65>> R2,
-                        ArrayView<std::array<float, 65>> R2_unbounded) = 0;
+                        std::span<std::array<float, 65>> R2,
+                        std::span<std::array<float, 65>> R2_unbounded) = 0;
 
   // Returns a recommended AEC3 configuration for this estimator.
   virtual EchoCanceller3Config GetConfiguration(bool multi_channel) const = 0;
diff --git a/api/audio/test/BUILD.gn b/api/audio/test/BUILD.gn
index b1060fa..edd3dcd 100644
--- a/api/audio/test/BUILD.gn
+++ b/api/audio/test/BUILD.gn
@@ -23,7 +23,6 @@
     deps = [
       "..:aec3_config",
       "..:audio_frame_api",
-      "../..:array_view",
       "../../../modules/audio_processing:aec3_config_json",
       "../../../rtc_base:checks",
       "../../../test:test_support",
diff --git a/api/audio/test/audio_frame_unittest.cc b/api/audio/test/audio_frame_unittest.cc
index a7c0166..e9a1e6f 100644
--- a/api/audio/test/audio_frame_unittest.cc
+++ b/api/audio/test/audio_frame_unittest.cc
@@ -66,7 +66,7 @@
   EXPECT_TRUE(AllSamplesAre(0, frame));
 }
 
-// TODO: b/335805780 - Delete test when `mutable_data()` returns ArrayView.
+// TODO: b/335805780 - Delete test when `mutable_data()` returns std::span.
 TEST(AudioFrameTest, UnmutedFrameIsInitiallyZeroedLegacy) {
   AudioFrame frame(kSampleRateHz, kNumChannelsMono, CHANNEL_LAYOUT_NONE);
   frame.mutable_data();
diff --git a/api/audio/test/audio_view_unittest.cc b/api/audio/test/audio_view_unittest.cc
index 4ac914f..833f936 100644
--- a/api/audio/test/audio_view_unittest.cc
+++ b/api/audio/test/audio_view_unittest.cc
@@ -13,9 +13,9 @@
 #include <array>
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -37,7 +37,7 @@
 
 // Fills a given buffer with monotonically increasing values.
 template <typename T>
-void FillBuffer(ArrayView<T> buffer) {
+void FillBuffer(std::span<T> buffer) {
   T value = {};
   for (T& t : buffer) {
     Increment<T>(value);
@@ -50,7 +50,7 @@
 TEST(AudioViewTest, MonoView) {
   const size_t kArraySize = 100u;
   int16_t arr[kArraySize];
-  FillBuffer(ArrayView<int16_t>(arr));
+  FillBuffer(std::span<int16_t>(arr));
 
   MonoView<int16_t> mono(arr);
   MonoView<const int16_t> const_mono(arr);
@@ -69,7 +69,7 @@
 TEST(AudioViewTest, InterleavedView) {
   const size_t kArraySize = 100u;
   int16_t arr[kArraySize];
-  FillBuffer(ArrayView<int16_t>(arr));
+  FillBuffer(std::span<int16_t>(arr));
 
   InterleavedView<int16_t> interleaved(arr, kArraySize, 1);
   EXPECT_EQ(NumChannels(interleaved), 1u);
@@ -144,7 +144,7 @@
   const size_t kArraySize = 100u;
   int16_t source_arr[kArraySize] = {};
   int16_t dest_arr[kArraySize] = {};
-  FillBuffer(ArrayView<int16_t>(source_arr));
+  FillBuffer(std::span<int16_t>(source_arr));
 
   InterleavedView<const int16_t> source(source_arr, 2);
   InterleavedView<int16_t> destination(dest_arr, 2);
diff --git a/api/audio_codecs/BUILD.gn b/api/audio_codecs/BUILD.gn
index 25ea125..0d5b919 100644
--- a/api/audio_codecs/BUILD.gn
+++ b/api/audio_codecs/BUILD.gn
@@ -29,7 +29,6 @@
     "audio_format.h",
   ]
   deps = [
-    "..:array_view",
     "..:bitrate_allocation",
     "..:make_ref_counted",
     "..:ref_count",
diff --git a/api/audio_codecs/audio_decoder.cc b/api/audio_codecs/audio_decoder.cc
index ecc1dec..dd2920e 100644
--- a/api/audio_codecs/audio_decoder.cc
+++ b/api/audio_codecs/audio_decoder.cc
@@ -14,10 +14,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/sanitizer.h"
@@ -41,7 +41,7 @@
   }
 
   std::optional<DecodeResult> Decode(
-      ArrayView<int16_t> decoded) const override {
+      std::span<int16_t> decoded) const override {
     auto speech_type = AudioDecoder::kSpeech;
     const int ret = decoder_->Decode(
         payload_.data(), payload_.size(), decoder_->SampleRateHz(),
@@ -94,7 +94,7 @@
                          int16_t* decoded,
                          SpeechType* speech_type) {
   TRACE_EVENT0("webrtc", "AudioDecoder::Decode");
-  MsanCheckInitialized(MakeArrayView(encoded, encoded_len));
+  MsanCheckInitialized(std::span(encoded, encoded_len));
   int duration = PacketDuration(encoded, encoded_len);
   if (duration >= 0 &&
       duration * Channels() * sizeof(int16_t) > max_decoded_bytes) {
@@ -111,7 +111,7 @@
                                   int16_t* decoded,
                                   SpeechType* speech_type) {
   TRACE_EVENT0("webrtc", "AudioDecoder::DecodeRedundant");
-  MsanCheckInitialized(MakeArrayView(encoded, encoded_len));
+  MsanCheckInitialized(std::span(encoded, encoded_len));
   int duration = PacketDurationRedundant(encoded, encoded_len);
   if (duration >= 0 &&
       duration * Channels() * sizeof(int16_t) > max_decoded_bytes) {
diff --git a/api/audio_codecs/audio_decoder.h b/api/audio_codecs/audio_decoder.h
index a085d3b..e15ffc9 100644
--- a/api/audio_codecs/audio_decoder.h
+++ b/api/audio_codecs/audio_decoder.h
@@ -16,9 +16,9 @@
 
 #include <memory>
 #include <optional>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "rtc_base/buffer.h"
 
@@ -63,7 +63,7 @@
     // decoder produced comfort noise or speech. On failure, returns an empty
     // std::optional. Decode may be called at most once per frame object.
     virtual std::optional<DecodeResult> Decode(
-        ArrayView<int16_t> decoded) const = 0;
+        std::span<int16_t> decoded) const = 0;
   };
 
   struct ParseResult {
diff --git a/api/audio_codecs/audio_encoder.cc b/api/audio_codecs/audio_encoder.cc
index cb86adc..3fef371 100644
--- a/api/audio_codecs/audio_encoder.cc
+++ b/api/audio_codecs/audio_encoder.cc
@@ -14,9 +14,9 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/call/bitrate_allocation.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -45,7 +45,7 @@
 }
 
 AudioEncoder::EncodedInfo AudioEncoder::Encode(uint32_t rtp_timestamp,
-                                               ArrayView<const int16_t> audio,
+                                               std::span<const int16_t> audio,
                                                Buffer* encoded) {
   TRACE_EVENT0("webrtc", "AudioEncoder::Encode");
   RTC_CHECK_EQ(audio.size(),
@@ -77,7 +77,7 @@
 
 void AudioEncoder::SetTargetBitrate(int /* target_bps */) {}
 
-ArrayView<std::unique_ptr<AudioEncoder>>
+std::span<std::unique_ptr<AudioEncoder>>
 AudioEncoder::ReclaimContainedEncoders() {
   return {};
 }
diff --git a/api/audio_codecs/audio_encoder.h b/api/audio_codecs/audio_encoder.h
index 8c4fe33..d82a074 100644
--- a/api/audio_codecs/audio_encoder.h
+++ b/api/audio_codecs/audio_encoder.h
@@ -16,12 +16,12 @@
 
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/base/attributes.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "api/call/bitrate_allocation.h"
 #include "api/units/data_rate.h"
@@ -150,7 +150,7 @@
   // EncodeImpl() which does the actual work, and then checks some
   // postconditions.
   EncodedInfo Encode(uint32_t rtp_timestamp,
-                     ArrayView<const int16_t> audio,
+                     std::span<const int16_t> audio,
                      Buffer* encoded);
 
   // Resets the encoder to its starting state, discarding any input that has
@@ -196,7 +196,7 @@
   // not call any methods on this encoder afterwards, except for the
   // destructor. The default implementation just returns an empty array.
   // NOTE: This method is subject to change. Do not call or override it.
-  virtual ArrayView<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders();
+  virtual std::span<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders();
 
   // Enables audio network adaptor. Returns true if successful.
   virtual bool EnableAudioNetworkAdaptor(absl::string_view config);
@@ -260,7 +260,7 @@
   // Subclasses implement this to perform the actual encoding. Called by
   // Encode().
   virtual EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                                 ArrayView<const int16_t> audio,
+                                 std::span<const int16_t> audio,
                                  Buffer* encoded) = 0;
 };
 }  // namespace webrtc
diff --git a/api/audio_options.cc b/api/audio_options.cc
index 46913b8a..8342920 100644
--- a/api/audio_options.cc
+++ b/api/audio_options.cc
@@ -13,7 +13,6 @@
 #include <optional>
 #include <string>
 
-#include "api/array_view.h"
 #include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
diff --git a/api/call/transport.h b/api/call/transport.h
index 74d7add..aade6a5 100644
--- a/api/call/transport.h
+++ b/api/call/transport.h
@@ -13,7 +13,7 @@
 
 #include <stdint.h>
 
-#include "api/array_view.h"
+#include <span>
 
 namespace webrtc {
 
@@ -41,9 +41,9 @@
 
 class Transport {
  public:
-  virtual bool SendRtp(ArrayView<const uint8_t> packet,
+  virtual bool SendRtp(std::span<const uint8_t> packet,
                        const PacketOptions& options) = 0;
-  virtual bool SendRtcp(ArrayView<const uint8_t> packet,
+  virtual bool SendRtcp(std::span<const uint8_t> packet,
                         const PacketOptions& options) = 0;
 
  protected:
diff --git a/api/crypto/BUILD.gn b/api/crypto/BUILD.gn
index 00a9deb..e89016a 100644
--- a/api/crypto/BUILD.gn
+++ b/api/crypto/BUILD.gn
@@ -35,7 +35,6 @@
   visibility = [ "*" ]
   sources = [ "frame_decryptor_interface.h" ]
   deps = [
-    "..:array_view",
     "..:ref_count",
     "..:rtp_parameters",
     "../../rtc_base:refcount",
@@ -46,7 +45,6 @@
   visibility = [ "*" ]
   sources = [ "frame_encryptor_interface.h" ]
   deps = [
-    "..:array_view",
     "..:ref_count",
     "..:rtp_parameters",
     "../../rtc_base:refcount",
diff --git a/api/crypto/frame_decryptor_interface.h b/api/crypto/frame_decryptor_interface.h
index 659f166..c0b8801 100644
--- a/api/crypto/frame_decryptor_interface.h
+++ b/api/crypto/frame_decryptor_interface.h
@@ -13,9 +13,9 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/media_types.h"
 #include "api/ref_count.h"
 
@@ -62,9 +62,9 @@
   // cases.
   virtual Result Decrypt(MediaType media_type,
                          const std::vector<uint32_t>& csrcs,
-                         ArrayView<const uint8_t> additional_data,
-                         ArrayView<const uint8_t> encrypted_frame,
-                         ArrayView<uint8_t> frame) = 0;
+                         std::span<const uint8_t> additional_data,
+                         std::span<const uint8_t> encrypted_frame,
+                         std::span<uint8_t> frame) = 0;
 
   // Returns the total required length in bytes for the output of the
   // decryption. This can be larger than the actual number of bytes you need but
diff --git a/api/crypto/frame_encryptor_interface.h b/api/crypto/frame_encryptor_interface.h
index 6a17972..4360cd5 100644
--- a/api/crypto/frame_encryptor_interface.h
+++ b/api/crypto/frame_encryptor_interface.h
@@ -13,8 +13,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/media_types.h"
 #include "api/ref_count.h"
 
@@ -40,9 +40,9 @@
   // selected by the implementer to represent error codes.
   virtual int Encrypt(MediaType media_type,
                       uint32_t ssrc,
-                      ArrayView<const uint8_t> additional_data,
-                      ArrayView<const uint8_t> frame,
-                      ArrayView<uint8_t> encrypted_frame,
+                      std::span<const uint8_t> additional_data,
+                      std::span<const uint8_t> frame,
+                      std::span<uint8_t> encrypted_frame,
                       size_t* bytes_written) = 0;
 
   // Returns the total required length in bytes for the output of the
diff --git a/api/data_channel_event_observer_interface.h b/api/data_channel_event_observer_interface.h
index f9b5902..135db62 100644
--- a/api/data_channel_event_observer_interface.h
+++ b/api/data_channel_event_observer_interface.h
@@ -12,11 +12,11 @@
 #define API_DATA_CHANNEL_EVENT_OBSERVER_INTERFACE_H_
 
 #include <cstdint>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 
 namespace webrtc {
 
@@ -55,7 +55,7 @@
     void set_data_type(DataType type) { data_type_ = type; }
 
     const std::vector<uint8_t>& data() const { return data_; }
-    void set_data(ArrayView<const uint8_t> d) {
+    void set_data(std::span<const uint8_t> d) {
       data_.assign(d.begin(), d.end());
     }
 
diff --git a/api/datagram_connection.h b/api/datagram_connection.h
index 9b52e97..e18588b 100644
--- a/api/datagram_connection.h
+++ b/api/datagram_connection.h
@@ -12,11 +12,11 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <string_view>
 
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/candidate.h"
 #include "api/ref_count.h"
 #include "api/units/timestamp.h"
@@ -48,7 +48,7 @@
     struct PacketMetadata {
       Timestamp receive_time;
     };
-    virtual void OnPacketReceived(ArrayView<const uint8_t> data,
+    virtual void OnPacketReceived(std::span<const uint8_t> data,
                                   PacketMetadata metadata) = 0;
 
     // Notification of outcome of an earlier call to SendPacket.
@@ -96,13 +96,13 @@
     // performed, the caller is responsible for ensuring uniqueness and handing
     // rollovers.
     PacketId id = 0;
-    ArrayView<const uint8_t> payload;
+    std::span<const uint8_t> payload;
   };
 
   // Send a batch of packets on this connection. Listen to
   // Observer::OnSendOutcome for notification of whether each was sent
   // successfully.
-  virtual void SendPackets(ArrayView<PacketSendParameters> packets) = 0;
+  virtual void SendPackets(std::span<PacketSendParameters> packets) = 0;
 
   // Initiate closing connection and releasing resources. Must be called before
   // destruction.
diff --git a/api/frame_transformer_interface.h b/api/frame_transformer_interface.h
index 42ac2c1..9f4ed92 100644
--- a/api/frame_transformer_interface.h
+++ b/api/frame_transformer_interface.h
@@ -14,9 +14,9 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/ref_count.h"
 #include "api/scoped_refptr.h"
 #include "api/units/time_delta.h"
@@ -46,10 +46,10 @@
 
   // Returns the frame payload data. The data is valid until the next non-const
   // method call.
-  virtual ArrayView<const uint8_t> GetData() const = 0;
+  virtual std::span<const uint8_t> GetData() const = 0;
 
   // Copies `data` into the owned frame payload data.
-  virtual void SetData(ArrayView<const uint8_t> data) = 0;
+  virtual void SetData(std::span<const uint8_t> data) = 0;
 
   virtual uint8_t GetPayloadType() const = 0;
   virtual bool CanSetPayloadType() const { return false; }
@@ -125,7 +125,7 @@
   RTC_EXPORT explicit TransformableAudioFrameInterface(Passkey passkey);
   ~TransformableAudioFrameInterface() override = default;
 
-  virtual ArrayView<const uint32_t> GetContributingSources() const = 0;
+  virtual std::span<const uint32_t> GetContributingSources() const = 0;
 
   virtual const std::optional<uint16_t> SequenceNumber() const = 0;
 
diff --git a/api/neteq/BUILD.gn b/api/neteq/BUILD.gn
index 826e426..b68fbe8 100644
--- a/api/neteq/BUILD.gn
+++ b/api/neteq/BUILD.gn
@@ -17,7 +17,6 @@
   ]
 
   deps = [
-    "..:array_view",
     "..:rtp_headers",
     "..:rtp_packet_info",
     "..:scoped_refptr",
diff --git a/api/neteq/neteq.h b/api/neteq/neteq.h
index b0aed23..da667b5 100644
--- a/api/neteq/neteq.h
+++ b/api/neteq/neteq.h
@@ -16,10 +16,10 @@
 
 #include <map>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/rtp_headers.h"
 #include "api/rtp_packet_info.h"
@@ -186,14 +186,14 @@
   virtual ~NetEq() {}
 
   virtual int InsertPacket(const RTPHeader& rtp_header,
-                           ArrayView<const uint8_t> payload) {
+                           std::span<const uint8_t> payload) {
     return InsertPacket(rtp_header, payload,
                         /*receive_time=*/Timestamp::MinusInfinity());
   }
 
   // TODO: webrtc:343501093 - removed unused method.
   virtual int InsertPacket(const RTPHeader& rtp_header,
-                           ArrayView<const uint8_t> payload,
+                           std::span<const uint8_t> payload,
                            Timestamp receive_time) {
     return InsertPacket(rtp_header, payload,
                         RtpPacketInfo(rtp_header, receive_time));
@@ -203,7 +203,7 @@
   // Returns 0 on success, -1 on failure.
   // TODO: webrtc:343501093 - Make this method pure virtual.
   virtual int InsertPacket(const RTPHeader& rtp_header,
-                           ArrayView<const uint8_t> payload,
+                           std::span<const uint8_t> payload,
                            const RtpPacketInfo& /* rtp_packet_info */) {
     return InsertPacket(rtp_header, payload);
   }
diff --git a/api/numerics/BUILD.gn b/api/numerics/BUILD.gn
index 3ec8c37..2d9f6a2 100644
--- a/api/numerics/BUILD.gn
+++ b/api/numerics/BUILD.gn
@@ -16,7 +16,6 @@
     "samples_stats_counter.h",
   ]
   deps = [
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:rtc_numerics",
     "../units:timestamp",
diff --git a/api/numerics/samples_stats_counter.h b/api/numerics/samples_stats_counter.h
index 38d0cbe..89bedb2 100644
--- a/api/numerics/samples_stats_counter.h
+++ b/api/numerics/samples_stats_counter.h
@@ -15,10 +15,10 @@
 #include <stdint.h>
 
 #include <map>
+#include <span>
 #include <string>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/numerics/running_statistics.h"
@@ -102,7 +102,7 @@
   // guarantees of order, so samples can be in different order comparing to in
   // which they were added into counter. Also return value will be invalidate
   // after call to any non const method.
-  ArrayView<const StatsSample> GetTimedSamples() const { return samples_; }
+  std::span<const StatsSample> GetTimedSamples() const { return samples_; }
   std::vector<double> GetSamples() const {
     std::vector<double> out;
     out.reserve(samples_.size());
diff --git a/api/rtp_transceiver_interface.h b/api/rtp_transceiver_interface.h
index a4ff39a..021b215 100644
--- a/api/rtp_transceiver_interface.h
+++ b/api/rtp_transceiver_interface.h
@@ -12,11 +12,11 @@
 #define API_RTP_TRANSCEIVER_INTERFACE_H_
 
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/base/attributes.h"
-#include "api/array_view.h"
 #include "api/media_types.h"
 #include "api/ref_count.h"
 #include "api/rtc_error.h"
@@ -152,7 +152,7 @@
   // by WebRTC for this transceiver.
   // https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-setcodecpreferences
   virtual RTCError SetCodecPreferences(
-      ArrayView<RtpCodecCapability> codecs) = 0;
+      std::span<RtpCodecCapability> codecs) = 0;
   virtual std::vector<RtpCodecCapability> codec_preferences() const = 0;
 
   // Returns the set of header extensions that was set
@@ -172,7 +172,7 @@
   // so that it negotiates use of header extensions which are not kStopped.
   // https://w3c.github.io/webrtc-extensions/#rtcrtptransceiver-interface
   virtual RTCError SetHeaderExtensionsToNegotiate(
-      ArrayView<const RtpHeaderExtensionCapability> header_extensions) = 0;
+      std::span<const RtpHeaderExtensionCapability> header_extensions) = 0;
 
  protected:
   ~RtpTransceiverInterface() override = default;
diff --git a/api/test/fake_frame_decryptor.cc b/api/test/fake_frame_decryptor.cc
index 0e1da2c..a57c086 100644
--- a/api/test/fake_frame_decryptor.cc
+++ b/api/test/fake_frame_decryptor.cc
@@ -12,9 +12,9 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/media_types.h"
 #include "rtc_base/checks.h"
 
@@ -27,9 +27,9 @@
 FakeFrameDecryptor::Result FakeFrameDecryptor::Decrypt(
     MediaType /* media_type */,
     const std::vector<uint32_t>& /* csrcs */,
-    ArrayView<const uint8_t> /* additional_data */,
-    ArrayView<const uint8_t> encrypted_frame,
-    ArrayView<uint8_t> frame) {
+    std::span<const uint8_t> /* additional_data */,
+    std::span<const uint8_t> encrypted_frame,
+    std::span<uint8_t> frame) {
   if (fail_decryption_) {
     return Result(Status::kFailedToDecrypt, 0);
   }
diff --git a/api/test/fake_frame_decryptor.h b/api/test/fake_frame_decryptor.h
index b3a7997..018a3e5 100644
--- a/api/test/fake_frame_decryptor.h
+++ b/api/test/fake_frame_decryptor.h
@@ -14,9 +14,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/crypto/frame_decryptor_interface.h"
 #include "api/media_types.h"
 
@@ -36,9 +36,9 @@
   // the postfix byte. This will always fail if fail_decryption_ is set to true.
   Result Decrypt(MediaType media_type,
                  const std::vector<uint32_t>& csrcs,
-                 ArrayView<const uint8_t> additional_data,
-                 ArrayView<const uint8_t> encrypted_frame,
-                 ArrayView<uint8_t> frame) override;
+                 std::span<const uint8_t> additional_data,
+                 std::span<const uint8_t> encrypted_frame,
+                 std::span<uint8_t> frame) override;
   // Always returns 1 less than the size of the encrypted frame.
   size_t GetMaxPlaintextByteSize(MediaType media_type,
                                  size_t encrypted_frame_size) override;
diff --git a/api/test/fake_frame_encryptor.cc b/api/test/fake_frame_encryptor.cc
index d35756e..da996c4 100644
--- a/api/test/fake_frame_encryptor.cc
+++ b/api/test/fake_frame_encryptor.cc
@@ -12,8 +12,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/media_types.h"
 #include "rtc_base/checks.h"
 
@@ -24,9 +24,9 @@
 // FrameEncryptorInterface implementation
 int FakeFrameEncryptor::Encrypt(MediaType /* media_type */,
                                 uint32_t /* ssrc */,
-                                ArrayView<const uint8_t> /* additional_data */,
-                                ArrayView<const uint8_t> frame,
-                                ArrayView<uint8_t> encrypted_frame,
+                                std::span<const uint8_t> /* additional_data */,
+                                std::span<const uint8_t> frame,
+                                std::span<uint8_t> encrypted_frame,
                                 size_t* bytes_written) {
   if (fail_encryption_) {
     return static_cast<int>(FakeEncryptionStatus::FORCED_FAILURE);
diff --git a/api/test/fake_frame_encryptor.h b/api/test/fake_frame_encryptor.h
index eae0e41..4f8d6c2 100644
--- a/api/test/fake_frame_encryptor.h
+++ b/api/test/fake_frame_encryptor.h
@@ -14,7 +14,8 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "api/array_view.h"
+#include <span>
+
 #include "api/crypto/frame_encryptor_interface.h"
 #include "api/media_types.h"
 #include "rtc_base/ref_counted_object.h"
@@ -34,9 +35,9 @@
   // bit to the end. This will always fail if fail_encryption_ is set to true.
   int Encrypt(MediaType media_type,
               uint32_t ssrc,
-              ArrayView<const uint8_t> additional_data,
-              ArrayView<const uint8_t> frame,
-              ArrayView<uint8_t> encrypted_frame,
+              std::span<const uint8_t> additional_data,
+              std::span<const uint8_t> frame,
+              std::span<uint8_t> encrypted_frame,
               size_t* bytes_written) override;
   // Always returns 1 more than the size of the frame.
   size_t GetMaxCiphertextByteSize(MediaType media_type,
diff --git a/api/test/metrics/BUILD.gn b/api/test/metrics/BUILD.gn
index abb6453..7834e21 100644
--- a/api/test/metrics/BUILD.gn
+++ b/api/test/metrics/BUILD.gn
@@ -95,10 +95,7 @@
 rtc_library("metrics_exporter") {
   visibility = [ "*" ]
   sources = [ "metrics_exporter.h" ]
-  deps = [
-    ":metric",
-    "../..:array_view",
-  ]
+  deps = [ ":metric" ]
 }
 
 if (!build_with_chromium) {
@@ -114,7 +111,6 @@
     deps = [
       ":metric",
       ":metrics_exporter",
-      "../..:array_view",
       "../../../rtc_base:stringutils",
       "../../../test:test_flags",
       "//third_party/abseil-cpp/absl/flags:flag",
@@ -133,7 +129,6 @@
   deps = [
     ":metric",
     ":metrics_exporter",
-    "../..:array_view",
     "../../../test:fileutils",
     "../../../test:perf_test",
     "//third_party/abseil-cpp/absl/memory",
@@ -160,7 +155,6 @@
   deps = [
     ":metric",
     ":metrics_exporter",
-    "../..:array_view",
     "../../../rtc_base:logging",
     "../../../test:fileutils",
     "//third_party/abseil-cpp/absl/strings:string_view",
@@ -181,7 +175,6 @@
   deps = [
     ":metric",
     ":metrics_exporter",
-    "../..:array_view",
     "../../../test:perf_test",
     "../../numerics",
   ]
@@ -259,7 +252,6 @@
       ":metric",
       ":metrics_exporter",
       ":metrics_logger",
-      "../..:array_view",
       "../../../system_wrappers",
       "../../../test:test_support",
     ]
diff --git a/api/test/metrics/chrome_perf_dashboard_metrics_exporter.cc b/api/test/metrics/chrome_perf_dashboard_metrics_exporter.cc
index 79d50d6..3ba87cb 100644
--- a/api/test/metrics/chrome_perf_dashboard_metrics_exporter.cc
+++ b/api/test/metrics/chrome_perf_dashboard_metrics_exporter.cc
@@ -11,12 +11,12 @@
 
 #include <cstdio>
 #include <memory>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "test/testsupport/file_utils.h"
 #include "test/testsupport/perf_test.h"
@@ -101,7 +101,7 @@
     : export_file_path_(export_file_path) {}
 
 bool ChromePerfDashboardMetricsExporter::Export(
-    ArrayView<const Metric> metrics) {
+    std::span<const Metric> metrics) {
   std::unique_ptr<PerfTestResultWriter> writer =
       absl::WrapUnique<PerfTestResultWriter>(CreateHistogramWriter());
   for (const Metric& metric : metrics) {
diff --git a/api/test/metrics/chrome_perf_dashboard_metrics_exporter.h b/api/test/metrics/chrome_perf_dashboard_metrics_exporter.h
index 1044751..0395993 100644
--- a/api/test/metrics/chrome_perf_dashboard_metrics_exporter.h
+++ b/api/test/metrics/chrome_perf_dashboard_metrics_exporter.h
@@ -11,10 +11,10 @@
 #ifndef API_TEST_METRICS_CHROME_PERF_DASHBOARD_METRICS_EXPORTER_H_
 #define API_TEST_METRICS_CHROME_PERF_DASHBOARD_METRICS_EXPORTER_H_
 
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "api/test/metrics/metrics_exporter.h"
 
@@ -29,7 +29,7 @@
       absl::string_view export_file_path);
   ~ChromePerfDashboardMetricsExporter() override = default;
 
-  bool Export(ArrayView<const Metric> metrics) override;
+  bool Export(std::span<const Metric> metrics) override;
 
  private:
   const std::string export_file_path_;
diff --git a/api/test/metrics/global_metrics_logger_and_exporter_test.cc b/api/test/metrics/global_metrics_logger_and_exporter_test.cc
index bf462a6..4e50a93 100644
--- a/api/test/metrics/global_metrics_logger_and_exporter_test.cc
+++ b/api/test/metrics/global_metrics_logger_and_exporter_test.cc
@@ -12,11 +12,11 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "api/test/metrics/metrics_exporter.h"
 #include "api/test/metrics/metrics_logger.h"
@@ -54,7 +54,7 @@
         : factory_(factory), export_result_(export_result) {}
     ~TestMetricsExporter() override = default;
 
-    bool Export(ArrayView<const Metric> metrics) override {
+    bool Export(std::span<const Metric> metrics) override {
       factory_->exported_metrics =
           std::vector<Metric>(metrics.begin(), metrics.end());
       return export_result_;
diff --git a/api/test/metrics/metrics_exporter.h b/api/test/metrics/metrics_exporter.h
index b71d4fb..2640fc8 100644
--- a/api/test/metrics/metrics_exporter.h
+++ b/api/test/metrics/metrics_exporter.h
@@ -11,7 +11,8 @@
 #ifndef API_TEST_METRICS_METRICS_EXPORTER_H_
 #define API_TEST_METRICS_METRICS_EXPORTER_H_
 
-#include "api/array_view.h"
+#include <span>
+
 #include "api/test/metrics/metric.h"
 
 namespace webrtc {
@@ -24,7 +25,7 @@
 
   // Exports specified metrics in a format that depends on the implementation.
   // Returns true if export succeeded, false otherwise.
-  virtual bool Export(ArrayView<const Metric> metrics) = 0;
+  virtual bool Export(std::span<const Metric> metrics) = 0;
 };
 
 }  // namespace test
diff --git a/api/test/metrics/metrics_set_proto_file_exporter.cc b/api/test/metrics/metrics_set_proto_file_exporter.cc
index c3a7554..88588e8 100644
--- a/api/test/metrics/metrics_set_proto_file_exporter.cc
+++ b/api/test/metrics/metrics_set_proto_file_exporter.cc
@@ -11,11 +11,11 @@
 
 #include <cstdio>
 #include <map>
+#include <span>
 #include <string>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "rtc_base/logging.h"
 #include "test/testsupport/file_utils.h"
@@ -131,7 +131,7 @@
     std::map<std::string, std::string> metadata)
     : export_file_path(export_file_path), metadata(std::move(metadata)) {}
 
-bool MetricsSetProtoFileExporter::Export(ArrayView<const Metric> metrics) {
+bool MetricsSetProtoFileExporter::Export(std::span<const Metric> metrics) {
 #if WEBRTC_ENABLE_PROTOBUF
   test_metrics::MetricsSet metrics_set;
   for (const auto& [key, value] : options_.metadata) {
diff --git a/api/test/metrics/metrics_set_proto_file_exporter.h b/api/test/metrics/metrics_set_proto_file_exporter.h
index 6e38eb9..6338527 100644
--- a/api/test/metrics/metrics_set_proto_file_exporter.h
+++ b/api/test/metrics/metrics_set_proto_file_exporter.h
@@ -12,10 +12,10 @@
 #define API_TEST_METRICS_METRICS_SET_PROTO_FILE_EXPORTER_H_
 
 #include <map>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "api/test/metrics/metrics_exporter.h"
 
@@ -48,7 +48,7 @@
   MetricsSetProtoFileExporter& operator=(const MetricsSetProtoFileExporter&) =
       delete;
 
-  bool Export(ArrayView<const Metric> metrics) override;
+  bool Export(std::span<const Metric> metrics) override;
 
  private:
   const Options options_;
diff --git a/api/test/metrics/print_result_proxy_metrics_exporter.cc b/api/test/metrics/print_result_proxy_metrics_exporter.cc
index cb163fa..2a16858 100644
--- a/api/test/metrics/print_result_proxy_metrics_exporter.cc
+++ b/api/test/metrics/print_result_proxy_metrics_exporter.cc
@@ -10,10 +10,10 @@
 #include "api/test/metrics/print_result_proxy_metrics_exporter.h"
 
 #include <cstddef>
+#include <span>
 #include <string>
 #include <unordered_set>
 
-#include "api/array_view.h"
 #include "api/numerics/samples_stats_counter.h"
 #include "api/test/metrics/metric.h"
 #include "test/testsupport/perf_test.h"
@@ -78,7 +78,7 @@
 
 }  // namespace
 
-bool PrintResultProxyMetricsExporter::Export(ArrayView<const Metric> metrics) {
+bool PrintResultProxyMetricsExporter::Export(std::span<const Metric> metrics) {
   static const std::unordered_set<std::string> per_call_metrics{
       "actual_encode_bitrate",
       "encode_frame_rate",
diff --git a/api/test/metrics/print_result_proxy_metrics_exporter.h b/api/test/metrics/print_result_proxy_metrics_exporter.h
index cbc72ab..a84304b 100644
--- a/api/test/metrics/print_result_proxy_metrics_exporter.h
+++ b/api/test/metrics/print_result_proxy_metrics_exporter.h
@@ -11,7 +11,8 @@
 #ifndef API_TEST_METRICS_PRINT_RESULT_PROXY_METRICS_EXPORTER_H_
 #define API_TEST_METRICS_PRINT_RESULT_PROXY_METRICS_EXPORTER_H_
 
-#include "api/array_view.h"
+#include <span>
+
 #include "api/test/metrics/metric.h"
 #include "api/test/metrics/metrics_exporter.h"
 
@@ -23,7 +24,7 @@
  public:
   ~PrintResultProxyMetricsExporter() override = default;
 
-  bool Export(ArrayView<const Metric> metrics) override;
+  bool Export(std::span<const Metric> metrics) override;
 };
 
 }  // namespace test
diff --git a/api/test/metrics/stdout_metrics_exporter.cc b/api/test/metrics/stdout_metrics_exporter.cc
index 336817f..f87fe02 100644
--- a/api/test/metrics/stdout_metrics_exporter.cc
+++ b/api/test/metrics/stdout_metrics_exporter.cc
@@ -13,11 +13,11 @@
 #include <cstdint>
 #include <cstdio>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/flags/flag.h"
 #include "absl/strings/str_cat.h"
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "rtc_base/strings/string_builder.h"
 #include "test/test_flags.h"
@@ -89,7 +89,7 @@
 
 StdoutMetricsExporter::StdoutMetricsExporter() : output_(stdout) {}
 
-bool StdoutMetricsExporter::Export(ArrayView<const Metric> metrics) {
+bool StdoutMetricsExporter::Export(std::span<const Metric> metrics) {
   for (const Metric& metric : metrics) {
     PrintMetric(metric);
   }
diff --git a/api/test/metrics/stdout_metrics_exporter.h b/api/test/metrics/stdout_metrics_exporter.h
index 60354b5..bdf473b 100644
--- a/api/test/metrics/stdout_metrics_exporter.h
+++ b/api/test/metrics/stdout_metrics_exporter.h
@@ -12,8 +12,8 @@
 #define API_TEST_METRICS_STDOUT_METRICS_EXPORTER_H_
 
 #include <cstdio>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/test/metrics/metric.h"
 #include "api/test/metrics/metrics_exporter.h"
 
@@ -29,7 +29,7 @@
   StdoutMetricsExporter(const StdoutMetricsExporter&) = delete;
   StdoutMetricsExporter& operator=(const StdoutMetricsExporter&) = delete;
 
-  bool Export(ArrayView<const Metric> metrics) override;
+  bool Export(std::span<const Metric> metrics) override;
 
  private:
   void PrintMetric(const Metric& metric);
diff --git a/api/test/mock_datagram_connection.h b/api/test/mock_datagram_connection.h
index 128add9..e31e4fe 100644
--- a/api/test/mock_datagram_connection.h
+++ b/api/test/mock_datagram_connection.h
@@ -12,11 +12,11 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <type_traits>
 
 #include "absl/functional/any_invocable.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/candidate.h"
 #include "api/datagram_connection.h"
 #include "p2p/base/transport_description.h"
@@ -45,14 +45,14 @@
               (override));
   MOCK_METHOD(void,
               SendPackets,
-              (ArrayView<PacketSendParameters> packets),
+              (std::span<PacketSendParameters> packets),
               (override));
   MOCK_METHOD(void,
               Terminate,
               (absl::AnyInvocable<void()> terminate_complete_callback),
               (override));
-  MOCK_METHOD(std::string_view, IceUsernameFragment, (), (override));
-  MOCK_METHOD(std::string_view, IcePassword, (), (override));
+  MOCK_METHOD(absl::string_view, IceUsernameFragment, (), (override));
+  MOCK_METHOD(absl::string_view, IcePassword, (), (override));
 };
 
 static_assert(!std::is_abstract_v<RefCountedObject<MockDatagramConnection>>,
diff --git a/api/test/mock_datagram_connection_observer.h b/api/test/mock_datagram_connection_observer.h
index 9850872..c9978658 100644
--- a/api/test/mock_datagram_connection_observer.h
+++ b/api/test/mock_datagram_connection_observer.h
@@ -11,8 +11,8 @@
 #define API_TEST_MOCK_DATAGRAM_CONNECTION_OBSERVER_H_
 
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/candidate.h"
 #include "api/datagram_connection.h"
 #include "test/gmock.h"
@@ -27,7 +27,7 @@
               (override));
   MOCK_METHOD(void,
               OnPacketReceived,
-              (ArrayView<const uint8_t> data, PacketMetadata metadata),
+              (std::span<const uint8_t> data, PacketMetadata metadata),
               (override));
   MOCK_METHOD(void, OnSendOutcome, (SendOutcome send_outcome), (override));
   MOCK_METHOD(void, OnConnectionError, (), (override));
diff --git a/api/test/mock_frame_decryptor.h b/api/test/mock_frame_decryptor.h
index 191a7dd..93ed397 100644
--- a/api/test/mock_frame_decryptor.h
+++ b/api/test/mock_frame_decryptor.h
@@ -13,9 +13,9 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/crypto/frame_decryptor_interface.h"
 #include "api/media_types.h"
 #include "test/gmock.h"
@@ -28,9 +28,9 @@
               Decrypt,
               (MediaType,
                const std::vector<uint32_t>&,
-               ArrayView<const uint8_t>,
-               ArrayView<const uint8_t>,
-               ArrayView<uint8_t>),
+               std::span<const uint8_t>,
+               std::span<const uint8_t>,
+               std::span<uint8_t>),
               (override));
 
   MOCK_METHOD(size_t,
diff --git a/api/test/mock_frame_encryptor.h b/api/test/mock_frame_encryptor.h
index a449a29..85e3507 100644
--- a/api/test/mock_frame_encryptor.h
+++ b/api/test/mock_frame_encryptor.h
@@ -13,8 +13,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/crypto/frame_encryptor_interface.h"
 #include "api/media_types.h"
 #include "test/gmock.h"
@@ -27,9 +27,9 @@
               Encrypt,
               (MediaType,
                uint32_t,
-               ArrayView<const uint8_t>,
-               ArrayView<const uint8_t>,
-               ArrayView<uint8_t>,
+               std::span<const uint8_t>,
+               std::span<const uint8_t>,
+               std::span<uint8_t>,
                size_t*),
               (override));
 
diff --git a/api/test/mock_rtp_transceiver.h b/api/test/mock_rtp_transceiver.h
index 1a55efa..25a5c89 100644
--- a/api/test/mock_rtp_transceiver.h
+++ b/api/test/mock_rtp_transceiver.h
@@ -12,10 +12,10 @@
 #define API_TEST_MOCK_RTP_TRANSCEIVER_H_
 
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/make_ref_counted.h"
 #include "api/media_types.h"
 #include "api/rtc_error.h"
@@ -68,7 +68,7 @@
   MOCK_METHOD(void, Stop, (), (override));
   MOCK_METHOD(RTCError,
               SetCodecPreferences,
-              (ArrayView<RtpCodecCapability> codecs),
+              (std::span<RtpCodecCapability> codecs),
               (override));
   MOCK_METHOD(std::vector<RtpCodecCapability>,
               codec_preferences,
@@ -84,7 +84,7 @@
               (const, override));
   MOCK_METHOD(RTCError,
               SetHeaderExtensionsToNegotiate,
-              (ArrayView<const RtpHeaderExtensionCapability> header_extensions),
+              (std::span<const RtpHeaderExtensionCapability> header_extensions),
               (override));
 };
 
diff --git a/api/test/mock_transformable_audio_frame.h b/api/test/mock_transformable_audio_frame.h
index 9de3c3f..6abb24a 100644
--- a/api/test/mock_transformable_audio_frame.h
+++ b/api/test/mock_transformable_audio_frame.h
@@ -13,9 +13,9 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/frame_transformer_interface.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -27,8 +27,8 @@
  public:
   MockTransformableAudioFrame() : TransformableAudioFrameInterface(Passkey()) {}
 
-  MOCK_METHOD(ArrayView<const uint8_t>, GetData, (), (const, override));
-  MOCK_METHOD(void, SetData, (ArrayView<const uint8_t>), (override));
+  MOCK_METHOD(std::span<const uint8_t>, GetData, (), (const, override));
+  MOCK_METHOD(void, SetData, (std::span<const uint8_t>), (override));
   MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override));
   MOCK_METHOD(uint8_t, GetPayloadType, (), (const, override));
   MOCK_METHOD(bool, CanSetPayloadType, (), (const, override));
@@ -36,7 +36,7 @@
   MOCK_METHOD(uint32_t, GetSsrc, (), (const, override));
   MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override));
   MOCK_METHOD(std::string, GetMimeType, (), (const, override));
-  MOCK_METHOD(ArrayView<const uint32_t>,
+  MOCK_METHOD(std::span<const uint32_t>,
               GetContributingSources,
               (),
               (const, override));
diff --git a/api/test/mock_transformable_frame.h b/api/test/mock_transformable_frame.h
index 252622a..804901d 100644
--- a/api/test/mock_transformable_frame.h
+++ b/api/test/mock_transformable_frame.h
@@ -14,10 +14,10 @@
 #include <stdint.h>
 
 #include <optional>
+#include <span>
 #include <string>
 #include <type_traits>
 
-#include "api/array_view.h"
 #include "api/frame_transformer_interface.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -29,8 +29,8 @@
  public:
   MockTransformableFrame() : TransformableFrameInterface(Passkey()) {}
 
-  MOCK_METHOD(ArrayView<const uint8_t>, GetData, (), (const, override));
-  MOCK_METHOD(void, SetData, (ArrayView<const uint8_t>), (override));
+  MOCK_METHOD(std::span<const uint8_t>, GetData, (), (const, override));
+  MOCK_METHOD(void, SetData, (std::span<const uint8_t>), (override));
   MOCK_METHOD(uint8_t, GetPayloadType, (), (const, override));
   MOCK_METHOD(bool, CanSetPayloadType, (), (const, override));
   MOCK_METHOD(void, SetPayloadType, (uint8_t), (override));
diff --git a/api/test/mock_transformable_video_frame.h b/api/test/mock_transformable_video_frame.h
index 2529dcc..8f418a3 100644
--- a/api/test/mock_transformable_video_frame.h
+++ b/api/test/mock_transformable_video_frame.h
@@ -13,10 +13,10 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <string>
 #include <type_traits>
 
-#include "api/array_view.h"
 #include "api/frame_transformer_interface.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -28,8 +28,8 @@
 class MockTransformableVideoFrame : public TransformableVideoFrameInterface {
  public:
   MockTransformableVideoFrame() : TransformableVideoFrameInterface(Passkey()) {}
-  MOCK_METHOD(ArrayView<const uint8_t>, GetData, (), (const, override));
-  MOCK_METHOD(void, SetData, (ArrayView<const uint8_t> data), (override));
+  MOCK_METHOD(std::span<const uint8_t>, GetData, (), (const, override));
+  MOCK_METHOD(void, SetData, (std::span<const uint8_t> data), (override));
   MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override));
   MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override));
   MOCK_METHOD(uint32_t, GetSsrc, (), (const, override));
diff --git a/api/test/network_emulation_manager.h b/api/test/network_emulation_manager.h
index 611a4b3..de5afe8 100644
--- a/api/test/network_emulation_manager.h
+++ b/api/test/network_emulation_manager.h
@@ -15,13 +15,13 @@
 #include <functional>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/base/nullability.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/test/network_emulation/cross_traffic.h"
 #include "api/test/network_emulation/network_emulation_interfaces.h"
@@ -346,14 +346,14 @@
   // `stats_callback`. Callback will be executed on network emulation
   // internal task queue.
   virtual void GetStats(
-      ArrayView<EmulatedEndpoint* const> endpoints,
+      std::span<EmulatedEndpoint* const> endpoints,
       std::function<void(EmulatedNetworkStats)> stats_callback) = 0;
 
   // Passes combined network stats for all specified `nodes` into specified
   // `stats_callback`. Callback will be executed on network emulation
   // internal task queue.
   virtual void GetStats(
-      ArrayView<EmulatedNetworkNode* const> nodes,
+      std::span<EmulatedNetworkNode* const> nodes,
       std::function<void(EmulatedNetworkNodeStats)> stats_callback) = 0;
 
   // Create a EmulatedTURNServer.
diff --git a/api/test/pclf/BUILD.gn b/api/test/pclf/BUILD.gn
index 363bedd..858b09b 100644
--- a/api/test/pclf/BUILD.gn
+++ b/api/test/pclf/BUILD.gn
@@ -17,7 +17,6 @@
   ]
 
   deps = [
-    "../..:array_view",
     "../..:audio_options_api",
     "../..:media_stream_interface",
     "../..:rtp_parameters",
diff --git a/api/test/pclf/media_configuration.cc b/api/test/pclf/media_configuration.cc
index 679486d..1ce3f2a 100644
--- a/api/test/pclf/media_configuration.cc
+++ b/api/test/pclf/media_configuration.cc
@@ -16,12 +16,12 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/test/video/video_frame_writer.h"
 #include "api/units/time_delta.h"
 #include "rtc_base/checks.h"
@@ -229,7 +229,7 @@
     : name(name), required_params(std::move(required_params)) {}
 
 std::optional<VideoResolution> VideoSubscription::GetMaxResolution(
-    ArrayView<const VideoConfig> video_configs) {
+    std::span<const VideoConfig> video_configs) {
   std::vector<VideoResolution> resolutions;
   for (const auto& video_config : video_configs) {
     resolutions.push_back(video_config.GetResolution());
@@ -238,7 +238,7 @@
 }
 
 std::optional<VideoResolution> VideoSubscription::GetMaxResolution(
-    ArrayView<const VideoResolution> resolutions) {
+    std::span<const VideoResolution> resolutions) {
   if (resolutions.empty()) {
     return std::nullopt;
   }
diff --git a/api/test/pclf/media_configuration.h b/api/test/pclf/media_configuration.h
index 5f8e45c..c39978a 100644
--- a/api/test/pclf/media_configuration.h
+++ b/api/test/pclf/media_configuration.h
@@ -17,11 +17,11 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_options.h"
 #include "api/media_stream_interface.h"
 #include "api/rtp_parameters.h"
@@ -394,9 +394,9 @@
   // Returns the resolution constructed as maximum from all resolution
   // dimensions: width, height and fps.
   static std::optional<VideoResolution> GetMaxResolution(
-      ArrayView<const VideoConfig> video_configs);
+      std::span<const VideoConfig> video_configs);
   static std::optional<VideoResolution> GetMaxResolution(
-      ArrayView<const VideoResolution> resolutions);
+      std::span<const VideoResolution> resolutions);
 
   bool operator==(const VideoSubscription& other) const;
   bool operator!=(const VideoSubscription& other) const;
diff --git a/api/test/video_quality_analyzer_interface.h b/api/test/video_quality_analyzer_interface.h
index 4322336..a06342c 100644
--- a/api/test/video_quality_analyzer_interface.h
+++ b/api/test/video_quality_analyzer_interface.h
@@ -13,10 +13,10 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "api/stats/rtc_stats_report.h"
 #include "api/test/stats_observer_interface.h"
@@ -88,7 +88,7 @@
   // thread in each method, but should remember, that it is the same thread,
   // that is used in video pipeline.
   virtual void Start(std::string /* test_case_name */,
-                     ArrayView<const std::string> /* peer_names */,
+                     std::span<const std::string> /* peer_names */,
                      int /* max_threads_count */) {}
 
   // Will be called when frame was generated from the input stream.
diff --git a/api/transport/BUILD.gn b/api/transport/BUILD.gn
index 136a8f9..26737a2 100644
--- a/api/transport/BUILD.gn
+++ b/api/transport/BUILD.gn
@@ -65,7 +65,6 @@
   visibility = [ "*" ]
   sources = [ "data_channel_transport_interface.h" ]
   deps = [
-    "..:array_view",
     "..:priority",
     "..:rtc_error",
     "../../rtc_base:copy_on_write_buffer",
@@ -110,7 +109,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../rtc_base:byte_buffer",
     "../../rtc_base:byte_order",
     "../../rtc_base:checks",
@@ -176,7 +174,6 @@
     sources = [ "stun_unittest.cc" ]
     deps = [
       ":stun_types",
-      "..:array_view",
       "../../rtc_base:byte_buffer",
       "../../rtc_base:byte_order",
       "../../rtc_base:ip_address",
diff --git a/api/transport/rtp/BUILD.gn b/api/transport/rtp/BUILD.gn
index fa0dc97..dc627f8 100644
--- a/api/transport/rtp/BUILD.gn
+++ b/api/transport/rtp/BUILD.gn
@@ -41,7 +41,6 @@
     "corruption_detection_message.h",
   ]
   deps = [
-    "../../:array_view",
     "../../../rtc_base:checks",
     "../../video/corruption_detection:frame_instrumentation_data",
     "//third_party/abseil-cpp/absl/container:inlined_vector",
diff --git a/api/transport/rtp/corruption_detection_message.cc b/api/transport/rtp/corruption_detection_message.cc
index 68e1ca6..903b0ca 100644
--- a/api/transport/rtp/corruption_detection_message.cc
+++ b/api/transport/rtp/corruption_detection_message.cc
@@ -11,9 +11,9 @@
 #include "api/transport/rtp/corruption_detection_message.h"
 
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/video/corruption_detection/frame_instrumentation_data.h"
 #include "rtc_base/checks.h"
 
@@ -116,7 +116,7 @@
 
 CorruptionDetectionMessage::Builder&
 CorruptionDetectionMessage::Builder::WithSampleValues(
-    const ArrayView<const double>& sample_values) {
+    const std::span<const double>& sample_values) {
   message_.sample_values_.assign(sample_values.begin(), sample_values.end());
   return *this;
 }
diff --git a/api/transport/rtp/corruption_detection_message.h b/api/transport/rtp/corruption_detection_message.h
index 81ea224..2765b51 100644
--- a/api/transport/rtp/corruption_detection_message.h
+++ b/api/transport/rtp/corruption_detection_message.h
@@ -13,9 +13,9 @@
 
 #include <cstddef>
 #include <optional>
+#include <span>
 
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "api/video/corruption_detection/frame_instrumentation_data.h"
 
 namespace webrtc {
@@ -39,8 +39,8 @@
   double std_dev() const { return std_dev_; }
   int luma_error_threshold() const { return luma_error_threshold_; }
   int chroma_error_threshold() const { return chroma_error_threshold_; }
-  ArrayView<const double> sample_values() const {
-    return MakeArrayView(sample_values_.data(), sample_values_.size());
+  std::span<const double> sample_values() const {
+    return std::span(sample_values_.data(), sample_values_.size());
   }
 
   static CorruptionDetectionMessage FromFrameInstrumentationData(
@@ -95,7 +95,7 @@
   Builder& WithStdDev(double std_dev);
   Builder& WithLumaErrorThreshold(int luma_error_threshold);
   Builder& WithChromaErrorThreshold(int chroma_error_threshold);
-  Builder& WithSampleValues(const ArrayView<const double>& sample_values);
+  Builder& WithSampleValues(const std::span<const double>& sample_values);
 
  private:
   CorruptionDetectionMessage message_;
diff --git a/api/transport/stun.cc b/api/transport/stun.cc
index 6b9ca04..2849a5a 100644
--- a/api/transport/stun.cc
+++ b/api/transport/stun.cc
@@ -17,12 +17,12 @@
 #include <iterator>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/byte_buffer.h"
 #include "rtc_base/byte_order.h"
 #include "rtc_base/checks.h"
@@ -51,8 +51,8 @@
              transaction_id.length() == kStunLegacyTransactionIdLength)
       << transaction_id.length();
   ByteBufferReader reader(
-      MakeArrayView(reinterpret_cast<const uint8_t*>(transaction_id.data()),
-                    transaction_id.size()));
+      std::span(reinterpret_cast<const uint8_t*>(transaction_id.data()),
+                transaction_id.size()));
   uint32_t result = 0;
   uint32_t next;
   while (reader.ReadUInt32(&next)) {
@@ -379,7 +379,7 @@
     return false;
   }
 
-  ArrayView<const uint8_t> data_view(reinterpret_cast<const uint8_t*>(data),
+  std::span<const uint8_t> data_view(reinterpret_cast<const uint8_t*>(data),
                                      size);
 
   // Getting the message length from the STUN header.
@@ -438,7 +438,7 @@
     //     |0 0|     STUN Message Type     |         Message Length        |
     //     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     SetBE16(
-        ArrayView<uint8_t>(reinterpret_cast<uint8_t*>(temp_data.get() + 2), 2),
+        std::span<uint8_t>(reinterpret_cast<uint8_t*>(temp_data.get() + 2), 2),
         static_cast<uint16_t>(new_adjusted_len));
   }
 
@@ -510,7 +510,7 @@
   if (size % 4 != 0 || size < kStunHeaderSize + fingerprint_attr_size)
     return false;
 
-  ArrayView<const uint8_t> data_view(reinterpret_cast<const uint8_t*>(data),
+  std::span<const uint8_t> data_view(reinterpret_cast<const uint8_t*>(data),
                                      size);
 
   // Skip the rest if the magic cookie isn't present.
@@ -539,14 +539,14 @@
   return CreateRandomString(kStunTransactionIdLength);
 }
 
-bool StunMessage::IsStunMethod(ArrayView<int> methods,
+bool StunMessage::IsStunMethod(std::span<int> methods,
                                const char* data,
                                size_t size) {
   // Check the message length.
   if (size % 4 != 0 || size < kStunHeaderSize)
     return false;
 
-  ArrayView<const uint8_t> data_view(reinterpret_cast<const uint8_t*>(data),
+  std::span<const uint8_t> data_view(reinterpret_cast<const uint8_t*>(data),
                                      size);
 
   // Skip the rest if the magic cookie isn't present.
@@ -816,7 +816,7 @@
   int remainder = length_ % 4;
   if (remainder > 0) {
     uint8_t zeroes[4] = {0};
-    buf->Write(ArrayView<const uint8_t>(zeroes, 4 - remainder));
+    buf->Write(std::span<const uint8_t>(zeroes, 4 - remainder));
   }
 }
 
@@ -915,8 +915,8 @@
     if (length() != SIZE_IP4) {
       return false;
     }
-    if (!buf->ReadBytes(MakeArrayView(reinterpret_cast<uint8_t*>(&v4addr),
-                                      sizeof(v4addr)))) {
+    if (!buf->ReadBytes(
+            std::span(reinterpret_cast<uint8_t*>(&v4addr), sizeof(v4addr)))) {
       return false;
     }
     IPAddress ipaddr(v4addr);
@@ -926,8 +926,8 @@
     if (length() != SIZE_IP6) {
       return false;
     }
-    if (!buf->ReadBytes(MakeArrayView(reinterpret_cast<uint8_t*>(&v6addr),
-                                      sizeof(v6addr)))) {
+    if (!buf->ReadBytes(
+            std::span(reinterpret_cast<uint8_t*>(&v6addr), sizeof(v6addr)))) {
       return false;
     }
     IPAddress ipaddr(v6addr);
@@ -950,13 +950,13 @@
   switch (address_.family()) {
     case AF_INET: {
       in_addr v4addr = address_.ipaddr().ipv4_address();
-      buf->Write(ArrayView<const uint8_t>(reinterpret_cast<uint8_t*>(&v4addr),
+      buf->Write(std::span<const uint8_t>(reinterpret_cast<uint8_t*>(&v4addr),
                                           sizeof(v4addr)));
       break;
     }
     case AF_INET6: {
       in6_addr v6addr = address_.ipaddr().ipv6_address();
-      buf->Write(ArrayView<const uint8_t>(reinterpret_cast<uint8_t*>(&v6addr),
+      buf->Write(std::span<const uint8_t>(reinterpret_cast<uint8_t*>(&v6addr),
                                           sizeof(v6addr)));
       break;
     }
@@ -1040,13 +1040,13 @@
   switch (xored_ip.family()) {
     case AF_INET: {
       in_addr v4addr = xored_ip.ipv4_address();
-      buf->Write(ArrayView<const uint8_t>(
+      buf->Write(std::span<const uint8_t>(
           reinterpret_cast<const uint8_t*>(&v4addr), sizeof(v4addr)));
       break;
     }
     case AF_INET6: {
       in6_addr v6addr = xored_ip.ipv6_address();
-      buf->Write(ArrayView<const uint8_t>(
+      buf->Write(std::span<const uint8_t>(
           reinterpret_cast<const uint8_t*>(&v6addr), sizeof(v6addr)));
       break;
     }
@@ -1185,7 +1185,7 @@
 
 bool StunByteStringAttribute::Read(ByteBufferReader* buf) {
   bytes_ = new uint8_t[length()];
-  if (!buf->ReadBytes(ArrayView<uint8_t>(bytes_, length()))) {
+  if (!buf->ReadBytes(std::span<uint8_t>(bytes_, length()))) {
     return false;
   }
 
@@ -1198,7 +1198,7 @@
   if (!LengthValid(type(), length())) {
     return false;
   }
-  buf->Write(ArrayView<const uint8_t>(bytes_, length()));
+  buf->Write(std::span<const uint8_t>(bytes_, length()));
   WritePadding(buf);
   return true;
 }
diff --git a/api/transport/stun.h b/api/transport/stun.h
index 9066a5c..f9e0a8f 100644
--- a/api/transport/stun.h
+++ b/api/transport/stun.h
@@ -19,11 +19,11 @@
 #include <functional>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "rtc_base/byte_buffer.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/ip_address.h"
@@ -255,7 +255,7 @@
 
   // Verify that a buffer has stun magic cookie and one of the specified
   // methods. Note that it does not check for the existance of FINGERPRINT.
-  static bool IsStunMethod(ArrayView<int> methods,
+  static bool IsStunMethod(std::span<int> methods,
                            const char* data,
                            size_t size);
 
@@ -523,9 +523,7 @@
   }
   // Returns the attribute value as an uint8_t view.
   // Use this function for values that are not text.
-  ArrayView<uint8_t> array_view() const {
-    return MakeArrayView(bytes_, length());
-  }
+  std::span<uint8_t> array_view() const { return std::span(bytes_, length()); }
 
   [[deprecated]] std::string GetString() const {
     return std::string(reinterpret_cast<const char*>(bytes_), length());
diff --git a/api/transport/stun_unittest.cc b/api/transport/stun_unittest.cc
index 1d70f5f..21d26ee 100644
--- a/api/transport/stun_unittest.cc
+++ b/api/transport/stun_unittest.cc
@@ -14,11 +14,11 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "rtc_base/byte_buffer.h"
 #include "rtc_base/byte_order.h"
 #include "rtc_base/ip_address.h"
@@ -212,9 +212,9 @@
   0x00, 0x03, 0x73, 0x50,
 };
 
-const ArrayView<const uint8_t> kZeroLenView(kStunMessageWithZeroLength);
-const ArrayView<const uint8_t> kExcessLenView(kStunMessageWithExcessLength);
-const ArrayView<const uint8_t> kSmallLenView(kStunMessageWithSmallLength);
+const std::span<const uint8_t> kZeroLenView(kStunMessageWithZeroLength);
+const std::span<const uint8_t> kExcessLenView(kStunMessageWithExcessLength);
+const std::span<const uint8_t> kSmallLenView(kStunMessageWithSmallLength);
 
 
 // RFC5769 Test Vectors
@@ -546,7 +546,7 @@
   size_t ReadStunMessageTestCase(StunMessage* msg,
                                  const uint8_t* testcase,
                                  size_t size) {
-    ByteBufferReader buf(MakeArrayView(testcase, size));
+    ByteBufferReader buf(std::span(testcase, size));
     if (msg->Read(&buf)) {
       // Returns the size the stun message should report itself as being
       return (size - 20);
@@ -1133,7 +1133,7 @@
 // Test that we fail to read messages with invalid lengths.
 void CheckFailureToRead(const uint8_t* testcase, size_t length) {
   StunMessage msg;
-  ByteBufferReader buf(MakeArrayView(testcase, length));
+  ByteBufferReader buf(std::span(testcase, length));
   ASSERT_FALSE(msg.Read(&buf));
 }
 
diff --git a/api/units/BUILD.gn b/api/units/BUILD.gn
index 379d5b5..0c54b3e 100644
--- a/api/units/BUILD.gn
+++ b/api/units/BUILD.gn
@@ -19,7 +19,6 @@
     ":data_size",
     ":frequency",
     ":time_delta",
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:stringutils",
     "../../rtc_base/system:rtc_export",
@@ -35,7 +34,6 @@
   ]
 
   deps = [
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:stringutils",
     "../../rtc_base/system:rtc_export",
@@ -51,7 +49,6 @@
   ]
 
   deps = [
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:stringutils",
     "../../rtc_base/system:rtc_export",
@@ -68,7 +65,6 @@
 
   deps = [
     ":time_delta",
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:stringutils",
     "../../rtc_base/system:rtc_export",
@@ -85,7 +81,6 @@
 
   deps = [
     ":time_delta",
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:stringutils",
     "../../rtc_base/system:rtc_export",
diff --git a/api/units/data_rate.cc b/api/units/data_rate.cc
index 7f99a17..5b3838f 100644
--- a/api/units/data_rate.cc
+++ b/api/units/data_rate.cc
@@ -12,7 +12,6 @@
 
 #include <string>
 
-#include "api/array_view.h"
 #include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
diff --git a/api/units/data_size.cc b/api/units/data_size.cc
index abe4906..24bb83c 100644
--- a/api/units/data_size.cc
+++ b/api/units/data_size.cc
@@ -12,7 +12,6 @@
 
 #include <string>
 
-#include "api/array_view.h"
 #include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
diff --git a/api/units/time_delta.cc b/api/units/time_delta.cc
index efd5a2a..9e1521b 100644
--- a/api/units/time_delta.cc
+++ b/api/units/time_delta.cc
@@ -12,7 +12,6 @@
 
 #include <string>
 
-#include "api/array_view.h"
 #include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
diff --git a/api/units/timestamp.cc b/api/units/timestamp.cc
index 38b0d11..6dd64ab 100644
--- a/api/units/timestamp.cc
+++ b/api/units/timestamp.cc
@@ -12,7 +12,6 @@
 
 #include <string>
 
-#include "api/array_view.h"
 #include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn
index d618604..0566d8b 100644
--- a/api/video/BUILD.gn
+++ b/api/video/BUILD.gn
@@ -27,7 +27,6 @@
   ]
 
   deps = [
-    "..:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:logging",
     "../../rtc_base:safe_conversions",
@@ -61,7 +60,6 @@
 
   deps = [
     ":video_rtp_headers",
-    "..:array_view",
     "..:make_ref_counted",
     "..:ref_count",
     "..:rtp_packet_info",
@@ -117,7 +115,6 @@
     ":encoded_image",
     ":video_frame",
     ":video_rtp_headers",
-    "..:array_view",
     "..:make_ref_counted",
     "..:scoped_refptr",
     "../units:timestamp",
@@ -206,7 +203,6 @@
     ":encoded_image",
     ":video_frame_type",
     ":video_rtp_headers",
-    "..:array_view",
     "..:rtp_packet_info",
     "..:scoped_refptr",
     "../../modules/rtp_rtcp",
@@ -231,7 +227,6 @@
     ":rtp_video_frame_assembler",
     ":video_frame",
     ":video_frame_type",
-    "..:array_view",
     "../../modules/rtp_rtcp",
     "../../modules/rtp_rtcp:rtp_packetizer_av1_test_helper",
     "../../modules/rtp_rtcp:rtp_rtcp_format",
@@ -253,7 +248,6 @@
       ":rtp_video_frame_assembler",
       ":video_frame",
       ":video_frame_type",
-      "..:array_view",
       "../../modules/rtp_rtcp",
       "../../modules/rtp_rtcp:rtp_rtcp_format",
       "../../modules/rtp_rtcp:rtp_video_header",
@@ -363,7 +357,6 @@
     ":video_frame",
     ":video_frame_type",
     ":video_rtp_headers",
-    "..:array_view",
     "../../modules/video_coding:codec_globals_headers",
     "../../rtc_base/system:rtc_export",
     "../transport/rtp:dependency_descriptor",
@@ -400,7 +393,6 @@
     "frame_buffer.h",
   ]
   deps = [
-    "..:array_view",
     "../../api:field_trials_view",
     "../../api/units:timestamp",
     "../../api/video:encoded_frame",
diff --git a/api/video/corruption_detection/frame_instrumentation_data.cc b/api/video/corruption_detection/frame_instrumentation_data.cc
index ecc076ad..d54aa4b 100644
--- a/api/video/corruption_detection/frame_instrumentation_data.cc
+++ b/api/video/corruption_detection/frame_instrumentation_data.cc
@@ -10,11 +10,10 @@
 
 #include "api/video/corruption_detection/frame_instrumentation_data.h"
 
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
-
 namespace webrtc {
 
 constexpr int kMaxSequenceIndex = (1 << 14) - 1;
@@ -61,7 +60,7 @@
 }
 
 bool FrameInstrumentationData::SetSampleValues(
-    webrtc::ArrayView<const double> samples) {
+    std::span<const double> samples) {
   for (double sample_value : samples) {
     if (sample_value < 0.0 || sample_value > 255.0) {
       return false;
diff --git a/api/video/corruption_detection/frame_instrumentation_data.h b/api/video/corruption_detection/frame_instrumentation_data.h
index 8d4dc41..923a981 100644
--- a/api/video/corruption_detection/frame_instrumentation_data.h
+++ b/api/video/corruption_detection/frame_instrumentation_data.h
@@ -11,10 +11,9 @@
 #ifndef API_VIDEO_CORRUPTION_DETECTION_FRAME_INSTRUMENTATION_DATA_H_
 #define API_VIDEO_CORRUPTION_DETECTION_FRAME_INSTRUMENTATION_DATA_H_
 
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
-
 namespace webrtc {
 
 class FrameInstrumentationData {
@@ -26,14 +25,14 @@
   double std_dev() const { return std_dev_; }
   int luma_error_threshold() const { return luma_error_threshold_; }
   int chroma_error_threshold() const { return chroma_error_threshold_; }
-  ArrayView<const double> sample_values() const { return sample_values_; }
+  std::span<const double> sample_values() const { return sample_values_; }
 
   bool SetSequenceIndex(int index);
   void set_droppable(bool droppable) { droppable_ = droppable; }
   bool SetStdDev(double std_dev);
   bool SetLumaErrorThreshold(int threshold);
   bool SetChromaErrorThreshold(int threshold);
-  bool SetSampleValues(ArrayView<const double> samples);
+  bool SetSampleValues(std::span<const double> samples);
   bool SetSampleValues(std::vector<double>&& samples);
 
   // Convenience methods..
diff --git a/api/video/corruption_detection/frame_instrumentation_data_reader.cc b/api/video/corruption_detection/frame_instrumentation_data_reader.cc
index 760fead..b025d25 100644
--- a/api/video/corruption_detection/frame_instrumentation_data_reader.cc
+++ b/api/video/corruption_detection/frame_instrumentation_data_reader.cc
@@ -11,8 +11,8 @@
 #include "api/video/corruption_detection/frame_instrumentation_data_reader.h"
 
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/transport/rtp/corruption_detection_message.h"
 #include "api/video/corruption_detection/frame_instrumentation_data.h"
 #include "rtc_base/logging.h"
@@ -45,7 +45,7 @@
   // The sequence index field of the message refers to the halton sequence index
   // for the first sample in the message. In order to figure out the next
   // expected sequence index we must increment it by the number of samples.
-  ArrayView<const double> sample_values = message.sample_values();
+  std::span<const double> sample_values = message.sample_values();
   last_seen_sequence_index_ = data.sequence_index() + sample_values.size();
 
   if (!sample_values.empty()) {
diff --git a/api/video/corruption_detection/frame_instrumentation_evaluation.cc b/api/video/corruption_detection/frame_instrumentation_evaluation.cc
index a3e271d..d1beb7c 100644
--- a/api/video/corruption_detection/frame_instrumentation_evaluation.cc
+++ b/api/video/corruption_detection/frame_instrumentation_evaluation.cc
@@ -12,9 +12,9 @@
 
 #include <cstddef>
 #include <memory>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/corruption_detection/frame_instrumentation_data.h"
 #include "api/video/video_content_type.h"
 #include "api/video/video_frame.h"
@@ -28,8 +28,8 @@
 namespace {
 
 std::vector<FilteredSample> ConvertSampleValuesToFilteredSamples(
-    ArrayView<const double> values,
-    ArrayView<const FilteredSample> samples) {
+    std::span<const double> values,
+    std::span<const FilteredSample> samples) {
   RTC_CHECK_EQ(values.size(), samples.size())
       << "values and samples must have the same size";
   std::vector<FilteredSample> filtered_samples;
diff --git a/api/video/frame_buffer.cc b/api/video/frame_buffer.cc
index 78426db..fcff81f 100644
--- a/api/video/frame_buffer.cc
+++ b/api/video/frame_buffer.cc
@@ -16,11 +16,11 @@
 #include <iterator>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 
 #include "absl/algorithm/container.h"
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/video/encoded_frame.h"
 #include "rtc_base/logging.h"
@@ -46,7 +46,7 @@
 // Since FrameBuffer::FrameInfo is private it can't be used in the function
 // signature, hence the FrameIteratorT type.
 template <typename FrameIteratorT>
-ArrayView<const int64_t> GetReferences(const FrameIteratorT& it) {
+std::span<const int64_t> GetReferences(const FrameIteratorT& it) {
   return {it->second.encoded_frame->references,
           std::min<size_t>(it->second.encoded_frame->num_references,
                            EncodedFrame::kMaxFrameReferences)};
diff --git a/api/video/rtp_video_frame_assembler.cc b/api/video/rtp_video_frame_assembler.cc
index e7bc37a..821e529 100644
--- a/api/video/rtp_video_frame_assembler.cc
+++ b/api/video/rtp_video_frame_assembler.cc
@@ -13,11 +13,11 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "api/rtp_packet_infos.h"
 #include "api/scoped_refptr.h"
 #include "api/transport/rtp/dependency_descriptor.h"
@@ -161,7 +161,7 @@
 RtpVideoFrameAssembler::Impl::AssembleFrames(
     video_coding::PacketBuffer::InsertResult insert_result) {
   video_coding::PacketBuffer::Packet* first_packet = nullptr;
-  std::vector<ArrayView<const uint8_t>> payloads;
+  std::vector<std::span<const uint8_t>> payloads;
   RtpFrameVector result;
 
   for (auto& packet : insert_result.packets) {
diff --git a/api/video/rtp_video_frame_assembler_unittests.cc b/api/video/rtp_video_frame_assembler_unittests.cc
index 826ae8a..e5c0dba 100644
--- a/api/video/rtp_video_frame_assembler_unittests.cc
+++ b/api/video/rtp_video_frame_assembler_unittests.cc
@@ -11,9 +11,9 @@
 #include <cstdint>
 #include <iterator>
 #include <memory>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/encoded_frame.h"
 #include "api/video/rtp_video_frame_assembler.h"
@@ -54,7 +54,7 @@
     return *this;
   }
 
-  PacketBuilder& WithPayload(ArrayView<const uint8_t> payload) {
+  PacketBuilder& WithPayload(std::span<const uint8_t> payload) {
     payload_.assign(payload.begin(), payload.end());
     return *this;
   }
@@ -131,11 +131,11 @@
             std::make_move_iterator(from.end()));
 }
 
-ArrayView<int64_t> References(const std::unique_ptr<EncodedFrame>& frame) {
-  return MakeArrayView(frame->references, frame->num_references);
+std::span<int64_t> References(const std::unique_ptr<EncodedFrame>& frame) {
+  return std::span(frame->references, frame->num_references);
 }
 
-ArrayView<const uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
+std::span<const uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
   return *frame->GetEncodedData();
 }
 
diff --git a/api/video/rtp_video_frame_h265_assembler_unittests.cc b/api/video/rtp_video_frame_h265_assembler_unittests.cc
index aff5c8a..db82307 100644
--- a/api/video/rtp_video_frame_h265_assembler_unittests.cc
+++ b/api/video/rtp_video_frame_h265_assembler_unittests.cc
@@ -11,10 +11,10 @@
 #include <cstdint>
 #include <iterator>
 #include <memory>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/encoded_frame.h"
 #include "api/video/rtp_video_frame_assembler.h"
 #include "api/video/video_frame_type.h"
@@ -44,7 +44,7 @@
     return *this;
   }
 
-  PacketBuilder& WithPayload(ArrayView<const uint8_t> payload) {
+  PacketBuilder& WithPayload(std::span<const uint8_t> payload) {
     payload_.assign(payload.begin(), payload.end());
     return *this;
   }
@@ -87,11 +87,11 @@
             std::make_move_iterator(from.end()));
 }
 
-ArrayView<int64_t> References(const std::unique_ptr<EncodedFrame>& frame) {
-  return MakeArrayView(frame->references, frame->num_references);
+std::span<int64_t> References(const std::unique_ptr<EncodedFrame>& frame) {
+  return std::span(frame->references, frame->num_references);
 }
 
-ArrayView<const uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
+std::span<const uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
   return *frame->GetEncodedData();
 }
 
diff --git a/api/video/video_frame_buffer.cc b/api/video/video_frame_buffer.cc
index 7b45658..131aa3e 100644
--- a/api/video/video_frame_buffer.cc
+++ b/api/video/video_frame_buffer.cc
@@ -11,9 +11,9 @@
 #include "api/video/video_frame_buffer.h"
 
 #include <cstddef>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "api/video/i420_buffer.h"
 #include "api/video/i422_buffer.h"
@@ -89,7 +89,7 @@
 }
 
 scoped_refptr<VideoFrameBuffer> VideoFrameBuffer::GetMappedFrameBuffer(
-    ArrayView<Type> /* types */) {
+    std::span<Type> /* types */) {
   RTC_CHECK(type() == Type::kNative);
   return nullptr;
 }
diff --git a/api/video/video_frame_buffer.h b/api/video/video_frame_buffer.h
index b160ab8..5545239 100644
--- a/api/video/video_frame_buffer.h
+++ b/api/video/video_frame_buffer.h
@@ -13,9 +13,9 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/ref_count.h"
 #include "api/scoped_refptr.h"
 #include "rtc_base/system/rtc_export.h"
@@ -129,7 +129,7 @@
   // frame type is not supported, mapping is not possible, or if the kNative
   // frame has not implemented this method. Only callable if type() is kNative.
   virtual scoped_refptr<VideoFrameBuffer> GetMappedFrameBuffer(
-      ArrayView<Type> types);
+      std::span<Type> types);
 
   // For logging: returns a textual representation of the storage.
   virtual std::string storage_representation() const;
diff --git a/api/video/video_frame_metadata.cc b/api/video/video_frame_metadata.cc
index f265fc3..4441b98 100644
--- a/api/video/video_frame_metadata.cc
+++ b/api/video/video_frame_metadata.cc
@@ -12,10 +12,10 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/video_codec_type.h"
 #include "api/video/video_content_type.h"
@@ -90,23 +90,23 @@
   temporal_index_ = temporal_index;
 }
 
-ArrayView<const int64_t> VideoFrameMetadata::GetFrameDependencies() const {
+std::span<const int64_t> VideoFrameMetadata::GetFrameDependencies() const {
   return frame_dependencies_;
 }
 
 void VideoFrameMetadata::SetFrameDependencies(
-    ArrayView<const int64_t> frame_dependencies) {
+    std::span<const int64_t> frame_dependencies) {
   frame_dependencies_.assign(frame_dependencies.begin(),
                              frame_dependencies.end());
 }
 
-ArrayView<const DecodeTargetIndication>
+std::span<const DecodeTargetIndication>
 VideoFrameMetadata::GetDecodeTargetIndications() const {
   return decode_target_indications_;
 }
 
 void VideoFrameMetadata::SetDecodeTargetIndications(
-    ArrayView<const DecodeTargetIndication> decode_target_indications) {
+    std::span<const DecodeTargetIndication> decode_target_indications) {
   decode_target_indications_.assign(decode_target_indications.begin(),
                                     decode_target_indications.end());
 }
diff --git a/api/video/video_frame_metadata.h b/api/video/video_frame_metadata.h
index 342d69b..1dfd1bb 100644
--- a/api/video/video_frame_metadata.h
+++ b/api/video/video_frame_metadata.h
@@ -13,11 +13,11 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <variant>
 #include <vector>
 
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/video_codec_type.h"
 #include "api/video/video_content_type.h"
@@ -67,12 +67,12 @@
   int GetTemporalIndex() const;
   void SetTemporalIndex(int temporal_index);
 
-  ArrayView<const int64_t> GetFrameDependencies() const;
-  void SetFrameDependencies(ArrayView<const int64_t> frame_dependencies);
+  std::span<const int64_t> GetFrameDependencies() const;
+  void SetFrameDependencies(std::span<const int64_t> frame_dependencies);
 
-  ArrayView<const DecodeTargetIndication> GetDecodeTargetIndications() const;
+  std::span<const DecodeTargetIndication> GetDecodeTargetIndications() const;
   void SetDecodeTargetIndications(
-      ArrayView<const DecodeTargetIndication> decode_target_indications);
+      std::span<const DecodeTargetIndication> decode_target_indications);
 
   bool GetIsLastFrameInPicture() const;
   void SetIsLastFrameInPicture(bool is_last_frame_in_picture);
diff --git a/api/video/video_timing.cc b/api/video/video_timing.cc
index a5b7f78..bc9ee80 100644
--- a/api/video/video_timing.cc
+++ b/api/video/video_timing.cc
@@ -14,7 +14,6 @@
 #include <cstdint>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/units/time_delta.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/safe_conversions.h"
diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn
index 2b16682..1ec3dff 100644
--- a/api/video_codecs/BUILD.gn
+++ b/api/video_codecs/BUILD.gn
@@ -81,7 +81,6 @@
     ":scalability_mode",
     "..:fec_controller_api",
     "..:scoped_refptr",
-    "../../api:array_view",
     "../../api:rtp_parameters",
     "../../media:media_constants",
     "../../modules/video_coding:codec_globals_headers",
@@ -122,7 +121,7 @@
 rtc_source_set("bitstream_parser_api") {
   visibility = [ "*" ]
   sources = [ "bitstream_parser.h" ]
-  deps = [ "..:array_view" ]
+  deps = []
 }
 
 rtc_library("builtin_video_decoder_factory") {
@@ -169,7 +168,6 @@
   deps = [
     ":scalability_mode",
     ":video_codecs_api",
-    "..:array_view",
     "../../modules/video_coding/svc:scalability_mode_util",
     "../environment",
     "//third_party/abseil-cpp/absl/algorithm:container",
@@ -240,7 +238,6 @@
 
   deps = [
     ":video_codecs_api",
-    "..:array_view",
     "../environment",
     "//third_party/abseil-cpp/absl/algorithm:container",
   ]
@@ -301,7 +298,6 @@
 
   deps = [
     ":video_encoding_general",
-    "..:array_view",
     "..:scoped_refptr",
     "../../api/units:data_rate",
     "../../api/units:data_size",
@@ -338,7 +334,6 @@
   deps = [
     ":video_encoder_factory_interface",
     ":video_encoder_interface",
-    "..:array_view",
     "..:scoped_refptr",
     "../../api/units:data_rate",
     "../../api/video_codecs:scalability_mode",
@@ -405,7 +400,6 @@
     ":video_encoder_factory_interface",
     ":video_encoder_interface",
     ":video_encoding_general",
-    "..:array_view",
     "..:scoped_refptr",
     "../../api/video:video_frame",
     "../../api/video_codecs:video_codecs_api",
diff --git a/api/video_codecs/bitstream_parser.h b/api/video_codecs/bitstream_parser.h
index a7dd998..85587c6 100644
--- a/api/video_codecs/bitstream_parser.h
+++ b/api/video_codecs/bitstream_parser.h
@@ -15,8 +15,7 @@
 #include <stdint.h>
 
 #include <optional>
-
-#include "api/array_view.h"
+#include <span>
 
 namespace webrtc {
 
@@ -26,7 +25,7 @@
   virtual ~BitstreamParser() = default;
 
   // Parse an additional chunk of the bitstream.
-  virtual void ParseBitstream(ArrayView<const uint8_t> bitstream) = 0;
+  virtual void ParseBitstream(std::span<const uint8_t> bitstream) = 0;
 
   // Get the last extracted QP value from the parsed bitstream. If no QP
   // value could be parsed, returns std::nullopt.
diff --git a/api/video_codecs/libaom_av1_encoder_factory_test.cc b/api/video_codecs/libaom_av1_encoder_factory_test.cc
index 27189fc..8d58b51 100644
--- a/api/video_codecs/libaom_av1_encoder_factory_test.cc
+++ b/api/video_codecs/libaom_av1_encoder_factory_test.cc
@@ -15,12 +15,12 @@
 #include <memory>
 #include <optional>
 #include <ostream>
+#include <span>
 #include <string>
 #include <utility>
 #include <variant>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
@@ -98,7 +98,7 @@
     return 0;
   }
 
-  VideoFrame Decode(ArrayView<uint8_t> bitstream_data) {
+  VideoFrame Decode(std::span<uint8_t> bitstream_data) {
     EncodedImage img;
     img.SetEncodedData(EncodedImageBuffer::Create(bitstream_data.data(),
                                                   bitstream_data.size()));
@@ -127,7 +127,7 @@
   FrameEncoderSettingsBuilder() {
     class IgnoredOutput : public VideoEncoderInterface::FrameOutput {
      public:
-      ArrayView<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
+      std::span<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
         unread_.resize(size.bytes());
         return unread_;
       }
@@ -203,9 +203,9 @@
  private:
   struct FrameOut : public VideoEncoderInterface::FrameOutput {
     explicit FrameOut(EncOut& e) : eo(e) {}
-    ArrayView<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
+    std::span<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
       eo.bitstream.resize(size.bytes());
-      return ArrayView<uint8_t>(eo.bitstream);
+      return std::span<uint8_t>(eo.bitstream);
     }
     void EncodeComplete(const EncodeResult& encode_result) override {
       eo.res = encode_result;
diff --git a/api/video_codecs/sdp_video_format.cc b/api/video_codecs/sdp_video_format.cc
index dcc966e..57cdbec 100644
--- a/api/video_codecs/sdp_video_format.cc
+++ b/api/video_codecs/sdp_video_format.cc
@@ -11,11 +11,11 @@
 #include "api/video_codecs/sdp_video_format.h"
 
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/container/inlined_vector.h"
 #include "absl/strings/match.h"
-#include "api/array_view.h"
 #include "api/rtp_parameters.h"
 #include "api/video/video_codec_type.h"
 #include "api/video_codecs/av1_profile.h"
@@ -172,7 +172,7 @@
 }
 
 bool SdpVideoFormat::IsCodecInList(
-    ArrayView<const SdpVideoFormat> formats) const {
+    std::span<const SdpVideoFormat> formats) const {
   for (const auto& format : formats) {
     if (IsSameCodec(format)) {
       return true;
@@ -245,7 +245,7 @@
 }
 
 std::optional<SdpVideoFormat> FuzzyMatchSdpVideoFormat(
-    ArrayView<const SdpVideoFormat> supported_formats,
+    std::span<const SdpVideoFormat> supported_formats,
     const SdpVideoFormat& format) {
   std::optional<SdpVideoFormat> res;
   int best_parameter_match = 0;
diff --git a/api/video_codecs/sdp_video_format.h b/api/video_codecs/sdp_video_format.h
index 494d1df..37f03aa 100644
--- a/api/video_codecs/sdp_video_format.h
+++ b/api/video_codecs/sdp_video_format.h
@@ -13,10 +13,10 @@
 
 #include <map>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "api/rtp_parameters.h"
 #include "api/video_codecs/scalability_mode.h"
 #include "rtc_base/system/rtc_export.h"
@@ -55,7 +55,7 @@
   // specific parameters. Please note that two SdpVideoFormats can represent the
   // same codec even though not all parameters are the same.
   bool IsSameCodec(const SdpVideoFormat& other) const;
-  bool IsCodecInList(ArrayView<const SdpVideoFormat> formats) const;
+  bool IsCodecInList(std::span<const SdpVideoFormat> formats) const;
 
   std::string ToString() const;
 
@@ -92,7 +92,7 @@
 // anymore. Until we stop misusing SdpVideoFormats provide this convenience
 // function to perform fuzzy matching.
 std::optional<SdpVideoFormat> FuzzyMatchSdpVideoFormat(
-    ArrayView<const SdpVideoFormat> supported_formats,
+    std::span<const SdpVideoFormat> supported_formats,
     const SdpVideoFormat& format);
 
 }  // namespace webrtc
diff --git a/api/video_codecs/simple_encoder_wrapper.cc b/api/video_codecs/simple_encoder_wrapper.cc
index 90fb4ce..cb5ddce 100644
--- a/api/video_codecs/simple_encoder_wrapper.cc
+++ b/api/video_codecs/simple_encoder_wrapper.cc
@@ -15,6 +15,7 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <variant>
@@ -22,7 +23,6 @@
 
 #include "absl/algorithm/container.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "api/units/data_size.h"
 #include "api/units/frequency.h"
@@ -192,7 +192,7 @@
     }
 
     struct FrameOut : public VideoEncoderInterface::FrameOutput {
-      ArrayView<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
+      std::span<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
         bitstream.resize(size.bytes());
         return bitstream;
       }
diff --git a/api/video_codecs/video_decoder_factory_template.h b/api/video_codecs/video_decoder_factory_template.h
index fba0cec..45eeb0f 100644
--- a/api/video_codecs/video_decoder_factory_template.h
+++ b/api/video_codecs/video_decoder_factory_template.h
@@ -12,11 +12,11 @@
 #define API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_TEMPLATE_H_
 
 #include <memory>
+#include <span>
 #include <type_traits>
 #include <vector>
 
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/video_codecs/sdp_video_format.h"
 #include "api/video_codecs/video_decoder.h"
@@ -53,7 +53,7 @@
 
  private:
   bool IsFormatInList(const SdpVideoFormat& format,
-                      ArrayView<const SdpVideoFormat> supported_formats) const {
+                      std::span<const SdpVideoFormat> supported_formats) const {
     return absl::c_any_of(
         supported_formats, [&](const SdpVideoFormat& supported_format) {
           return supported_format.name == format.name &&
diff --git a/api/video_codecs/video_encoder_factory_template.h b/api/video_codecs/video_encoder_factory_template.h
index f58a36e..938a73b 100644
--- a/api/video_codecs/video_encoder_factory_template.h
+++ b/api/video_codecs/video_encoder_factory_template.h
@@ -13,11 +13,11 @@
 
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/video_codecs/scalability_mode.h"
 #include "api/video_codecs/sdp_video_format.h"
@@ -76,7 +76,7 @@
 
  private:
   bool IsFormatInList(const SdpVideoFormat& format,
-                      ArrayView<const SdpVideoFormat> supported_formats) const {
+                      std::span<const SdpVideoFormat> supported_formats) const {
     return absl::c_any_of(
         supported_formats, [&](const SdpVideoFormat& supported_format) {
           return supported_format.name == format.name &&
diff --git a/api/video_codecs/video_encoder_interface.h b/api/video_codecs/video_encoder_interface.h
index 2e99d50..5a3cb77 100644
--- a/api/video_codecs/video_encoder_interface.h
+++ b/api/video_codecs/video_encoder_interface.h
@@ -14,10 +14,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <variant>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
@@ -43,7 +43,7 @@
 
   struct FrameOutput {
     virtual ~FrameOutput() = default;
-    virtual ArrayView<uint8_t> GetBitstreamOutputBuffer(DataSize size) = 0;
+    virtual std::span<uint8_t> GetBitstreamOutputBuffer(DataSize size) = 0;
     virtual void EncodeComplete(const EncodeResult& encode_result) = 0;
   };
 
diff --git a/api/voip/BUILD.gn b/api/voip/BUILD.gn
index b0ae871..0d3e7b7 100644
--- a/api/voip/BUILD.gn
+++ b/api/voip/BUILD.gn
@@ -20,7 +20,6 @@
     "voip_volume_control.h",
   ]
   deps = [
-    "..:array_view",
     "../audio_codecs:audio_codecs_api",
     "../neteq:neteq_api",
     "//third_party/abseil-cpp/absl/base:core_headers",
@@ -56,7 +55,6 @@
     sources = [ "test/mock_voip_engine.h" ]
     deps = [
       ":voip_api",
-      "..:array_view",
       "../../test:test_support",
       "../audio_codecs:audio_codecs_api",
     ]
diff --git a/api/voip/test/mock_voip_engine.h b/api/voip/test/mock_voip_engine.h
index 97006a5..779824e 100644
--- a/api/voip/test/mock_voip_engine.h
+++ b/api/voip/test/mock_voip_engine.h
@@ -14,8 +14,8 @@
 #include <cstdint>
 #include <map>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/voip/voip_base.h"
 #include "api/voip/voip_codec.h"
@@ -69,11 +69,11 @@
  public:
   MOCK_METHOD(VoipResult,
               ReceivedRTPPacket,
-              (ChannelId channel_id, ArrayView<const uint8_t> rtp_packet),
+              (ChannelId channel_id, std::span<const uint8_t> rtp_packet),
               (override));
   MOCK_METHOD(VoipResult,
               ReceivedRTCPPacket,
-              (ChannelId channel_id, ArrayView<const uint8_t> rtcp_packet),
+              (ChannelId channel_id, std::span<const uint8_t> rtcp_packet),
               (override));
 };
 
diff --git a/api/voip/voip_network.h b/api/voip/voip_network.h
index b239c7e..7760891 100644
--- a/api/voip/voip_network.h
+++ b/api/voip/voip_network.h
@@ -12,8 +12,8 @@
 #define API_VOIP_VOIP_NETWORK_H_
 
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/voip/voip_base.h"
 
 namespace webrtc {
@@ -28,7 +28,7 @@
   //  kOk - received RTP packet is processed.
   //  kInvalidArgument - `channel_id` is invalid.
   virtual VoipResult ReceivedRTPPacket(ChannelId channel_id,
-                                       ArrayView<const uint8_t> rtp_packet) = 0;
+                                       std::span<const uint8_t> rtp_packet) = 0;
 
   // The data received from the network including RTCP header is passed here.
   // Returns following VoipResult;
@@ -36,7 +36,7 @@
   //  kInvalidArgument - `channel_id` is invalid.
   virtual VoipResult ReceivedRTCPPacket(
       ChannelId channel_id,
-      ArrayView<const uint8_t> rtcp_packet) = 0;
+      std::span<const uint8_t> rtcp_packet) = 0;
 
  protected:
   virtual ~VoipNetwork() = default;
diff --git a/api/webrtc_sdp_unittest.cc b/api/webrtc_sdp_unittest.cc
index cc58f50..d121d8d 100644
--- a/api/webrtc_sdp_unittest.cc
+++ b/api/webrtc_sdp_unittest.cc
@@ -25,7 +25,6 @@
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_replace.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/candidate.h"
 #include "api/jsep.h"
 #include "api/media_types.h"