Replace ArrayView with std::span in modules/

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

Bug: webrtc:439801349
Change-Id: I55a4978c265a0b8b6e873db93bbbf2241bd3e066
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/460800
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@{#47285}
diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn
index d8e1e97..0aeff4e 100644
--- a/modules/audio_coding/BUILD.gn
+++ b/modules/audio_coding/BUILD.gn
@@ -39,7 +39,6 @@
     ":neteq",
     "..:module_api",
     "..:module_api_public",
-    "../../api:array_view",
     "../../api:function_view",
     "../../api/audio:audio_frame_api",
     "../../api/audio_codecs:audio_codecs_api",
@@ -70,7 +69,6 @@
     "codecs/legacy_encoded_audio_frame.h",
   ]
   deps = [
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../rtc_base:buffer",
     "../../rtc_base:checks",
@@ -85,7 +83,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../common_audio:common_audio_c",
     "../../rtc_base:buffer",
     "../../rtc_base:checks",
@@ -102,7 +99,6 @@
 
   deps = [
     ":webrtc_cng",
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/units:time_delta",
     "../../common_audio",
@@ -119,7 +115,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../api:bitrate_allocation",
     "../../api:field_trials_view",
     "../../api/audio_codecs:audio_codecs_api",
@@ -145,7 +140,6 @@
 
   deps = [
     ":legacy_encoded_audio_frame",
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/units:time_delta",
     "../../rtc_base:buffer",
@@ -175,7 +169,6 @@
 
   deps = [
     ":legacy_encoded_audio_frame",
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/audio_codecs/g722:audio_encoder_g722_config",
     "../../api/units:time_delta",
@@ -239,7 +232,6 @@
   deps = [
     ":g711",
     ":legacy_encoded_audio_frame",
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../rtc_base:buffer",
     "../../rtc_base:checks",
@@ -262,7 +254,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../rtc_base:buffer",
     "../../rtc_base:checks",
@@ -284,7 +275,6 @@
   deps = [
     ":audio_coding_opus_common",
     ":audio_network_adaptor",
-    "../../api:array_view",
     "../../api:bitrate_allocation",
     "../../api:field_trials_view",
     "../../api/audio_codecs:audio_codecs_api",
@@ -324,7 +314,6 @@
 
   deps = [
     ":audio_coding_opus_common",
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/audio_codecs/opus:audio_decoder_opus_config",
     "../../api/audio_codecs/opus:audio_encoder_opus_config",
@@ -355,7 +344,6 @@
   defines = audio_coding_defines
 
   deps = [
-    "../../api:array_view",
     "../../rtc_base:checks",
     "../../rtc_base:ignore_wundef",
   ]
@@ -423,7 +411,6 @@
       [ ":audio_network_adaptor_config" ]
 
   deps = [
-    "../../api:array_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/environment",
     "../../api/rtc_event_log",
@@ -520,7 +507,6 @@
     ":audio_coding_module_typedefs",
     ":webrtc_cng",
     "..:module_api_public",
-    "../../api:array_view",
     "../../api:field_trials_view",
     "../../api:rtp_headers",
     "../../api:rtp_packet_info",
@@ -577,7 +563,6 @@
 
   deps = [
     ":neteq",
-    "../../api:array_view",
     "../../api:field_trials",
     "../../api:field_trials_view",
     "../../api:neteq_simulator_api",
@@ -629,7 +614,6 @@
     ":neteq_tools",
     ":neteq_tools_minimal",
     ":pcm16b",
-    "../../api:array_view",
     "../../api:rtp_headers",
     "../../api/units:timestamp",
     "../../common_audio",
@@ -664,7 +648,6 @@
     ":neteq_input_audio_tools",
     ":neteq_tools_minimal",
     "..:module_api_public",
-    "../../api:array_view",
     "../../api:rtp_headers",
     "../../api:rtp_packet_info",
     "../../api/audio:audio_frame_api",
@@ -747,7 +730,6 @@
     ":neteq_tools_minimal",
     ":webrtc_opus_wrapper",
     "..:module_api",
-    "../../api:array_view",
     "../../api:rtp_headers",
     "../../api:rtp_parameters",
     "../../api/audio:audio_frame_api",
@@ -867,7 +849,6 @@
       ":audio_encoder_cng",
       ":pcm16b_c",
       ":red",
-      "../../api:array_view",
       "../../api:field_trials",
       "../../api:rtp_headers",
       "../../api:scoped_refptr",
@@ -945,7 +926,6 @@
       ":audio_coding",
       ":neteq_tools",
       ":neteq_tools_minimal",
-      "../../api:array_view",
       "../../api:scoped_refptr",
       "../../api/audio_codecs:audio_codecs_api",
       "../../api/audio_codecs:builtin_audio_decoder_factory",
@@ -1013,7 +993,6 @@
 
       deps = [
                ":neteq_input_audio_tools",
-               "../../api:array_view",
                "../../api/audio_codecs:audio_codecs_api",
                "../../api/audio_codecs/g722:audio_encoder_g722_config",
                "../../api/audio_codecs/opus:audio_encoder_opus",
@@ -1183,7 +1162,6 @@
         ":neteq_input_audio_tools",
         ":neteq_test_tools",
         ":neteq_tools_minimal",
-        "../../api:array_view",
         "../../api:rtp_headers",
         "../../api:scoped_refptr",
         "../../api/audio_codecs:audio_codecs_api",
@@ -1236,7 +1214,6 @@
       testonly = true
 
       deps = [
-        "../../api:array_view",
         "../../rtc_base:buffer",
         "../../rtc_base:checks",
         "../rtp_rtcp:rtp_rtcp_format",
@@ -1290,7 +1267,6 @@
         ":neteq_quality_test_support",
         ":neteq_tools",
         ":webrtc_opus",
-        "../../api:array_view",
         "../../api:rtp_parameters",
         "../../api/audio_codecs:audio_codecs_api",
         "../../rtc_base:buffer",
@@ -1326,7 +1302,6 @@
         ":g711",
         ":neteq",
         ":neteq_quality_test_support",
-        "../../api:array_view",
         "../../api/audio_codecs:audio_codecs_api",
         "../../rtc_base:buffer",
         "../../rtc_base:checks",
@@ -1347,7 +1322,6 @@
         ":neteq",
         ":neteq_quality_test_support",
         ":pcm16b",
-        "../../api:array_view",
         "../../api/audio_codecs:audio_codecs_api",
         "../../rtc_base:buffer",
         "../../rtc_base:checks",
@@ -1492,7 +1466,6 @@
         ":webrtc_opus",
         ":webrtc_opus_wrapper",
         "..:module_api_public",
-        "../../api:array_view",
         "../../api:bitrate_allocation",
         "../../api:field_trials",
         "../../api:field_trials_view",
diff --git a/modules/audio_coding/acm2/acm_remixing.cc b/modules/audio_coding/acm2/acm_remixing.cc
index 3ad9955..812929f 100644
--- a/modules/audio_coding/acm2/acm_remixing.cc
+++ b/modules/audio_coding/acm2/acm_remixing.cc
@@ -13,16 +13,16 @@
 #include <algorithm>
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/numerics/safe_conversions.h"
 
 namespace webrtc {
 
-void DownMixFrame(const AudioFrame& input, ArrayView<int16_t> output) {
+void DownMixFrame(const AudioFrame& input, std::span<int16_t> output) {
   RTC_DCHECK_EQ(input.num_channels_, 2);
   RTC_DCHECK_EQ(output.size(), input.samples_per_channel_);
 
diff --git a/modules/audio_coding/acm2/acm_remixing.h b/modules/audio_coding/acm2/acm_remixing.h
index 0ccb7c0..fc2d082 100644
--- a/modules/audio_coding/acm2/acm_remixing.h
+++ b/modules/audio_coding/acm2/acm_remixing.h
@@ -13,16 +13,16 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 
 namespace webrtc {
 
 // Stereo-to-mono downmixing. The length of the output must equal to the number
 // of samples per channel in the input.
-void DownMixFrame(const AudioFrame& input, ArrayView<int16_t> output);
+void DownMixFrame(const AudioFrame& input, std::span<int16_t> output);
 
 // Remixes the interleaved input frame to an interleaved output data vector. The
 // remixed data replaces the data in the output vector which is resized if
diff --git a/modules/audio_coding/acm2/audio_coding_module.cc b/modules/audio_coding/acm2/audio_coding_module.cc
index dfbfe18..784ceb0 100644
--- a/modules/audio_coding/acm2/audio_coding_module.cc
+++ b/modules/audio_coding/acm2/audio_coding_module.cc
@@ -15,11 +15,11 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/function_view.h"
@@ -262,7 +262,7 @@
   encode_buffer_.Clear();
   encoded_info = encoder_stack_->Encode(
       rtp_timestamp,
-      ArrayView<const int16_t>(
+      std::span<const int16_t>(
           input_data.audio,
           input_data.audio_channel * input_data.length_per_channel),
       &encode_buffer_);
diff --git a/modules/audio_coding/acm2/audio_coding_module_unittest.cc b/modules/audio_coding/acm2/audio_coding_module_unittest.cc
index f8285f8..cf9a385 100644
--- a/modules/audio_coding/acm2/audio_coding_module_unittest.cc
+++ b/modules/audio_coding/acm2/audio_coding_module_unittest.cc
@@ -18,12 +18,12 @@
 #include <cstring>
 #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/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
@@ -208,7 +208,7 @@
     const uint8_t kPayload[kPayloadSizeBytes] = {0};
     ASSERT_EQ(0, neteq_->InsertPacket(
                      rtp_header_,
-                     ArrayView<const uint8_t>(kPayload, kPayloadSizeBytes),
+                     std::span<const uint8_t>(kPayload, kPayloadSizeBytes),
                      /*receive_time=*/Timestamp::MinusInfinity()));
     rtp_utility_->Forward(&rtp_header_);
   }
@@ -577,7 +577,7 @@
     Buffer checksum_result =
         Buffer::CreateWithCapacity(payload_checksum_->Size());
     checksum_result.AppendData(
-        payload_checksum_->Size(), [&](ArrayView<uint8_t> checksum_view) {
+        payload_checksum_->Size(), [&](std::span<uint8_t> checksum_view) {
           payload_checksum_->Finish(checksum_view.data(), checksum_view.size());
           return checksum_view.size();
         });
@@ -1117,7 +1117,7 @@
       .Times(AtLeast(1))
       .WillRepeatedly(Invoke(
           &encoder, static_cast<AudioEncoder::EncodedInfo (AudioEncoder::*)(
-                        uint32_t, ArrayView<const int16_t>, Buffer*)>(
+                        uint32_t, std::span<const int16_t>, Buffer*)>(
                         &AudioEncoderPcmU::Encode)));
   ASSERT_TRUE(SetUpSender(kTestFileMono32kHz, 32000));
   ASSERT_NO_FATAL_FAILURE(
diff --git a/modules/audio_coding/audio_network_adaptor/controller_manager.cc b/modules/audio_coding/audio_network_adaptor/controller_manager.cc
index 87f771b..f5cae7d 100644
--- a/modules/audio_coding/audio_network_adaptor/controller_manager.cc
+++ b/modules/audio_coding/audio_network_adaptor/controller_manager.cc
@@ -18,12 +18,12 @@
 #include <memory>
 #include <optional>
 #include <set>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "modules/audio_coding/audio_network_adaptor/bitrate_controller.h"
 #include "modules/audio_coding/audio_network_adaptor/channel_controller.h"
@@ -88,7 +88,7 @@
 
 std::unique_ptr<FrameLengthController> CreateFrameLengthController(
     const audio_network_adaptor::config::FrameLengthController& config,
-    ArrayView<const int> encoder_frame_lengths_ms,
+    std::span<const int> encoder_frame_lengths_ms,
     int initial_frame_length_ms,
     int min_encoder_bitrate_bps) {
   RTC_CHECK(config.has_fl_increasing_packet_loss_fraction());
@@ -212,7 +212,7 @@
 
 std::unique_ptr<FrameLengthControllerV2> CreateFrameLengthControllerV2(
     const audio_network_adaptor::config::FrameLengthControllerV2& config,
-    ArrayView<const int> encoder_frame_lengths_ms) {
+    std::span<const int> encoder_frame_lengths_ms) {
   return std::make_unique<FrameLengthControllerV2>(
       encoder_frame_lengths_ms, config.min_payload_bitrate_bps(),
       config.use_slow_adaptation());
@@ -232,7 +232,7 @@
     const Environment& env,
     absl::string_view config_string,
     size_t num_encoder_channels,
-    ArrayView<const int> encoder_frame_lengths_ms,
+    std::span<const int> encoder_frame_lengths_ms,
     int min_encoder_bitrate_bps,
     size_t intial_channels_to_encode,
     int initial_frame_length_ms,
diff --git a/modules/audio_coding/audio_network_adaptor/controller_manager.h b/modules/audio_coding/audio_network_adaptor/controller_manager.h
index 318db0c..f85a583 100644
--- a/modules/audio_coding/audio_network_adaptor/controller_manager.h
+++ b/modules/audio_coding/audio_network_adaptor/controller_manager.h
@@ -16,11 +16,11 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "modules/audio_coding/audio_network_adaptor/controller.h"
 
@@ -55,7 +55,7 @@
       const Environment& env,
       absl::string_view config_string,
       size_t num_encoder_channels,
-      ArrayView<const int> encoder_frame_lengths_ms,
+      std::span<const int> encoder_frame_lengths_ms,
       int min_encoder_bitrate_bps,
       size_t intial_channels_to_encode,
       int initial_frame_length_ms,
diff --git a/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.cc b/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.cc
index bbb0a2d..bb033b2 100644
--- a/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.cc
+++ b/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.cc
@@ -10,8 +10,9 @@
 
 #include "modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.h"
 
+#include <span>
+
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
 #include "rtc_base/checks.h"
 
@@ -25,7 +26,7 @@
 }  // namespace
 
 FrameLengthControllerV2::FrameLengthControllerV2(
-    ArrayView<const int> encoder_frame_lengths_ms,
+    std::span<const int> encoder_frame_lengths_ms,
     int min_payload_bitrate_bps,
     bool use_slow_adaptation)
     : encoder_frame_lengths_ms_(encoder_frame_lengths_ms.begin(),
diff --git a/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.h b/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.h
index e8ff5ad..4ecfb0f 100644
--- a/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.h
+++ b/modules/audio_coding/audio_network_adaptor/frame_length_controller_v2.h
@@ -12,9 +12,9 @@
 #define MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FRAME_LENGTH_CONTROLLER_V2_H_
 
 #include <optional>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/audio_network_adaptor/controller.h"
 #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
 
@@ -22,7 +22,7 @@
 
 class FrameLengthControllerV2 final : public Controller {
  public:
-  FrameLengthControllerV2(ArrayView<const int> encoder_frame_lengths_ms,
+  FrameLengthControllerV2(std::span<const int> encoder_frame_lengths_ms,
                           int min_payload_bitrate_bps,
                           bool use_slow_adaptation);
 
diff --git a/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc b/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
index f1250a2..d651d78 100644
--- a/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
+++ b/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
@@ -14,10 +14,10 @@
 #include <cstdint>
 #include <limits>
 #include <memory>
+#include <span>
 #include <string>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/audio_codecs/audio_format.h"
@@ -83,7 +83,7 @@
                                               encoder->NumChannels() / 100);
     Buffer out;
     BufferT<int16_t> audio;
-    audio.SetData(num_samples, [](ArrayView<int16_t> audio) {
+    audio.SetData(num_samples, [](std::span<int16_t> audio) {
       for (size_t i = 0; i != audio.size(); ++i) {
         // Just put some numbers in there, ensure they're within range.
         audio[i] =
diff --git a/modules/audio_coding/codecs/cng/audio_encoder_cng.cc b/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
index fa7006f..384038c 100644
--- a/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
+++ b/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
@@ -14,10 +14,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/units/time_delta.h"
 #include "common_audio/vad/include/vad.h"
@@ -49,14 +49,14 @@
   size_t Max10MsFramesInAPacket() const override;
   int GetTargetBitrate() const override;
   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         ArrayView<const int16_t> audio,
+                         std::span<const int16_t> audio,
                          Buffer* encoded) override;
   void Reset() override;
   bool SetFec(bool enable) override;
   bool SetDtx(bool enable) override;
   bool SetApplication(Application application) override;
   void SetMaxPlaybackRate(int frequency_hz) override;
-  ArrayView<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders() override;
+  std::span<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders() override;
   void OnReceivedUplinkPacketLossFraction(
       float uplink_packet_loss_fraction) override;
   void OnReceivedUplinkBandwidth(int target_audio_bitrate_bps,
@@ -125,7 +125,7 @@
 
 AudioEncoder::EncodedInfo AudioEncoderCng::EncodeImpl(
     uint32_t rtp_timestamp,
-    ArrayView<const int16_t> audio,
+    std::span<const int16_t> audio,
     Buffer* encoded) {
   const size_t samples_per_10ms_frame = SamplesPer10msFrame();
   RTC_CHECK_EQ(speech_buffer_.size(),
@@ -216,9 +216,9 @@
   speech_encoder_->SetMaxPlaybackRate(frequency_hz);
 }
 
-ArrayView<std::unique_ptr<AudioEncoder>>
+std::span<std::unique_ptr<AudioEncoder>>
 AudioEncoderCng::ReclaimContainedEncoders() {
-  return ArrayView<std::unique_ptr<AudioEncoder>>(&speech_encoder_, 1);
+  return std::span<std::unique_ptr<AudioEncoder>>(&speech_encoder_, 1);
 }
 
 void AudioEncoderCng::OnReceivedUplinkPacketLossFraction(
@@ -253,7 +253,7 @@
     // that value, in which case we don't want to overwrite any value from
     // an earlier iteration.
     size_t encoded_bytes_tmp = cng_encoder_->Encode(
-        ArrayView<const int16_t>(&speech_buffer_[i * samples_per_10ms_frame],
+        std::span<const int16_t>(&speech_buffer_[i * samples_per_10ms_frame],
                                  samples_per_10ms_frame),
         force_sid, encoded);
 
@@ -279,7 +279,7 @@
   for (size_t i = 0; i < frames_to_encode; ++i) {
     info = speech_encoder_->Encode(
         rtp_timestamps_.front(),
-        ArrayView<const int16_t>(&speech_buffer_[i * samples_per_10ms_frame],
+        std::span<const int16_t>(&speech_buffer_[i * samples_per_10ms_frame],
                                  samples_per_10ms_frame),
         encoded);
     if (i + 1 == frames_to_encode) {
diff --git a/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc b/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc
index 720e236..81642e2 100644
--- a/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc
+++ b/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc
@@ -15,9 +15,9 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/units/time_delta.h"
 #include "common_audio/vad/include/vad.h"
@@ -98,7 +98,7 @@
   void Encode() {
     ASSERT_TRUE(cng_) << "Must call CreateCng() first.";
     encoded_info_ = cng_->Encode(
-        timestamp_, ArrayView<const int16_t>(audio_, num_audio_samples_10ms_),
+        timestamp_, std::span<const int16_t>(audio_, num_audio_samples_10ms_),
         &encoded_);
     timestamp_ += static_cast<uint32_t>(num_audio_samples_10ms_);
   }
diff --git a/modules/audio_coding/codecs/cng/cng_unittest.cc b/modules/audio_coding/codecs/cng/cng_unittest.cc
index 309e2b6..d6a1305 100644
--- a/modules/audio_coding/codecs/cng/cng_unittest.cc
+++ b/modules/audio_coding/codecs/cng/cng_unittest.cc
@@ -10,9 +10,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstdio>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/codecs/cng/webrtc_cng.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -66,11 +66,11 @@
   ComfortNoiseEncoder cng_encoder(sample_rate_hz, kSidNormalIntervalUpdate,
                                   quality);
   EXPECT_EQ(0U, cng_encoder.Encode(
-                    ArrayView<const int16_t>(speech_data_, num_samples_10ms),
+                    std::span<const int16_t>(speech_data_, num_samples_10ms),
                     kNoSid, &sid_data));
   EXPECT_EQ(static_cast<size_t>(quality + 1),
             cng_encoder.Encode(
-                ArrayView<const int16_t>(speech_data_, num_samples_10ms),
+                std::span<const int16_t>(speech_data_, num_samples_10ms),
                 kForceSid, &sid_data));
 }
 
@@ -100,7 +100,7 @@
   ComfortNoiseEncoder cng_encoder(8000, kSidNormalIntervalUpdate,
                                   kCNGNumParamsNormal);
   // Run encoder with too much data.
-  EXPECT_DEATH(cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 641),
+  EXPECT_DEATH(cng_encoder.Encode(std::span<const int16_t>(speech_data_, 641),
                                   kNoSid, &sid_data),
                "");
 }
@@ -137,7 +137,7 @@
 
   // Run normal Encode and UpdateSid.
   EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+            cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                kForceSid, &sid_data));
   cng_decoder.UpdateSid(sid_data);
 
@@ -146,14 +146,14 @@
   cng_decoder.Reset();
 
   // Expect 0 because of unstable parameters after switching length.
-  EXPECT_EQ(0U, cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+  EXPECT_EQ(0U, cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                    kForceSid, &sid_data));
   EXPECT_EQ(
       kCNGNumParamsHigh + 1,
-      cng_encoder.Encode(ArrayView<const int16_t>(speech_data_ + 160, 160),
+      cng_encoder.Encode(std::span<const int16_t>(speech_data_ + 160, 160),
                          kForceSid, &sid_data));
   cng_decoder.UpdateSid(
-      ArrayView<const uint8_t>(sid_data.data(), kCNGNumParamsNormal + 1));
+      std::span<const uint8_t>(sid_data.data(), kCNGNumParamsNormal + 1));
 }
 
 // Update SID parameters, with wrong parameters or without calling decode.
@@ -165,7 +165,7 @@
                                   kCNGNumParamsNormal);
   ComfortNoiseDecoder cng_decoder;
   EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+            cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                kForceSid, &sid_data));
 
   // First run with valid parameters, then with too many CNG parameters.
@@ -193,18 +193,18 @@
 
   // Normal Encode.
   EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+            cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                kForceSid, &sid_data));
 
   // Normal UpdateSid.
   cng_decoder.UpdateSid(sid_data);
 
   // Two normal Generate, one with new_period.
-  EXPECT_TRUE(cng_decoder.Generate(ArrayView<int16_t>(out_data, 640), 1));
-  EXPECT_TRUE(cng_decoder.Generate(ArrayView<int16_t>(out_data, 640), 0));
+  EXPECT_TRUE(cng_decoder.Generate(std::span<int16_t>(out_data, 640), 1));
+  EXPECT_TRUE(cng_decoder.Generate(std::span<int16_t>(out_data, 640), 0));
 
   // Call Genereate with too much data.
-  EXPECT_FALSE(cng_decoder.Generate(ArrayView<int16_t>(out_data, 641), 0));
+  EXPECT_FALSE(cng_decoder.Generate(std::span<int16_t>(out_data, 641), 0));
 }
 
 // Test automatic SID.
@@ -219,13 +219,13 @@
   // Normal Encode, 100 msec, where no SID data should be generated.
   for (int i = 0; i < 10; i++) {
     EXPECT_EQ(0U,
-              cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+              cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                  kNoSid, &sid_data));
   }
 
   // We have reached 100 msec, and SID data should be generated.
   EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+            cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                kNoSid, &sid_data));
 }
 
@@ -239,13 +239,13 @@
   ComfortNoiseDecoder cng_decoder;
 
   // First call will never generate SID, unless forced to.
-  EXPECT_EQ(0U, cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+  EXPECT_EQ(0U, cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                    kNoSid, &sid_data));
 
   // Normal Encode, 100 msec, SID data should be generated all the time.
   for (int i = 0; i < 10; i++) {
     EXPECT_EQ(kCNGNumParamsNormal + 1,
-              cng_encoder.Encode(ArrayView<const int16_t>(speech_data_, 160),
+              cng_encoder.Encode(std::span<const int16_t>(speech_data_, 160),
                                  kNoSid, &sid_data));
   }
 }
diff --git a/modules/audio_coding/codecs/cng/webrtc_cng.cc b/modules/audio_coding/codecs/cng/webrtc_cng.cc
index 5961cb0..f729bae 100644
--- a/modules/audio_coding/codecs/cng/webrtc_cng.cc
+++ b/modules/audio_coding/codecs/cng/webrtc_cng.cc
@@ -13,8 +13,8 @@
 #include <algorithm>
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "common_audio/signal_processing/include/signal_processing_library.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -75,7 +75,7 @@
   dec_used_scale_factor_ = 0;
 }
 
-void ComfortNoiseDecoder::UpdateSid(ArrayView<const uint8_t> sid) {
+void ComfortNoiseDecoder::UpdateSid(std::span<const uint8_t> sid) {
   int16_t refCs[WEBRTC_CNG_MAX_LPC_ORDER];
   int32_t targetEnergy;
   size_t length = sid.size();
@@ -112,7 +112,7 @@
   }
 }
 
-bool ComfortNoiseDecoder::Generate(ArrayView<int16_t> out_data,
+bool ComfortNoiseDecoder::Generate(std::span<int16_t> out_data,
                                    bool new_period) {
   int16_t excitation[kCngMaxOutsizeOrder];
   int16_t low[kCngMaxOutsizeOrder];
@@ -236,7 +236,7 @@
   enc_seed_ = 7777; /* For debugging only. */
 }
 
-size_t ComfortNoiseEncoder::Encode(ArrayView<const int16_t> speech,
+size_t ComfortNoiseEncoder::Encode(std::span<const int16_t> speech,
                                    bool force_sid,
                                    Buffer* output) {
   int16_t arCoefs[WEBRTC_CNG_MAX_LPC_ORDER + 1];
@@ -367,7 +367,7 @@
       index = 94;
 
     const size_t output_coefs = enc_nrOfCoefs_ + 1;
-    output->AppendData(output_coefs, [&](ArrayView<uint8_t> output) {
+    output->AppendData(output_coefs, [&](std::span<uint8_t> output) {
       output[0] = (uint8_t)index;
 
       /* Quantize coefficients with tweak for WebRtc implementation of
diff --git a/modules/audio_coding/codecs/cng/webrtc_cng.h b/modules/audio_coding/codecs/cng/webrtc_cng.h
index 738f60a..4a12612 100644
--- a/modules/audio_coding/codecs/cng/webrtc_cng.h
+++ b/modules/audio_coding/codecs/cng/webrtc_cng.h
@@ -14,8 +14,8 @@
 #include <stdint.h>
 
 #include <cstddef>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 
 #define WEBRTC_CNG_MAX_LPC_ORDER 12
@@ -34,7 +34,7 @@
 
   // Updates the CN state when a new SID packet arrives.
   // `sid` is a view of the SID packet without the headers.
-  void UpdateSid(ArrayView<const uint8_t> sid);
+  void UpdateSid(std::span<const uint8_t> sid);
 
   // Generates comfort noise.
   // `out_data` will be filled with samples - its size determines the number of
@@ -43,7 +43,7 @@
   // currently 640 bytes (equalling 10ms at 64kHz).
   // TODO(ossu): Specify better limits for the size of out_data. Either let it
   //             be unbounded or limit to 10ms in the current sample rate.
-  bool Generate(ArrayView<int16_t> out_data, bool new_period);
+  bool Generate(std::span<int16_t> out_data, bool new_period);
 
  private:
   uint32_t dec_seed_;
@@ -79,7 +79,7 @@
   // true, a SID frame is forced and the internal sid interval counter is reset.
   // Will fail if the input size is too large (> 640 samples, see
   // ComfortNoiseDecoder::Generate).
-  size_t Encode(ArrayView<const int16_t> speech,
+  size_t Encode(std::span<const int16_t> speech,
                 bool force_sid,
                 Buffer* output);
 
diff --git a/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc b/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
index 281be59..eaaa9b6 100644
--- a/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
+++ b/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
@@ -13,9 +13,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/units/time_delta.h"
 #include "modules/audio_coding/codecs/g711/g711_interface.h"
@@ -69,7 +69,7 @@
 
 AudioEncoder::EncodedInfo AudioEncoderPcm::EncodeImpl(
     uint32_t rtp_timestamp,
-    ArrayView<const int16_t> audio,
+    std::span<const int16_t> audio,
     Buffer* encoded) {
   if (speech_buffer_.empty()) {
     first_timestamp_in_buffer_ = rtp_timestamp;
@@ -83,7 +83,7 @@
   info.encoded_timestamp = first_timestamp_in_buffer_;
   info.payload_type = payload_type_;
   info.encoded_bytes = encoded->AppendData(
-      full_frame_samples_ * BytesPerSample(), [&](ArrayView<uint8_t> encoded) {
+      full_frame_samples_ * BytesPerSample(), [&](std::span<uint8_t> encoded) {
         return EncodeCall(&speech_buffer_[0], full_frame_samples_,
                           encoded.data());
       });
diff --git a/modules/audio_coding/codecs/g711/audio_encoder_pcm.h b/modules/audio_coding/codecs/g711/audio_encoder_pcm.h
index 0d56e58..1ba2e1f 100644
--- a/modules/audio_coding/codecs/g711/audio_encoder_pcm.h
+++ b/modules/audio_coding/codecs/g711/audio_encoder_pcm.h
@@ -14,10 +14,10 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/units/time_delta.h"
 #include "rtc_base/buffer.h"
@@ -54,7 +54,7 @@
   AudioEncoderPcm(const Config& config, int sample_rate_hz);
 
   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         ArrayView<const int16_t> audio,
+                         std::span<const int16_t> audio,
                          Buffer* encoded) override;
 
   virtual size_t EncodeCall(const int16_t* audio,
diff --git a/modules/audio_coding/codecs/g722/audio_encoder_g722.cc b/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
index 45ffeff..36c8440 100644
--- a/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
+++ b/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
@@ -13,9 +13,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/g722/audio_encoder_g722_config.h"
 #include "api/units/time_delta.h"
@@ -94,7 +94,7 @@
 
 AudioEncoder::EncodedInfo AudioEncoderG722Impl::EncodeImpl(
     uint32_t rtp_timestamp,
-    ArrayView<const int16_t> audio,
+    std::span<const int16_t> audio,
     Buffer* encoded) {
   if (num_10ms_frames_buffered_ == 0)
     first_timestamp_in_buffer_ = rtp_timestamp;
@@ -124,7 +124,7 @@
   const size_t bytes_to_encode = samples_per_channel / 2 * num_channels_;
   EncodedInfo info;
   info.encoded_bytes =
-      encoded->AppendData(bytes_to_encode, [&](ArrayView<uint8_t> encoded) {
+      encoded->AppendData(bytes_to_encode, [&](std::span<uint8_t> encoded) {
         // Interleave the encoded bytes of the different channels. Each separate
         // channel and the interleaved stream encodes two samples per byte, most
         // significant half first.
diff --git a/modules/audio_coding/codecs/g722/audio_encoder_g722.h b/modules/audio_coding/codecs/g722/audio_encoder_g722.h
index c794202..97e5cfa 100644
--- a/modules/audio_coding/codecs/g722/audio_encoder_g722.h
+++ b/modules/audio_coding/codecs/g722/audio_encoder_g722.h
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/g722/audio_encoder_g722_config.h"
 #include "api/units/time_delta.h"
@@ -47,7 +47,7 @@
 
  protected:
   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         ArrayView<const int16_t> audio,
+                         std::span<const int16_t> audio,
                          Buffer* encoded) override;
 
  private:
diff --git a/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc b/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc
index 8c914ca..cd26ef9 100644
--- a/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc
+++ b/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -37,7 +37,7 @@
 }
 
 std::optional<AudioDecoder::EncodedAudioFrame::DecodeResult>
-LegacyEncodedAudioFrame::Decode(ArrayView<int16_t> decoded) const {
+LegacyEncodedAudioFrame::Decode(std::span<int16_t> decoded) const {
   AudioDecoder::SpeechType speech_type = AudioDecoder::kSpeech;
   const int ret = decoder_->Decode(
       payload_.data(), payload_.size(), decoder_->SampleRateHz(),
diff --git a/modules/audio_coding/codecs/legacy_encoded_audio_frame.h b/modules/audio_coding/codecs/legacy_encoded_audio_frame.h
index 50349e0..e8353ba 100644
--- a/modules/audio_coding/codecs/legacy_encoded_audio_frame.h
+++ b/modules/audio_coding/codecs/legacy_encoded_audio_frame.h
@@ -15,9 +15,9 @@
 #include <stdint.h>
 
 #include <optional>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "rtc_base/buffer.h"
 
@@ -37,7 +37,7 @@
 
   size_t Duration() const override;
 
-  std::optional<DecodeResult> Decode(ArrayView<int16_t> decoded) const override;
+  std::optional<DecodeResult> Decode(std::span<int16_t> decoded) const override;
 
   // For testing:
   const Buffer& payload() const { return payload_; }
diff --git a/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc b/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc
index e6bd7cf..a9be6de 100644
--- a/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc
+++ b/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc
@@ -12,8 +12,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/numerics/safe_conversions.h"
@@ -133,7 +133,7 @@
     // sample was missed or repeated.
     const auto generate_payload = [](size_t num_bytes) {
       Buffer payload = Buffer::CreateWithCapacity(num_bytes);
-      payload.AppendData(num_bytes, [](ArrayView<uint8_t> payload_view) {
+      payload.AppendData(num_bytes, [](std::span<uint8_t> payload_view) {
         uint8_t value = 0;
         // Allow wrap-around of value in counter below.
         for (size_t i = 0; i != payload_view.size(); ++i, ++value) {
diff --git a/modules/audio_coding/codecs/opus/audio_coder_opus_common.h b/modules/audio_coding/codecs/opus/audio_coder_opus_common.h
index 011abfb..4d98cae 100644
--- a/modules/audio_coding/codecs/opus/audio_coder_opus_common.h
+++ b/modules/audio_coding/codecs/opus/audio_coder_opus_common.h
@@ -14,12 +14,12 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "rtc_base/buffer.h"
@@ -61,7 +61,7 @@
   bool IsDtxPacket() const override { return payload_.size() <= 2; }
 
   std::optional<DecodeResult> Decode(
-      ArrayView<int16_t> decoded) const override {
+      std::span<int16_t> decoded) const override {
     AudioDecoder::SpeechType speech_type = AudioDecoder::kSpeech;
     int ret;
     if (is_primary_payload_) {
diff --git a/modules/audio_coding/codecs/opus/audio_decoder_opus.cc b/modules/audio_coding/codecs/opus/audio_decoder_opus.cc
index c4fb057..203969f 100644
--- a/modules/audio_coding/codecs/opus/audio_decoder_opus.cc
+++ b/modules/audio_coding/codecs/opus/audio_decoder_opus.cc
@@ -13,10 +13,10 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/field_trials_view.h"
 #include "modules/audio_coding/codecs/opus/audio_coder_opus_common.h"
@@ -141,7 +141,7 @@
     return;
   }
   int plc_size = WebRtcOpus_PlcDuration(dec_state_) * channels_;
-  concealment_audio->AppendData(plc_size, [&](ArrayView<int16_t> decoded) {
+  concealment_audio->AppendData(plc_size, [&](std::span<int16_t> decoded) {
     int16_t temp_type = 1;
     int ret =
         WebRtcOpus_Decode(dec_state_, nullptr, 0, decoded.data(), &temp_type);
diff --git a/modules/audio_coding/codecs/opus/audio_decoder_opus_unittest.cc b/modules/audio_coding/codecs/opus/audio_decoder_opus_unittest.cc
index fb13f8a..b4d5df5 100644
--- a/modules/audio_coding/codecs/opus/audio_decoder_opus_unittest.cc
+++ b/modules/audio_coding/codecs/opus/audio_decoder_opus_unittest.cc
@@ -16,10 +16,10 @@
 #include <cstdint>
 #include <limits>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_encoder.h"
@@ -82,7 +82,7 @@
                                     std::numeric_limits<int16_t>::max())),
         random_generator_(42) {}
 
-  void GenerateNextFrame(ArrayView<int16_t> frame) {
+  void GenerateNextFrame(std::span<int16_t> frame) {
     for (size_t i = 0; i < frame.size(); ++i) {
       frame[i] = saturated_cast<int16_t>(
           random_generator_.Rand(-amplitude_, amplitude_));
@@ -94,7 +94,7 @@
   Random random_generator_;
 };
 
-bool IsZeroedFrame(ArrayView<const int16_t> audio) {
+bool IsZeroedFrame(std::span<const int16_t> audio) {
   for (const int16_t& v : audio) {
     if (v != 0)
       return false;
@@ -102,7 +102,7 @@
   return true;
 }
 
-bool IsTrivialStereo(ArrayView<const int16_t> audio) {
+bool IsTrivialStereo(std::span<const int16_t> audio) {
   const int num_samples = CheckedDivExact(audio.size(), static_cast<size_t>(2));
   for (int i = 0, j = 0; i < num_samples; ++i, j += 2) {
     if (audio[j] != audio[j + 1]) {
@@ -313,7 +313,7 @@
   ASSERT_EQ(speech_type, AudioDecoder::SpeechType::kComfortNoise);
   RTC_CHECK_GT(num_decoded_samples, 0);
   RTC_CHECK_LE(num_decoded_samples, decoded_frame.size());
-  ArrayView<const int16_t> decoded_view(decoded_frame.data(),
+  std::span<const int16_t> decoded_view(decoded_frame.data(),
                                         num_decoded_samples);
   // Make sure that comfort noise is not a muted frame.
   ASSERT_FALSE(IsZeroedFrame(decoded_view));
@@ -352,7 +352,7 @@
   decoder.GeneratePlc(/*requested_samples_per_channel=*/kIgnored,
                       &concealment_audio);
   RTC_CHECK_GT(concealment_audio.size(), 0);
-  ArrayView<const int16_t> decoded_view(concealment_audio.data(),
+  std::span<const int16_t> decoded_view(concealment_audio.data(),
                                         concealment_audio.size());
   // Make sure that packet loss concealment is not a muted frame.
   ASSERT_FALSE(IsZeroedFrame(decoded_view));
@@ -450,7 +450,7 @@
   ASSERT_EQ(speech_type, AudioDecoder::SpeechType::kComfortNoise);
   RTC_CHECK_GT(num_decoded_samples, 0);
   RTC_CHECK_LE(num_decoded_samples, decoded_frame.size());
-  ArrayView<const int16_t> decoded_view(decoded_frame.data(),
+  std::span<const int16_t> decoded_view(decoded_frame.data(),
                                         num_decoded_samples);
   // Make sure that comfort noise is not a muted frame.
   ASSERT_FALSE(IsZeroedFrame(decoded_view));
@@ -484,7 +484,7 @@
   decoder.GeneratePlc(/*requested_samples_per_channel=*/kIgnored,
                       &concealment_audio);
   RTC_CHECK_GT(concealment_audio.size(), 0);
-  ArrayView<const int16_t> decoded_view(concealment_audio.data(),
+  std::span<const int16_t> decoded_view(concealment_audio.data(),
                                         concealment_audio.size());
   // Make sure that packet loss concealment is not a muted frame.
   ASSERT_FALSE(IsZeroedFrame(decoded_view));
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.cc b/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.cc
index be55406..646cd9f 100644
--- a/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.cc
+++ b/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.cc
@@ -25,12 +25,12 @@
 #include <iterator>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/match.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_multi_channel_opus_config.h"
@@ -339,7 +339,7 @@
 
 AudioEncoder::EncodedInfo AudioEncoderMultiChannelOpusImpl::EncodeImpl(
     uint32_t rtp_timestamp,
-    ArrayView<const int16_t> audio,
+    std::span<const int16_t> audio,
     Buffer* encoded) {
   if (input_buffer_.empty())
     first_timestamp_in_buffer_ = rtp_timestamp;
@@ -355,7 +355,7 @@
   const size_t max_encoded_bytes = SufficientOutputBufferSize();
   EncodedInfo info;
   info.encoded_bytes =
-      encoded->AppendData(max_encoded_bytes, [&](ArrayView<uint8_t> encoded) {
+      encoded->AppendData(max_encoded_bytes, [&](std::span<uint8_t> encoded) {
         int status = WebRtcOpus_Encode(
             inst_, &input_buffer_[0],
             CheckedDivExact(input_buffer_.size(), config_.num_channels),
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.h b/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.h
index ccf05a8..b86fedc 100644
--- a/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.h
+++ b/modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.h
@@ -16,10 +16,10 @@
 
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_multi_channel_opus_config.h"
@@ -59,7 +59,7 @@
 
  protected:
   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         ArrayView<const int16_t> audio,
+                         std::span<const int16_t> audio,
                          Buffer* encoded) override;
 
  private:
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
index a8e1bff..451fe8b 100644
--- a/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ b/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
@@ -17,6 +17,7 @@
 #include <iterator>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
@@ -24,7 +25,6 @@
 #include "absl/memory/memory.h"
 #include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_opus_config.h"
@@ -583,7 +583,7 @@
 
 AudioEncoder::EncodedInfo AudioEncoderOpusImpl::EncodeImpl(
     uint32_t rtp_timestamp,
-    ArrayView<const int16_t> audio,
+    std::span<const int16_t> audio,
     Buffer* encoded) {
   MaybeUpdateUplinkBandwidth();
 
@@ -601,7 +601,7 @@
   const size_t max_encoded_bytes = SufficientOutputBufferSize();
   EncodedInfo info;
   info.encoded_bytes =
-      encoded->AppendData(max_encoded_bytes, [&](ArrayView<uint8_t> encoded) {
+      encoded->AppendData(max_encoded_bytes, [&](std::span<uint8_t> encoded) {
         int status = WebRtcOpus_Encode(
             inst_, &input_buffer_[0],
             CheckedDivExact(input_buffer_.size(), config_.num_channels),
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus.h b/modules/audio_coding/codecs/opus/audio_encoder_opus.h
index 5b873d9..6900e0e 100644
--- a/modules/audio_coding/codecs/opus/audio_encoder_opus.h
+++ b/modules/audio_coding/codecs/opus/audio_encoder_opus.h
@@ -16,11 +16,11 @@
 #include <functional>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_opus_config.h"
@@ -102,7 +102,7 @@
   ANAStats GetANAStats() const override;
   std::optional<std::pair<TimeDelta, TimeDelta> > GetFrameLengthRange()
       const override;
-  ArrayView<const int> supported_frame_lengths_ms() const {
+  std::span<const int> supported_frame_lengths_ms() const {
     return config_.supported_frame_lengths_ms;
   }
 
@@ -117,7 +117,7 @@
 
  protected:
   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         ArrayView<const int16_t> audio,
+                         std::span<const int16_t> audio,
                          Buffer* encoded) override;
 
  private:
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc b/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
index 1fcf7a7..f9ead46 100644
--- a/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
+++ b/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
@@ -14,12 +14,12 @@
 #include <cstdint>
 #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/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_opus_config.h"
@@ -512,7 +512,7 @@
       .WillOnce(Return(50000));
   EXPECT_CALL(*states->mock_audio_network_adaptor, SetUplinkBandwidth(50000));
   states->encoder->Encode(
-      0, ArrayView<const int16_t>(audio.data(), audio.size()), &encoded);
+      0, std::span<const int16_t>(audio.data(), audio.size()), &encoded);
 
   // Repeat update uplink bandwidth tests.
   for (int i = 0; i < 5; i++) {
@@ -520,7 +520,7 @@
     states->fake_clock->AdvanceTime(
         TimeDelta::Millis(states->uplink_bandwidth_update_interval_ms - 1));
     states->encoder->Encode(
-        0, ArrayView<const int16_t>(audio.data(), audio.size()), &encoded);
+        0, std::span<const int16_t>(audio.data(), audio.size()), &encoded);
 
     // Update when it is time to update.
     EXPECT_CALL(*states->mock_bitrate_smoother, GetAverage)
@@ -528,7 +528,7 @@
     EXPECT_CALL(*states->mock_audio_network_adaptor, SetUplinkBandwidth(40000));
     states->fake_clock->AdvanceTime(TimeDelta::Millis(1));
     states->encoder->Encode(
-        0, ArrayView<const int16_t>(audio.data(), audio.size()), &encoded);
+        0, std::span<const int16_t>(audio.data(), audio.size()), &encoded);
   }
 }
 
diff --git a/modules/audio_coding/codecs/opus/opus_unittest.cc b/modules/audio_coding/codecs/opus/opus_unittest.cc
index 3d86918..298049a 100644
--- a/modules/audio_coding/codecs/opus/opus_unittest.cc
+++ b/modules/audio_coding/codecs/opus/opus_unittest.cc
@@ -16,11 +16,11 @@
 #include <cstdlib>
 #include <map>
 #include <memory>
+#include <span>
 #include <string>
 #include <tuple>
 #include <vector>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/codecs/opus/opus_interface.h"
 #include "modules/audio_coding/neteq/tools/audio_loop.h"
 #include "rtc_base/checks.h"
@@ -131,7 +131,7 @@
   void PrepareSpeechData(int block_length_ms, int loop_length_ms);
 
   int EncodeDecode(WebRtcOpusEncInst* encoder,
-                   ArrayView<const int16_t> input_audio,
+                   std::span<const int16_t> input_audio,
                    WebRtcOpusDecInst* decoder,
                    int16_t* output_audio,
                    int16_t* audio_type);
@@ -217,7 +217,7 @@
 }
 
 int OpusTest::EncodeDecode(WebRtcOpusEncInst* encoder,
-                           ArrayView<const int16_t> input_audio,
+                           std::span<const int16_t> input_audio,
                            WebRtcOpusDecInst* decoder,
                            int16_t* output_audio,
                            int16_t* audio_type) {
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc b/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
index b77f891..b62d5f2 100644
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
+++ b/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
@@ -16,12 +16,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 "api/audio_codecs/audio_encoder.h"
 #include "api/call/bitrate_allocation.h"
 #include "api/field_trials_view.h"
@@ -106,7 +106,7 @@
 
 AudioEncoder::EncodedInfo AudioEncoderCopyRed::EncodeImpl(
     uint32_t rtp_timestamp,
-    ArrayView<const int16_t> audio,
+    std::span<const int16_t> audio,
     Buffer* encoded) {
   primary_encoded_.Clear();
   EncodedInfo info =
@@ -160,7 +160,7 @@
     const uint32_t timestamp_delta =
         info.encoded_timestamp - it->first.encoded_timestamp;
     encoded->data()[header_offset] = it->first.payload_type | 0x80;
-    SetBE16(ArrayView<uint8_t>(*encoded).subspan(header_offset + 1, 2),
+    SetBE16(std::span<uint8_t>(*encoded).subspan(header_offset + 1, 2),
             (timestamp_delta << 2) | (it->first.encoded_bytes >> 8));
     encoded->data()[header_offset + 3] = it->first.encoded_bytes & 0xff;
     header_offset += kRedHeaderLength;
@@ -282,9 +282,9 @@
   return speech_encoder_->GetANAStats();
 }
 
-ArrayView<std::unique_ptr<AudioEncoder>>
+std::span<std::unique_ptr<AudioEncoder>>
 AudioEncoderCopyRed::ReclaimContainedEncoders() {
-  return ArrayView<std::unique_ptr<AudioEncoder>>(&speech_encoder_, 1);
+  return std::span<std::unique_ptr<AudioEncoder>>(&speech_encoder_, 1);
 }
 
 }  // namespace webrtc
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red.h b/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
index 7d14780..070a242 100644
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
+++ b/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
@@ -17,10 +17,10 @@
 #include <list>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/call/bitrate_allocation.h"
 #include "api/field_trials_view.h"
@@ -81,11 +81,11 @@
   ANAStats GetANAStats() const override;
   std::optional<std::pair<TimeDelta, TimeDelta>> GetFrameLengthRange()
       const override;
-  ArrayView<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders() override;
+  std::span<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders() override;
 
  protected:
   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         ArrayView<const int16_t> audio,
+                         std::span<const int16_t> audio,
                          Buffer* encoded) override;
 
  private:
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc b/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc
index b1805f4..c7ac10f 100644
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc
+++ b/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc
@@ -15,11 +15,11 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/field_trials.h"
 #include "api/units/time_delta.h"
@@ -71,7 +71,7 @@
     ASSERT_TRUE(red_.get() != nullptr);
     encoded_.Clear();
     encoded_info_ = red_->Encode(
-        timestamp_, ArrayView<const int16_t>(audio_, num_audio_samples_10ms),
+        timestamp_, std::span<const int16_t>(audio_, num_audio_samples_10ms),
         &encoded_);
     timestamp_ += checked_cast<uint32_t>(num_audio_samples_10ms);
   }
diff --git a/modules/audio_coding/neteq/accelerate.cc b/modules/audio_coding/neteq/accelerate.cc
index eda4370..38bbdd6 100644
--- a/modules/audio_coding/neteq/accelerate.cc
+++ b/modules/audio_coding/neteq/accelerate.cc
@@ -12,8 +12,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/neteq/audio_multi_vector.h"
 #include "modules/audio_coding/neteq/time_stretch.h"
 #include "rtc_base/checks.h"
@@ -31,7 +31,7 @@
       input_length / num_channels_ < (2 * k15ms - 1) * fs_mult_) {
     // Length of input data too short to do accelerate. Simply move all data
     // from input to output.
-    output->PushBackInterleaved(ArrayView<const int16_t>(input, input_length));
+    output->PushBackInterleaved(std::span<const int16_t>(input, input_length));
     return kError;
   }
   return TimeStretch::Process(input, input_length, fast_accelerate, output,
@@ -74,15 +74,15 @@
     RTC_DCHECK_GE(fs_mult_120, peak_index);  // Should be handled in Process().
     // Copy first part; 0 to 15 ms.
     output->PushBackInterleaved(
-        ArrayView<const int16_t>(input, fs_mult_120 * num_channels_));
+        std::span<const int16_t>(input, fs_mult_120 * num_channels_));
     // Copy the `peak_index` starting at 15 ms to `temp_vector`.
     AudioMultiVector temp_vector(num_channels_);
-    temp_vector.PushBackInterleaved(ArrayView<const int16_t>(
+    temp_vector.PushBackInterleaved(std::span<const int16_t>(
         &input[fs_mult_120 * num_channels_], peak_index * num_channels_));
     // Cross-fade `temp_vector` onto the end of `output`.
     output->CrossFade(temp_vector, peak_index);
     // Copy the last unmodified part, 15 ms + pitch period until the end.
-    output->PushBackInterleaved(ArrayView<const int16_t>(
+    output->PushBackInterleaved(std::span<const int16_t>(
         &input[(fs_mult_120 + peak_index) * num_channels_],
         input_length - (fs_mult_120 + peak_index) * num_channels_));
 
@@ -93,7 +93,7 @@
     }
   } else {
     // Accelerate not allowed. Simply move all data from decoded to outData.
-    output->PushBackInterleaved(ArrayView<const int16_t>(input, input_length));
+    output->PushBackInterleaved(std::span<const int16_t>(input, input_length));
     return kNoStretch;
   }
 }
diff --git a/modules/audio_coding/neteq/audio_decoder_unittest.cc b/modules/audio_coding/neteq/audio_decoder_unittest.cc
index 34dd592..0503dda 100644
--- a/modules/audio_coding/neteq/audio_decoder_unittest.cc
+++ b/modules/audio_coding/neteq/audio_decoder_unittest.cc
@@ -15,11 +15,11 @@
 #include <cstdlib>
 #include <memory>
 #include <optional>
+#include <span>
 #include <tuple>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/g722/audio_encoder_g722_config.h"
 #include "api/audio_codecs/opus/audio_encoder_opus.h"
@@ -147,7 +147,7 @@
 
       encoded_info = audio_encoder_->Encode(
           0,
-          ArrayView<const int16_t>(interleaved_input.get(),
+          std::span<const int16_t>(interleaved_input.get(),
                                    audio_encoder_->NumChannels() *
                                        audio_encoder_->SampleRateHz() / 100),
           output);
@@ -191,7 +191,7 @@
           decoder_->ParsePayload(std::move(encoded), /*timestamp=*/0);
       RTC_CHECK_EQ(parse_result.size(), size_t{1});
       auto decode_result = parse_result[0].frame->Decode(
-          ArrayView<int16_t>(&decoded[processed_samples * channels_],
+          std::span<int16_t>(&decoded[processed_samples * channels_],
                              frame_size_ * channels_ * sizeof(int16_t)));
       RTC_CHECK(decode_result.has_value());
       EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
diff --git a/modules/audio_coding/neteq/audio_multi_vector.cc b/modules/audio_coding/neteq/audio_multi_vector.cc
index 6ba4bc3..d0d1ddc 100644
--- a/modules/audio_coding/neteq/audio_multi_vector.cc
+++ b/modules/audio_coding/neteq/audio_multi_vector.cc
@@ -14,9 +14,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "modules/audio_coding/neteq/audio_vector.h"
 #include "rtc_base/checks.h"
@@ -67,7 +67,7 @@
 }
 
 void AudioMultiVector::PushBackInterleaved(
-    ArrayView<const int16_t> append_this) {
+    std::span<const int16_t> append_this) {
   RTC_DCHECK_EQ(append_this.size() % Channels(), 0);
   if (append_this.empty()) {
     return;
diff --git a/modules/audio_coding/neteq/audio_multi_vector.h b/modules/audio_coding/neteq/audio_multi_vector.h
index 486c13a..12b8f94 100644
--- a/modules/audio_coding/neteq/audio_multi_vector.h
+++ b/modules/audio_coding/neteq/audio_multi_vector.h
@@ -15,9 +15,9 @@
 #include <string.h>
 
 #include <memory>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_view.h"
 #include "modules/audio_coding/neteq/audio_vector.h"
 
@@ -55,7 +55,7 @@
   // is assumed to be channel-interleaved. The length must be an even multiple
   // of this object's number of channels. The length of this object is increased
   // with the length of the array divided by the number of channels.
-  void PushBackInterleaved(ArrayView<const int16_t> append_this);
+  void PushBackInterleaved(std::span<const int16_t> append_this);
 
   // Appends the contents of AudioMultiVector `append_this` to this object. The
   // length of this object is increased with the length of `append_this`.
diff --git a/modules/audio_coding/neteq/background_noise.cc b/modules/audio_coding/neteq/background_noise.cc
index 8c5102c..ce3d343 100644
--- a/modules/audio_coding/neteq/background_noise.cc
+++ b/modules/audio_coding/neteq/background_noise.cc
@@ -13,8 +13,8 @@
 #include <algorithm>  // min, max
 #include <cstdint>
 #include <cstring>  // memcpy
+#include <span>
 
-#include "api/array_view.h"
 #include "common_audio/signal_processing/dot_product_with_scale.h"
 #include "common_audio/signal_processing/include/signal_processing_library.h"
 #include "common_audio/signal_processing/include/spl_inl.h"
@@ -119,7 +119,7 @@
 }
 
 void BackgroundNoise::GenerateBackgroundNoise(
-    ArrayView<const int16_t> random_vector,
+    std::span<const int16_t> random_vector,
     size_t channel,
     int /* mute_slope */,
     bool /* too_many_expands */,
@@ -194,7 +194,7 @@
 }
 
 void BackgroundNoise::SetFilterState(size_t channel,
-                                     ArrayView<const int16_t> input) {
+                                     std::span<const int16_t> input) {
   RTC_DCHECK_LT(channel, num_channels_);
   size_t length = std::min(input.size(), kMaxLpcOrder);
   memcpy(channel_parameters_[channel].filter_state, input.data(),
diff --git a/modules/audio_coding/neteq/background_noise.h b/modules/audio_coding/neteq/background_noise.h
index 1a506a1..00b7091 100644
--- a/modules/audio_coding/neteq/background_noise.h
+++ b/modules/audio_coding/neteq/background_noise.h
@@ -15,8 +15,7 @@
 
 #include <cstdint>
 #include <memory>
-
-#include "api/array_view.h"
+#include <span>
 
 namespace webrtc {
 
@@ -46,7 +45,7 @@
 
   // Generates background noise given a random vector and writes the output to
   // `buffer`.
-  void GenerateBackgroundNoise(ArrayView<const int16_t> random_vector,
+  void GenerateBackgroundNoise(std::span<const int16_t> random_vector,
                                size_t channel,
                                int mute_slope,
                                bool too_many_expands,
@@ -70,7 +69,7 @@
 
   // Copies `input` to the filter state. Will not copy more than `kMaxLpcOrder`
   // elements.
-  void SetFilterState(size_t channel, ArrayView<const int16_t> input);
+  void SetFilterState(size_t channel, std::span<const int16_t> input);
 
   // Returns `scale_` for `channel`.
   int16_t Scale(size_t channel) const;
diff --git a/modules/audio_coding/neteq/comfort_noise.cc b/modules/audio_coding/neteq/comfort_noise.cc
index da94881..1b57145 100644
--- a/modules/audio_coding/neteq/comfort_noise.cc
+++ b/modules/audio_coding/neteq/comfort_noise.cc
@@ -13,8 +13,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/codecs/cng/webrtc_cng.h"
 #include "modules/audio_coding/neteq/audio_multi_vector.h"
 #include "modules/audio_coding/neteq/audio_vector.h"
@@ -67,7 +67,7 @@
   }
 
   std::unique_ptr<int16_t[]> temp(new int16_t[number_of_samples]);
-  if (!cng_decoder->Generate(ArrayView<int16_t>(temp.get(), number_of_samples),
+  if (!cng_decoder->Generate(std::span<int16_t>(temp.get(), number_of_samples),
                              new_period)) {
     // Error returned.
     output->Zeros(requested_length);
diff --git a/modules/audio_coding/neteq/merge.cc b/modules/audio_coding/neteq/merge.cc
index 8abaff7..ac1f51d 100644
--- a/modules/audio_coding/neteq/merge.cc
+++ b/modules/audio_coding/neteq/merge.cc
@@ -15,8 +15,8 @@
 #include <cstring>  // memmove, memcpy, memset, size_t
 #include <limits>
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "common_audio/signal_processing/dot_product_with_scale.h"
 #include "common_audio/signal_processing/include/signal_processing_library.h"
 #include "common_audio/signal_processing/include/spl_inl.h"
@@ -66,7 +66,7 @@
   // Transfer input signal to an AudioMultiVector.
   AudioMultiVector input_vector(num_channels_);
   input_vector.PushBackInterleaved(
-      ArrayView<const int16_t>(input, input_length));
+      std::span<const int16_t>(input, input_length));
   size_t input_length_per_channel = input_vector.Size();
   RTC_DCHECK_EQ(input_length_per_channel, input_length / num_channels_);
 
diff --git a/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc b/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc
index 632d692..116892a 100644
--- a/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc
@@ -14,11 +14,11 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/make_ref_counted.h"
@@ -107,9 +107,9 @@
 // An input sample generator which generates only zero-samples.
 class ZeroSampleGenerator : public EncodeNetEqInput::Generator {
  public:
-  ArrayView<const int16_t> Generate(size_t num_samples) override {
+  std::span<const int16_t> Generate(size_t num_samples) override {
     vec.resize(num_samples, 0);
-    ArrayView<const int16_t> view(vec);
+    std::span<const int16_t> view(vec);
     RTC_DCHECK_EQ(view.size(), num_samples);
     return view;
   }
diff --git a/modules/audio_coding/neteq/neteq_impl.cc b/modules/audio_coding/neteq/neteq_impl.cc
index f0e9656..8142026 100644
--- a/modules/audio_coding/neteq/neteq_impl.cc
+++ b/modules/audio_coding/neteq/neteq_impl.cc
@@ -17,11 +17,11 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/str_cat.h"
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio/audio_view.h"
 #include "api/audio_codecs/audio_decoder.h"
@@ -180,7 +180,7 @@
 NetEqImpl::~NetEqImpl() = default;
 
 int NetEqImpl::InsertPacket(const RTPHeader& rtp_header,
-                            ArrayView<const uint8_t> payload,
+                            std::span<const uint8_t> payload,
                             const RtpPacketInfo& packet_info) {
   MsanCheckInitialized(payload);
   TRACE_EVENT0("webrtc", "NetEqImpl::InsertPacket");
@@ -1340,7 +1340,7 @@
                operation == Operation::kPreemptiveExpand);
 
     auto opt_result = packet_list->front().frame->Decode(
-        ArrayView<int16_t>(&decoded_buffer_[*decoded_length],
+        std::span<int16_t>(&decoded_buffer_[*decoded_length],
                            decoded_buffer_length_ - *decoded_length));
     if (packet_list->front().packet_info) {
       last_decoded_packet_infos_.push_back(*packet_list->front().packet_info);
diff --git a/modules/audio_coding/neteq/neteq_impl.h b/modules/audio_coding/neteq/neteq_impl.h
index c80ad4f..c02282a 100644
--- a/modules/audio_coding/neteq/neteq_impl.h
+++ b/modules/audio_coding/neteq/neteq_impl.h
@@ -16,9 +16,9 @@
 #include <map>
 #include <memory>
 #include <optional>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
@@ -130,7 +130,7 @@
   NetEqImpl& operator=(const NetEqImpl&) = delete;
 
   int InsertPacket(const RTPHeader& rtp_header,
-                   ArrayView<const uint8_t> payload) override {
+                   std::span<const uint8_t> payload) override {
     return InsertPacket(
         rtp_header, payload,
         RtpPacketInfo(rtp_header, /*receive_time=*/Timestamp::MinusInfinity()));
@@ -138,7 +138,7 @@
 
   // Inserts a new packet into NetEq. Returns 0 on success, -1 on failure.
   int InsertPacket(const RTPHeader& rtp_header,
-                   ArrayView<const uint8_t> payload,
+                   std::span<const uint8_t> payload,
                    const RtpPacketInfo& packet_info) override;
 
   int GetAudio(
diff --git a/modules/audio_coding/neteq/neteq_network_stats_unittest.cc b/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
index fb0d8e5..79e8df0 100644
--- a/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
@@ -13,10 +13,10 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
@@ -76,7 +76,7 @@
     size_t Duration() const override { return kPacketDuration; }
 
     std::optional<DecodeResult> Decode(
-        ArrayView<int16_t> decoded) const override {
+        std::span<int16_t> decoded) const override {
       const size_t output_size =
           sizeof(int16_t) * kPacketDuration * num_channels_;
       if (decoded.size() >= output_size) {
diff --git a/modules/audio_coding/neteq/neteq_stereo_unittest.cc b/modules/audio_coding/neteq/neteq_stereo_unittest.cc
index bdb0cfe..54c81b9 100644
--- a/modules/audio_coding/neteq/neteq_stereo_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_stereo_unittest.cc
@@ -17,9 +17,9 @@
 #include <list>
 #include <memory>
 #include <ostream>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
@@ -178,13 +178,13 @@
         ASSERT_EQ(NetEq::kOK,
                   neteq_mono_->InsertPacket(
                       rtp_header_mono_,
-                      ArrayView<const uint8_t>(encoded_, payload_size_bytes_),
+                      std::span<const uint8_t>(encoded_, payload_size_bytes_),
                       Timestamp::Millis(time_now_ms)));
         // Insert packet in multi-channel instance.
         ASSERT_EQ(NetEq::kOK,
                   neteq_->InsertPacket(
                       rtp_header_,
-                      ArrayView<const uint8_t>(encoded_multi_channel_,
+                      std::span<const uint8_t>(encoded_multi_channel_,
                                                multi_payload_size_bytes_),
                       Timestamp::Millis(time_now_ms)));
         // Get next input packets (mono and multi-channel).
diff --git a/modules/audio_coding/neteq/neteq_unittest.cc b/modules/audio_coding/neteq/neteq_unittest.cc
index 897532f..4a25d56 100644
--- a/modules/audio_coding/neteq/neteq_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_unittest.cc
@@ -18,11 +18,11 @@
 #include <memory>
 #include <optional>
 #include <set>
+#include <span>
 #include <string>
 #include <utility>
 
 #include "absl/flags/flag.h"
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/rtp_headers.h"
@@ -341,7 +341,7 @@
 
       ASSERT_EQ(0,
                 neteq_->InsertPacket(
-                    rtp_info, ArrayView<const uint8_t>(payload, enc_len_bytes),
+                    rtp_info, std::span<const uint8_t>(payload, enc_len_bytes),
                     clock_.CurrentTime()));
       output.Reset();
       ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
@@ -464,7 +464,7 @@
   PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
   // This is the first time this CNG packet is inserted.
   ASSERT_EQ(0, neteq_->InsertPacket(
-                   rtp_info, ArrayView<const uint8_t>(payload, payload_len),
+                   rtp_info, std::span<const uint8_t>(payload, payload_len),
                    clock_.CurrentTime()));
 
   // Pull audio once and make sure CNG is played.
@@ -479,7 +479,7 @@
   // Insert the same CNG packet again. Note that at this point it is old, since
   // we have already decoded the first copy of it.
   ASSERT_EQ(0, neteq_->InsertPacket(
-                   rtp_info, ArrayView<const uint8_t>(payload, payload_len),
+                   rtp_info, std::span<const uint8_t>(payload, payload_len),
                    clock_.CurrentTime()));
 
   // Pull audio until we have played `kCngPeriodMs` of CNG. Start at 10 ms since
@@ -532,7 +532,7 @@
   PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
   ASSERT_EQ(NetEq::kOK,
             neteq_->InsertPacket(rtp_info,
-                                 ArrayView<const uint8_t>(payload, payload_len),
+                                 std::span<const uint8_t>(payload, payload_len),
                                  clock_.CurrentTime()));
   ++seq_no;
   timestamp += kCngPeriodSamples;
@@ -585,7 +585,7 @@
     PopulateCng(0, rtp_timestamp, &rtp_info, payload, &payload_len);
     EXPECT_EQ(NetEq::kOK,
               neteq_->InsertPacket(
-                  rtp_info, ArrayView<const uint8_t>(payload, payload_len),
+                  rtp_info, std::span<const uint8_t>(payload, payload_len),
                   clock_.CurrentTime()));
   }
 
diff --git a/modules/audio_coding/neteq/normal.cc b/modules/audio_coding/neteq/normal.cc
index 909e955..117c480 100644
--- a/modules/audio_coding/neteq/normal.cc
+++ b/modules/audio_coding/neteq/normal.cc
@@ -14,8 +14,8 @@
 #include <cstdint>
 #include <cstring>  // memset, memcpy
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/neteq/neteq.h"
 #include "common_audio/signal_processing/dot_product_with_scale.h"
 #include "common_audio/signal_processing/include/signal_processing_library.h"
@@ -46,7 +46,7 @@
     output->Clear();
     return 0;
   }
-  output->PushBackInterleaved(ArrayView<const int16_t>(input, length));
+  output->PushBackInterleaved(std::span<const int16_t>(input, length));
 
   const int fs_mult = fs_hz_ / 8000;
   RTC_DCHECK_GT(fs_mult, 0);
diff --git a/modules/audio_coding/neteq/packet_buffer_unittest.cc b/modules/audio_coding/neteq/packet_buffer_unittest.cc
index 3e34602..5851e4a0 100644
--- a/modules/audio_coding/neteq/packet_buffer_unittest.cc
+++ b/modules/audio_coding/neteq/packet_buffer_unittest.cc
@@ -17,10 +17,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/neteq/tick_timer.h"
 #include "modules/audio_coding/neteq/mock/mock_decoder_database.h"
@@ -47,7 +47,7 @@
 
   MOCK_METHOD(std::optional<DecodeResult>,
               Decode,
-              (ArrayView<int16_t> decoded),
+              (std::span<int16_t> decoded),
               (const, override));
 };
 
diff --git a/modules/audio_coding/neteq/preemptive_expand.cc b/modules/audio_coding/neteq/preemptive_expand.cc
index a183c3d..1e3976e 100644
--- a/modules/audio_coding/neteq/preemptive_expand.cc
+++ b/modules/audio_coding/neteq/preemptive_expand.cc
@@ -13,8 +13,8 @@
 #include <algorithm>
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/neteq/audio_multi_vector.h"
 #include "modules/audio_coding/neteq/time_stretch.h"
 
@@ -35,7 +35,7 @@
       old_data_length >= input_length / num_channels_ - overlap_samples_) {
     // Length of input data too short to do preemptive expand. Simply move all
     // data from input to output.
-    output->PushBackInterleaved(ArrayView<const int16_t>(input, input_length));
+    output->PushBackInterleaved(std::span<const int16_t>(input, input_length));
     return kError;
   }
   const bool kFastMode = false;  // Fast mode is not available for PE Expand.
@@ -79,17 +79,17 @@
     size_t unmodified_length =
         std::max(old_data_length_per_channel_, fs_mult_120);
     // Copy first part, including cross-fade region.
-    output->PushBackInterleaved(ArrayView<const int16_t>(
+    output->PushBackInterleaved(std::span<const int16_t>(
         input, (unmodified_length + peak_index) * num_channels_));
     // Copy the last `peak_index` samples up to 15 ms to `temp_vector`.
     AudioMultiVector temp_vector(num_channels_);
-    temp_vector.PushBackInterleaved(ArrayView<const int16_t>(
+    temp_vector.PushBackInterleaved(std::span<const int16_t>(
         &input[(unmodified_length - peak_index) * num_channels_],
         peak_index * num_channels_));
     // Cross-fade `temp_vector` onto the end of `output`.
     output->CrossFade(temp_vector, peak_index);
     // Copy the last unmodified part, 15 ms + pitch period until the end.
-    output->PushBackInterleaved(ArrayView<const int16_t>(
+    output->PushBackInterleaved(std::span<const int16_t>(
         &input[unmodified_length * num_channels_],
         input_length - unmodified_length * num_channels_));
 
@@ -100,7 +100,7 @@
     }
   } else {
     // Accelerate not allowed. Simply move all data from decoded to outData.
-    output->PushBackInterleaved(ArrayView<const int16_t>(input, input_length));
+    output->PushBackInterleaved(std::span<const int16_t>(input, input_length));
     return kNoStretch;
   }
 }
diff --git a/modules/audio_coding/neteq/test/neteq_decoding_test.cc b/modules/audio_coding/neteq/test/neteq_decoding_test.cc
index f266081..45c3d6f 100644
--- a/modules/audio_coding/neteq/test/neteq_decoding_test.cc
+++ b/modules/audio_coding/neteq/test/neteq_decoding_test.cc
@@ -14,10 +14,10 @@
 #include <cstdint>
 #include <optional>
 #include <set>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
@@ -320,7 +320,7 @@
       RTPHeader rtp_info;
       PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
       ASSERT_EQ(0, neteq_->InsertPacket(
-                       rtp_info, ArrayView<const uint8_t>(payload, payload_len),
+                       rtp_info, std::span<const uint8_t>(payload, payload_len),
                        Timestamp::Millis(t_ms)));
       ++seq_no;
       timestamp += kCngPeriodSamples;
@@ -363,7 +363,7 @@
       RTPHeader rtp_info;
       PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
       ASSERT_EQ(0, neteq_->InsertPacket(
-                       rtp_info, ArrayView<const uint8_t>(payload, payload_len),
+                       rtp_info, std::span<const uint8_t>(payload, payload_len),
                        Timestamp::Millis(t_ms)));
       ++seq_no;
       timestamp += kCngPeriodSamples;
diff --git a/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc b/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc
index ecf1a21..e1c7e41 100644
--- a/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc
+++ b/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc
@@ -11,9 +11,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <ostream>
+#include <span>
 
 #include "absl/flags/flag.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/rtp_parameters.h"
 #include "modules/audio_coding/codecs/opus/opus_inst.h"
@@ -161,7 +161,7 @@
   int value;
   opus_repacketizer_init(repacketizer_);
   for (int idx = 0; idx < sub_packets_; idx++) {
-    payload->AppendData(max_bytes, [&](ArrayView<uint8_t> payload) {
+    payload->AppendData(max_bytes, [&](std::span<uint8_t> payload) {
       value = WebRtcOpus_Encode(opus_encoder_, pointer, sub_block_size_samples_,
                                 max_bytes, payload.data());
 
diff --git a/modules/audio_coding/neteq/test/neteq_pcm16b_quality_test.cc b/modules/audio_coding/neteq/test/neteq_pcm16b_quality_test.cc
index d1f6cf7..b709139 100644
--- a/modules/audio_coding/neteq/test/neteq_pcm16b_quality_test.cc
+++ b/modules/audio_coding/neteq/test/neteq_pcm16b_quality_test.cc
@@ -11,9 +11,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
 #include "absl/flags/flag.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
@@ -67,7 +67,7 @@
     AudioEncoder::EncodedInfo info;
     do {
       info = encoder_->Encode(dummy_timestamp,
-                              ArrayView<const int16_t>(
+                              std::span<const int16_t>(
                                   in_data + encoded_samples, kFrameSizeSamples),
                               payload);
       encoded_samples += kFrameSizeSamples;
diff --git a/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc b/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc
index a4a624d..b060a92 100644
--- a/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc
+++ b/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc
@@ -11,9 +11,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
 #include "absl/flags/flag.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
@@ -66,7 +66,7 @@
     AudioEncoder::EncodedInfo info;
     do {
       info = encoder_->Encode(dummy_timestamp,
-                              ArrayView<const int16_t>(
+                              std::span<const int16_t>(
                                   in_data + encoded_samples, kFrameSizeSamples),
                               payload);
       encoded_samples += kFrameSizeSamples;
diff --git a/modules/audio_coding/neteq/tools/audio_checksum.h b/modules/audio_coding/neteq/tools/audio_checksum.h
index b7ce149..de1c439 100644
--- a/modules/audio_coding/neteq/tools/audio_checksum.h
+++ b/modules/audio_coding/neteq/tools/audio_checksum.h
@@ -14,9 +14,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "modules/audio_coding/neteq/tools/audio_sink.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/message_digest.h"
@@ -52,7 +52,7 @@
     if (!finished_) {
       finished_ = true;
       checksum_result_.AppendData(checksum_->Size(),
-                                  [&](ArrayView<uint8_t> view) {
+                                  [&](std::span<uint8_t> view) {
                                     checksum_->Finish(view.data(), view.size());
                                     return view.size();
                                   });
diff --git a/modules/audio_coding/neteq/tools/audio_loop.cc b/modules/audio_coding/neteq/tools/audio_loop.cc
index ba67a66..a7353b3 100644
--- a/modules/audio_coding/neteq/tools/audio_loop.cc
+++ b/modules/audio_coding/neteq/tools/audio_loop.cc
@@ -13,10 +13,10 @@
 #include <cstdint>
 #include <cstdio>
 #include <cstring>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 
 namespace webrtc {
 namespace test {
@@ -50,14 +50,14 @@
   return true;
 }
 
-ArrayView<const int16_t> AudioLoop::GetNextBlock() {
+std::span<const int16_t> AudioLoop::GetNextBlock() {
   // Check that the AudioLoop is initialized.
   if (block_length_samples_ == 0)
-    return ArrayView<const int16_t>();
+    return std::span<const int16_t>();
 
   const int16_t* output_ptr = &audio_array_[next_index_];
   next_index_ = (next_index_ + block_length_samples_) % loop_length_samples_;
-  return ArrayView<const int16_t>(output_ptr, block_length_samples_);
+  return std::span<const int16_t>(output_ptr, block_length_samples_);
 }
 
 }  // namespace test
diff --git a/modules/audio_coding/neteq/tools/audio_loop.h b/modules/audio_coding/neteq/tools/audio_loop.h
index d5c561d..b00d50a 100644
--- a/modules/audio_coding/neteq/tools/audio_loop.h
+++ b/modules/audio_coding/neteq/tools/audio_loop.h
@@ -14,9 +14,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 
 namespace webrtc {
 namespace test {
@@ -44,7 +44,7 @@
 
   // Returns a (pointer,size) pair for the next block of audio. The size is
   // equal to the `block_length_samples` Init() argument.
-  ArrayView<const int16_t> GetNextBlock();
+  std::span<const int16_t> GetNextBlock();
 
  private:
   size_t next_index_;
diff --git a/modules/audio_coding/neteq/tools/encode_neteq_input.h b/modules/audio_coding/neteq/tools/encode_neteq_input.h
index 66927d2..d9b1cd3 100644
--- a/modules/audio_coding/neteq/tools/encode_neteq_input.h
+++ b/modules/audio_coding/neteq/tools/encode_neteq_input.h
@@ -15,8 +15,8 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "modules/audio_coding/neteq/tools/neteq_input.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
@@ -33,7 +33,7 @@
    public:
     virtual ~Generator() = default;
     // Returns the next num_samples values from the signal generator.
-    virtual ArrayView<const int16_t> Generate(size_t num_samples) = 0;
+    virtual std::span<const int16_t> Generate(size_t num_samples) = 0;
   };
 
   // The source will end after the given input duration.
diff --git a/modules/audio_coding/neteq/tools/fake_decode_from_file.cc b/modules/audio_coding/neteq/tools/fake_decode_from_file.cc
index c2a9c77..e94c459 100644
--- a/modules/audio_coding/neteq/tools/fake_decode_from_file.cc
+++ b/modules/audio_coding/neteq/tools/fake_decode_from_file.cc
@@ -15,9 +15,9 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "modules/audio_coding/neteq/tools/input_audio_file.h"
 #include "modules/rtp_rtcp/source/byte_io.h"
@@ -44,7 +44,7 @@
   size_t Duration() const override { return duration_; }
 
   std::optional<DecodeResult> Decode(
-      ArrayView<int16_t> decoded) const override {
+      std::span<int16_t> decoded) const override {
     if (is_dtx_) {
       std::fill_n(decoded.data(), duration_, 0);
       return DecodeResult{.num_decoded_samples = duration_,
@@ -105,7 +105,7 @@
 void FakeDecodeFromFile::PrepareEncoded(uint32_t timestamp,
                                         size_t samples,
                                         size_t original_payload_size_bytes,
-                                        ArrayView<uint8_t> encoded) {
+                                        std::span<uint8_t> encoded) {
   RTC_CHECK_GE(encoded.size(), 12);
   ByteWriter<uint32_t>::WriteLittleEndian(&encoded[0], timestamp);
   ByteWriter<uint32_t>::WriteLittleEndian(&encoded[4],
diff --git a/modules/audio_coding/neteq/tools/fake_decode_from_file.h b/modules/audio_coding/neteq/tools/fake_decode_from_file.h
index 39e4a5e..01c73c4 100644
--- a/modules/audio_coding/neteq/tools/fake_decode_from_file.h
+++ b/modules/audio_coding/neteq/tools/fake_decode_from_file.h
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "modules/audio_coding/neteq/tools/input_audio_file.h"
 #include "rtc_base/buffer.h"
@@ -68,7 +68,7 @@
   static void PrepareEncoded(uint32_t timestamp,
                              size_t samples,
                              size_t original_payload_size_bytes,
-                             ArrayView<uint8_t> encoded);
+                             std::span<uint8_t> encoded);
 
  private:
   std::unique_ptr<InputAudioFile> input_;
diff --git a/modules/audio_coding/neteq/tools/neteq_event_log_input.cc b/modules/audio_coding/neteq/tools/neteq_event_log_input.cc
index 66494d5..f7834c6 100644
--- a/modules/audio_coding/neteq/tools/neteq_event_log_input.cc
+++ b/modules/audio_coding/neteq/tools/neteq_event_log_input.cc
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/rtp_headers.h"
 #include "logging/rtc_event_log/events/logged_rtp_rtcp.h"
 #include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
@@ -130,7 +130,7 @@
     packet_data->SetTimestamp(logged.header.timestamp);
     packet_data->SetSsrc(logged.header.ssrc);
     packet_data->SetCsrcs(
-        MakeArrayView(logged.header.arrOfCSRCs, logged.header.numCSRCs));
+        std::span(logged.header.arrOfCSRCs, logged.header.numCSRCs));
     packet_data->set_arrival_time(logged.log_time());
 
     // This is a header-only "dummy" packet. Set the payload to all zeros, with
diff --git a/modules/audio_coding/neteq/tools/neteq_quality_test.cc b/modules/audio_coding/neteq/tools/neteq_quality_test.cc
index 68e4fac..666d2e9 100644
--- a/modules/audio_coding/neteq/tools/neteq_quality_test.cc
+++ b/modules/audio_coding/neteq/tools/neteq_quality_test.cc
@@ -21,6 +21,7 @@
 #include <memory>
 #include <ostream>
 #include <set>
+#include <span>
 #include <sstream>
 #include <string>
 #include <utility>
@@ -28,7 +29,6 @@
 
 #include "absl/flags/flag.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/environment/environment_factory.h"
@@ -434,7 +434,7 @@
     if (!PacketLost()) {
       int ret = neteq_->InsertPacket(
           rtp_header_,
-          ArrayView<const uint8_t>(payload_.data(), payload_size_bytes_),
+          std::span<const uint8_t>(payload_.data(), payload_size_bytes_),
           Timestamp::Millis(packet_input_time_ms));
       if (ret != NetEq::kOK)
         return -1;
diff --git a/modules/audio_coding/neteq/tools/neteq_test.cc b/modules/audio_coding/neteq/tools/neteq_test.cc
index bab757f..adf8820 100644
--- a/modules/audio_coding/neteq/tools/neteq_test.cc
+++ b/modules/audio_coding/neteq/tools/neteq_test.cc
@@ -19,7 +19,6 @@
 #include <optional>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_format.h"
diff --git a/modules/audio_coding/neteq/tools/rtp_jitter.cc b/modules/audio_coding/neteq/tools/rtp_jitter.cc
index acf2744..03b346c 100644
--- a/modules/audio_coding/neteq/tools/rtp_jitter.cc
+++ b/modules/audio_coding/neteq/tools/rtp_jitter.cc
@@ -13,11 +13,11 @@
 #include <cstdio>
 #include <fstream>
 #include <iostream>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "modules/rtp_rtcp/source/byte_io.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/checks.h"
@@ -32,7 +32,7 @@
 Buffer ReadNextPacket(FILE* file) {
   // Read the rtpdump header for the next packet.
   Buffer buffer;
-  buffer.SetData(kRtpDumpHeaderLength, [&](ArrayView<uint8_t> x) {
+  buffer.SetData(kRtpDumpHeaderLength, [&](std::span<uint8_t> x) {
     return fread(x.data(), 1, x.size(), file);
   });
   if (buffer.size() != kRtpDumpHeaderLength) {
@@ -45,7 +45,7 @@
   RTC_CHECK_GE(len, kRtpDumpHeaderLength);
 
   // Read remaining data from file directly into buffer.
-  buffer.AppendData(len - kRtpDumpHeaderLength, [&](ArrayView<uint8_t> x) {
+  buffer.AppendData(len - kRtpDumpHeaderLength, [&](std::span<uint8_t> x) {
     return fread(x.data(), 1, x.size(), file);
   });
   if (buffer.size() != len) {
diff --git a/modules/audio_coding/test/Channel.cc b/modules/audio_coding/test/Channel.cc
index 5d3c219..e2ebb90 100644
--- a/modules/audio_coding/test/Channel.cc
+++ b/modules/audio_coding/test/Channel.cc
@@ -14,8 +14,8 @@
 #include <cstdint>
 #include <cstdio>
 #include <cstring>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/neteq/neteq.h"
 #include "api/rtp_headers.h"
 #include "api/units/timestamp.h"
@@ -92,7 +92,7 @@
   }
 
   status = _neteq->InsertPacket(
-      rtp_header, ArrayView<const uint8_t>(_payloadData, payloadDataSize),
+      rtp_header, std::span<const uint8_t>(_payloadData, payloadDataSize),
       /*receive_time=*/Timestamp::MinusInfinity());
 
   return status;
diff --git a/modules/audio_coding/test/EncodeDecodeTest.cc b/modules/audio_coding/test/EncodeDecodeTest.cc
index 848e833..e61d584 100644
--- a/modules/audio_coding/test/EncodeDecodeTest.cc
+++ b/modules/audio_coding/test/EncodeDecodeTest.cc
@@ -15,10 +15,10 @@
 #include <cstdlib>
 #include <map>
 #include <memory>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
@@ -182,7 +182,7 @@
 
     EXPECT_GE(
         0, _neteq->InsertPacket(_rtpHeader,
-                                ArrayView<const uint8_t>(_incomingPayload,
+                                std::span<const uint8_t>(_incomingPayload,
                                                          _realPayloadSizeBytes),
                                 /*receive_time=*/Timestamp::Millis(_nextTime)));
     _realPayloadSizeBytes = _rtpStream->Read(&_rtpHeader, _incomingPayload,
diff --git a/modules/audio_coding/test/PacketLossTest.cc b/modules/audio_coding/test/PacketLossTest.cc
index 59b5309..129eebe 100644
--- a/modules/audio_coding/test/PacketLossTest.cc
+++ b/modules/audio_coding/test/PacketLossTest.cc
@@ -12,10 +12,10 @@
 
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
@@ -73,7 +73,7 @@
     if (!PacketLost()) {
       _neteq->InsertPacket(
           _rtpHeader,
-          ArrayView<const uint8_t>(_incomingPayload, _realPayloadSizeBytes),
+          std::span<const uint8_t>(_incomingPayload, _realPayloadSizeBytes),
           Timestamp::Millis(_nextTime));
     }
     packet_counter_++;
diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc
index e45f1fd..689c258 100644
--- a/modules/audio_coding/test/TestAllCodecs.cc
+++ b/modules/audio_coding/test/TestAllCodecs.cc
@@ -14,11 +14,11 @@
 #include <cstdio>
 #include <cstring>
 #include <limits>
+#include <span>
 #include <string>
 
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
-#include "api/array_view.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
@@ -93,7 +93,7 @@
   memcpy(payload_data_, payload_data, payload_size);
 
   status = neteq_->InsertPacket(
-      rtp_header, ArrayView<const uint8_t>(payload_data_, payload_size),
+      rtp_header, std::span<const uint8_t>(payload_data_, payload_size),
       /*receive_time=*/Timestamp::MinusInfinity());
 
   payload_size_ = payload_size;
diff --git a/modules/audio_coding/test/TestStereo.cc b/modules/audio_coding/test/TestStereo.cc
index 78b0d8c..f0913f7 100644
--- a/modules/audio_coding/test/TestStereo.cc
+++ b/modules/audio_coding/test/TestStereo.cc
@@ -14,12 +14,12 @@
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <span>
 #include <string>
 #include <utility>
 
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
@@ -78,7 +78,7 @@
 
   if (lost_packet_ == false) {
     status = neteq_->InsertPacket(
-        rtp_header, ArrayView<const uint8_t>(payload_data, payload_size),
+        rtp_header, std::span<const uint8_t>(payload_data, payload_size),
         /*receive_time=*/Timestamp::MinusInfinity());
 
     if (frame_type != AudioFrameType::kAudioFrameCN) {
diff --git a/modules/audio_coding/test/target_delay_unittest.cc b/modules/audio_coding/test/target_delay_unittest.cc
index 96130b4..bf72bcd 100644
--- a/modules/audio_coding/test/target_delay_unittest.cc
+++ b/modules/audio_coding/test/target_delay_unittest.cc
@@ -13,8 +13,8 @@
 #include <cstdlib>
 #include <map>
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
@@ -95,7 +95,7 @@
     rtp_header_.sequenceNumber++;
     ASSERT_EQ(0, neteq_->InsertPacket(
                      rtp_header_,
-                     ArrayView<const uint8_t>(payload_, kFrameSizeSamples * 2),
+                     std::span<const uint8_t>(payload_, kFrameSizeSamples * 2),
                      Timestamp::MinusInfinity()));
   }
 
diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn
index bad43a5..a5105a8 100644
--- a/modules/audio_device/BUILD.gn
+++ b/modules/audio_device/BUILD.gn
@@ -58,7 +58,6 @@
     "fine_audio_buffer.h",
   ]
   deps = [
-    "../../api:array_view",
     "../../api:sequence_checker",
     "../../api/audio:audio_device",
     "../../api/environment",
@@ -149,7 +148,6 @@
       ":audio_device_buffer",
       ":audio_device_name",
       ":windows_core_audio_utility",
-      "../../api:array_view",
       "../../api:make_ref_counted",
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
@@ -186,7 +184,6 @@
       ":audio_device_default",
       ":audio_device_generic",
       ":audio_device_impl",
-      "../../api:array_view",
       "../../api:make_ref_counted",
       "../../api:scoped_refptr",
       "../../api/audio:audio_device",
@@ -264,7 +261,6 @@
     ":audio_device_default",
     ":audio_device_dummy",
     ":audio_device_generic",
-    "../../api:array_view",
     "../../api:make_ref_counted",
     "../../api:ref_count",
     "../../api:refcountedbase",
@@ -461,7 +457,6 @@
       ":audio_device_impl",
       ":mock_audio_device",
       ":test_audio_device_module",
-      "../../api:array_view",
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
       "../../api/audio:audio_device",
diff --git a/modules/audio_device/audio_device_unittest.cc b/modules/audio_device/audio_device_unittest.cc
index ef93f7b..9dc10ea 100644
--- a/modules/audio_device/audio_device_unittest.cc
+++ b/modules/audio_device/audio_device_unittest.cc
@@ -18,9 +18,9 @@
 #include <list>
 #include <numeric>
 #include <optional>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_device_defines.h"
 #include "api/audio/create_audio_device_module.h"
 #include "api/environment/environment.h"
@@ -113,8 +113,8 @@
 // measurements.
 class AudioStream {
  public:
-  virtual void Write(ArrayView<const int16_t> source) = 0;
-  virtual void Read(ArrayView<int16_t> destination) = 0;
+  virtual void Write(std::span<const int16_t> source) = 0;
+  virtual void Read(std::span<int16_t> destination) = 0;
 
   virtual ~AudioStream() = default;
 };
@@ -141,7 +141,7 @@
 // change over time and that both sides will in most cases use the same size.
 class FifoAudioStream : public AudioStream {
  public:
-  void Write(ArrayView<const int16_t> source) override {
+  void Write(std::span<const int16_t> source) override {
     RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
     const size_t size = [&] {
       MutexLock lock(&lock_);
@@ -158,7 +158,7 @@
     written_elements_ += size;
   }
 
-  void Read(ArrayView<int16_t> destination) override {
+  void Read(std::span<int16_t> destination) override {
     MutexLock lock(&lock_);
     if (fifo_.empty()) {
       std::fill(destination.begin(), destination.end(), 0);
@@ -227,7 +227,7 @@
   }
 
   // Insert periodic impulses in first two samples of `destination`.
-  void Read(ArrayView<int16_t> destination) override {
+  void Read(std::span<int16_t> destination) override {
     RTC_DCHECK_RUN_ON(&read_thread_checker_);
     if (read_count_ == 0) {
       PRINT("[");
@@ -249,7 +249,7 @@
 
   // Detect received impulses in `source`, derive time between transmission and
   // detection and add the calculated delay to list of latencies.
-  void Write(ArrayView<const int16_t> source) override {
+  void Write(std::span<const int16_t> source) override {
     RTC_DCHECK_RUN_ON(&write_thread_checker_);
     RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
     MutexLock lock(&lock_);
@@ -402,9 +402,8 @@
     }
     // Write audio data to audio stream object if one has been injected.
     if (audio_stream_) {
-      audio_stream_->Write(
-          MakeArrayView(static_cast<const int16_t*>(audio_buffer),
-                        samples_per_channel * channels));
+      audio_stream_->Write(std::span(static_cast<const int16_t*>(audio_buffer),
+                                     samples_per_channel * channels));
     }
     // Signal the event after given amount of callbacks.
     if (event_ && ReceivedEnoughCallbacks()) {
@@ -443,8 +442,8 @@
     samples_out = samples_per_channel * channels;
     // Read audio data from audio stream object if one has been injected.
     if (audio_stream_) {
-      audio_stream_->Read(MakeArrayView(static_cast<int16_t*>(audio_buffer),
-                                        samples_per_channel * channels));
+      audio_stream_->Read(std::span(static_cast<int16_t*>(audio_buffer),
+                                    samples_per_channel * channels));
     } else {
       // Fill the audio buffer with zeros to avoid disturbing audio.
       const size_t num_bytes = samples_per_channel * bytes_per_frame;
diff --git a/modules/audio_device/fine_audio_buffer.cc b/modules/audio_device/fine_audio_buffer.cc
index 0ab7023..04cf671 100644
--- a/modules/audio_device/fine_audio_buffer.cc
+++ b/modules/audio_device/fine_audio_buffer.cc
@@ -13,8 +13,8 @@
 #include <cstdint>
 #include <cstring>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "modules/audio_device/audio_device_buffer.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -64,7 +64,7 @@
   return record_samples_per_channel_10ms_ > 0 && record_channels_ > 0;
 }
 
-void FineAudioBuffer::GetPlayoutData(ArrayView<int16_t> audio_buffer,
+void FineAudioBuffer::GetPlayoutData(std::span<int16_t> audio_buffer,
                                      int playout_delay_ms) {
   RTC_DCHECK(IsReadyForPlayout());
   // Ask WebRTC for new data in chunks of 10ms until we have enough to
@@ -81,7 +81,7 @@
       const size_t num_elements_10ms =
           playout_channels_ * playout_samples_per_channel_10ms_;
       const size_t written_elements = playout_buffer_.AppendData(
-          num_elements_10ms, [&](ArrayView<int16_t> buf) {
+          num_elements_10ms, [&](std::span<int16_t> buf) {
             const size_t samples_per_channel_10ms =
                 audio_device_buffer_->GetPlayoutData(buf.data());
             return playout_channels_ * samples_per_channel_10ms;
@@ -108,7 +108,7 @@
 }
 
 void FineAudioBuffer::DeliverRecordedData(
-    ArrayView<const int16_t> audio_buffer,
+    std::span<const int16_t> audio_buffer,
     int record_delay_ms,
     std::optional<int64_t> capture_time_ns) {
   RTC_DCHECK(IsReadyForRecord());
diff --git a/modules/audio_device/fine_audio_buffer.h b/modules/audio_device/fine_audio_buffer.h
index dd4d456..a2cb3c2 100644
--- a/modules/audio_device/fine_audio_buffer.h
+++ b/modules/audio_device/fine_audio_buffer.h
@@ -14,8 +14,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 
 namespace webrtc {
@@ -52,7 +52,7 @@
   // silence instead. The provided delay estimate in `playout_delay_ms` should
   // contain an estimate of the latency between when an audio frame is read from
   // WebRTC and when it is played out on the speaker.
-  void GetPlayoutData(ArrayView<int16_t> audio_buffer, int playout_delay_ms);
+  void GetPlayoutData(std::span<int16_t> audio_buffer, int playout_delay_ms);
 
   // Consumes the audio data in `audio_buffer` and sends it to the WebRTC layer
   // in chunks of 10ms. The sum of the provided delay estimate in
@@ -63,11 +63,11 @@
   // Example: buffer size is 5ms => call #1 stores 5ms of data, call #2 stores
   // 5ms of data and sends a total of 10ms to WebRTC and clears the internal
   // cache. Call #3 restarts the scheme above.
-  void DeliverRecordedData(ArrayView<const int16_t> audio_buffer,
+  void DeliverRecordedData(std::span<const int16_t> audio_buffer,
                            int record_delay_ms) {
     DeliverRecordedData(audio_buffer, record_delay_ms, std::nullopt);
   }
-  void DeliverRecordedData(ArrayView<const int16_t> audio_buffer,
+  void DeliverRecordedData(std::span<const int16_t> audio_buffer,
                            int record_delay_ms,
                            std::optional<int64_t> capture_time_ns);
 
diff --git a/modules/audio_device/fine_audio_buffer_unittest.cc b/modules/audio_device/fine_audio_buffer_unittest.cc
index 2ec0a53..2516b5f 100644
--- a/modules/audio_device/fine_audio_buffer_unittest.cc
+++ b/modules/audio_device/fine_audio_buffer_unittest.cc
@@ -13,8 +13,8 @@
 #include <climits>
 #include <cstdint>
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "modules/audio_device/mock_audio_device_buffer.h"
 #include "test/create_test_environment.h"
 #include "test/gmock.h"
@@ -131,12 +131,12 @@
 
   for (int i = 0; i < kNumberOfFrames; ++i) {
     fine_buffer.GetPlayoutData(
-        ArrayView<int16_t>(out_buffer.get(), kChannels * kFrameSizeSamples), 0);
+        std::span<int16_t>(out_buffer.get(), kChannels * kFrameSizeSamples), 0);
     EXPECT_TRUE(
         VerifyBuffer(out_buffer.get(), i, kChannels * kFrameSizeSamples));
     UpdateInputBuffer(in_buffer.get(), i, kChannels * kFrameSizeSamples);
     fine_buffer.DeliverRecordedData(
-        ArrayView<const int16_t>(in_buffer.get(),
+        std::span<const int16_t>(in_buffer.get(),
                                  kChannels * kFrameSizeSamples),
         0);
   }
diff --git a/modules/audio_device/include/test_audio_device.cc b/modules/audio_device/include/test_audio_device.cc
index 132128e..01360b2 100644
--- a/modules/audio_device/include/test_audio_device.cc
+++ b/modules/audio_device/include/test_audio_device.cc
@@ -14,12 +14,12 @@
 #include <cstdlib>
 #include <cstring>
 #include <memory>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio/audio_device.h"
 #include "api/environment/environment.h"
 #include "api/make_ref_counted.h"
@@ -74,7 +74,7 @@
     buffer->SetData(
         TestAudioDeviceModule::SamplesPerFrame(sampling_frequency_in_hz_) *
             num_channels_,
-        [&](ArrayView<int16_t> data) {
+        [&](std::span<int16_t> data) {
           if (fill_with_zero_) {
             std::fill(data.begin(), data.end(), 0);
           } else {
@@ -120,7 +120,7 @@
     buffer->SetData(
         TestAudioDeviceModule::SamplesPerFrame(sampling_frequency_in_hz_) *
             num_channels_,
-        [&](ArrayView<int16_t> data) {
+        [&](std::span<int16_t> data) {
           size_t read = wav_reader_->ReadSamples(data.size(), data.data());
           if (read < data.size() && repeat_) {
             do {
@@ -170,7 +170,7 @@
 
   int NumChannels() const override { return num_channels_; }
 
-  bool Render(ArrayView<const int16_t> data) override {
+  bool Render(std::span<const int16_t> data) override {
     wav_writer_->WriteSamples(data.data(), data.size());
     return true;
   }
@@ -207,7 +207,7 @@
 
   int NumChannels() const override { return num_channels_; }
 
-  bool Render(ArrayView<const int16_t> data) override {
+  bool Render(std::span<const int16_t> data) override {
     const int16_t kAmplitudeThreshold = 5;
 
     const int16_t* begin = data.data();
@@ -266,7 +266,7 @@
 
   int NumChannels() const override { return num_channels_; }
 
-  bool Render(ArrayView<const int16_t> /* data */) override { return true; }
+  bool Render(std::span<const int16_t> /* data */) override { return true; }
 
  private:
   int sampling_frequency_in_hz_;
@@ -302,8 +302,8 @@
     buffer->SetData(
         TestAudioDeviceModule::SamplesPerFrame(SamplingFrequency()) *
             NumChannels(),
-        [&](ArrayView<int16_t> data) {
-          ArrayView<int8_t> read_buffer_view = ReadBufferView();
+        [&](std::span<int16_t> data) {
+          std::span<int8_t> read_buffer_view = ReadBufferView();
           size_t size = data.size() * 2;
           size_t read = input_file_.Read(read_buffer_view.data(), size);
           if (read < size && repeat_) {
@@ -322,7 +322,7 @@
   }
 
  private:
-  ArrayView<int8_t> ReadBufferView() { return read_buffer_; }
+  std::span<int8_t> ReadBufferView() { return read_buffer_; }
 
   const std::string input_file_name_;
   const int sampling_frequency_in_hz_;
@@ -360,7 +360,7 @@
 
   int NumChannels() const override { return num_channels_; }
 
-  bool Render(ArrayView<const int16_t> data) override {
+  bool Render(std::span<const int16_t> data) override {
     const int16_t kAmplitudeThreshold = 5;
 
     const int16_t* begin = data.data();
diff --git a/modules/audio_device/include/test_audio_device.h b/modules/audio_device/include/test_audio_device.h
index 7969484..e460d25 100644
--- a/modules/audio_device/include/test_audio_device.h
+++ b/modules/audio_device/include/test_audio_device.h
@@ -13,9 +13,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/audio/audio_device.h"
 #include "api/environment/environment.h"
 #include "api/scoped_refptr.h"
@@ -59,7 +59,7 @@
     virtual int NumChannels() const = 0;
     // Renders the passed audio data and returns true if the renderer wants
     // to keep receiving data, or false otherwise.
-    virtual bool Render(ArrayView<const int16_t> data) = 0;
+    virtual bool Render(std::span<const int16_t> data) = 0;
   };
 
   // A fake capturer that generates pulses with random samples between
diff --git a/modules/audio_device/include/test_audio_device_unittest.cc b/modules/audio_device/include/test_audio_device_unittest.cc
index 95eb74e..1ad4b9d 100644
--- a/modules/audio_device/include/test_audio_device_unittest.cc
+++ b/modules/audio_device/include/test_audio_device_unittest.cc
@@ -20,11 +20,11 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_device.h"
 #include "api/audio/audio_device_defines.h"
 #include "api/environment/environment.h"
@@ -65,7 +65,7 @@
         TestAudioDeviceModule::CreateBoundedWavFileWriter(output_filename, 800);
 
     for (size_t i = 0; i < input_samples.size(); i += kSamplesPerFrame) {
-      EXPECT_TRUE(writer->Render(ArrayView<const int16_t>(
+      EXPECT_TRUE(writer->Render(std::span<const int16_t>(
           &input_samples[i],
           std::min(kSamplesPerFrame, input_samples.size() - i))));
     }
@@ -162,7 +162,7 @@
         TestAudioDeviceModule::CreateWavFileWriter(output_filename, 800);
 
     for (size_t i = 0; i < kInputSamples.size(); i += kSamplesPerFrame) {
-      EXPECT_TRUE(writer->Render(ArrayView<const int16_t>(
+      EXPECT_TRUE(writer->Render(std::span<const int16_t>(
           &kInputSamples[i],
           std::min(kSamplesPerFrame, kInputSamples.size() - i))));
     }
@@ -203,7 +203,7 @@
             output_filename, /*sampling_frequency_in_hz=*/800);
 
     for (size_t i = 0; i < input_samples.size(); i += kSamplesPerFrame) {
-      EXPECT_TRUE(writer->Render(ArrayView<const int16_t>(
+      EXPECT_TRUE(writer->Render(std::span<const int16_t>(
           &input_samples[i],
           std::min(kSamplesPerFrame, input_samples.size() - i))));
     }
@@ -311,7 +311,7 @@
             output_filename, /*sampling_frequency_in_hz=*/800);
 
     for (size_t i = 0; i < kInputSamples.size(); i += kSamplesPerFrame) {
-      EXPECT_TRUE(writer->Render(ArrayView<const int16_t>(
+      EXPECT_TRUE(writer->Render(std::span<const int16_t>(
           &kInputSamples[i],
           std::min(kSamplesPerFrame, kInputSamples.size() - i))));
     }
diff --git a/modules/audio_device/test_audio_device_impl.cc b/modules/audio_device/test_audio_device_impl.cc
index 5cfb65b..33f59a8 100644
--- a/modules/audio_device/test_audio_device_impl.cc
+++ b/modules/audio_device/test_audio_device_impl.cc
@@ -13,9 +13,9 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/units/time_delta.h"
@@ -189,7 +189,7 @@
     size_t samples_out = samples_per_channel * renderer_->NumChannels();
     RTC_CHECK_LE(samples_out, playout_buffer_.size());
     const bool keep_rendering = renderer_->Render(
-        ArrayView<const int16_t>(playout_buffer_.data(), samples_out));
+        std::span<const int16_t>(playout_buffer_.data(), samples_out));
     if (!keep_rendering) {
       rendering_ = false;
     }
diff --git a/modules/audio_device/win/core_audio_input_win.cc b/modules/audio_device/win/core_audio_input_win.cc
index f6139ae..3b92e58 100644
--- a/modules/audio_device/win/core_audio_input_win.cc
+++ b/modules/audio_device/win/core_audio_input_win.cc
@@ -13,9 +13,9 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/audio/audio_device.h"
 #include "api/environment/environment.h"
 #include "api/sequence_checker.h"
@@ -368,8 +368,8 @@
       // Copy recorded audio in `audio_data` to the WebRTC sink using the
       // FineAudioBuffer object.
       fine_audio_buffer_->DeliverRecordedData(
-          webrtc::MakeArrayView(reinterpret_cast<const int16_t*>(audio_data),
-                                format_.Format.nChannels * num_frames_to_read),
+          std::span(reinterpret_cast<const int16_t*>(audio_data),
+                    format_.Format.nChannels * num_frames_to_read),
 
           latency_ms_);
     }
diff --git a/modules/audio_device/win/core_audio_output_win.cc b/modules/audio_device/win/core_audio_output_win.cc
index decc0ee..f373c40 100644
--- a/modules/audio_device/win/core_audio_output_win.cc
+++ b/modules/audio_device/win/core_audio_output_win.cc
@@ -12,9 +12,9 @@
 
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "api/audio/audio_device.h"
 #include "api/environment/environment.h"
 #include "api/sequence_checker.h"
@@ -346,8 +346,8 @@
   // Get audio data from WebRTC and write it to the allocated buffer in
   // `audio_data`. The playout latency is not updated for each callback.
   fine_audio_buffer_->GetPlayoutData(
-      webrtc::MakeArrayView(reinterpret_cast<int16_t*>(audio_data),
-                            num_requested_frames * format_.Format.nChannels),
+      std::span(reinterpret_cast<int16_t*>(audio_data),
+                num_requested_frames * format_.Format.nChannels),
       latency_ms_);
 
   // Release the buffer space acquired in IAudioRenderClient::GetBuffer.
diff --git a/modules/audio_mixer/BUILD.gn b/modules/audio_mixer/BUILD.gn
index d2fa8db..362abf5 100644
--- a/modules/audio_mixer/BUILD.gn
+++ b/modules/audio_mixer/BUILD.gn
@@ -39,14 +39,12 @@
 
   deps = [
     ":audio_frame_manipulator",
-    "../../api:array_view",
     "../../api:make_ref_counted",
     "../../api:rtp_packet_info",
     "../../api:scoped_refptr",
     "../../api/audio:audio_frame_api",
     "../../api/audio:audio_mixer_api",
     "../../api/audio:audio_processing",
-    "../../api/audio:audio_processing",
     "../../audio/utility:audio_frame_operations",
     "../../common_audio",
     "../../rtc_base:checks",
@@ -97,7 +95,6 @@
     deps = [
       ":audio_frame_manipulator",
       ":audio_mixer_impl",
-      "../../api:array_view",
       "../../api/audio:audio_frame_api",
       "../../rtc_base:checks",
       "../../rtc_base:safe_conversions",
@@ -116,7 +113,6 @@
       ":audio_frame_manipulator",
       ":audio_mixer_impl",
       ":audio_mixer_test_utils",
-      "../../api:array_view",
       "../../api:rtp_packet_info",
       "../../api:scoped_refptr",
       "../../api/audio:audio_frame_api",
diff --git a/modules/audio_mixer/audio_mixer_impl.cc b/modules/audio_mixer/audio_mixer_impl.cc
index edf6828..e961279 100644
--- a/modules/audio_mixer/audio_mixer_impl.cc
+++ b/modules/audio_mixer/audio_mixer_impl.cc
@@ -13,10 +13,10 @@
 #include <algorithm>
 #include <cstddef>
 #include <memory>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/make_ref_counted.h"
 #include "api/scoped_refptr.h"
@@ -101,7 +101,7 @@
                  });
 
   int output_frequency = output_rate_calculator_->CalculateOutputRateFromRange(
-      ArrayView<const int>(helper_containers_->preferred_rates.data(),
+      std::span<const int>(helper_containers_->preferred_rates.data(),
                            number_of_streams));
 
   frame_combiner_.Combine(GetAudioFromSources(output_frequency),
@@ -129,7 +129,7 @@
   audio_source_list_.erase(iter);
 }
 
-ArrayView<AudioFrame* const> AudioMixerImpl::GetAudioFromSources(
+std::span<AudioFrame* const> AudioMixerImpl::GetAudioFromSources(
     int output_frequency) {
   int audio_to_mix_count = 0;
   for (auto& source_and_status : audio_source_list_) {
@@ -148,7 +148,7 @@
             &source_and_status->audio_frame;
     }
   }
-  return ArrayView<AudioFrame* const>(helper_containers_->audio_to_mix.data(),
+  return std::span<AudioFrame* const>(helper_containers_->audio_to_mix.data(),
                                       audio_to_mix_count);
 }
 
diff --git a/modules/audio_mixer/audio_mixer_impl.h b/modules/audio_mixer/audio_mixer_impl.h
index 104f130..c70d6c9 100644
--- a/modules/audio_mixer/audio_mixer_impl.h
+++ b/modules/audio_mixer/audio_mixer_impl.h
@@ -14,9 +14,9 @@
 #include <stddef.h>
 
 #include <memory>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio/audio_mixer.h"
 #include "api/scoped_refptr.h"
@@ -63,7 +63,7 @@
   void UpdateSourceCountStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
 
   // Fetches audio frames to mix from sources.
-  ArrayView<AudioFrame* const> GetAudioFromSources(int output_frequency)
+  std::span<AudioFrame* const> GetAudioFromSources(int output_frequency)
       RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
 
   // The critical section lock guards audio source insertion and
diff --git a/modules/audio_mixer/audio_mixer_impl_unittest.cc b/modules/audio_mixer/audio_mixer_impl_unittest.cc
index 9cd6b42..1e240cf 100644
--- a/modules/audio_mixer/audio_mixer_impl_unittest.cc
+++ b/modules/audio_mixer/audio_mixer_impl_unittest.cc
@@ -15,10 +15,10 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio/audio_mixer.h"
 #include "api/rtp_packet_info.h"
@@ -122,7 +122,7 @@
  public:
   explicit CustomRateCalculator(int rate) : rate_(rate) {}
   int CalculateOutputRateFromRange(
-      ArrayView<const int> /* preferred_rates */) override {
+      std::span<const int> /* preferred_rates */) override {
     return rate_;
   }
 
@@ -484,7 +484,7 @@
  public:
   static const int kDefaultFrequency = 76000;
   int CalculateOutputRateFromRange(
-      ArrayView<const int> /* preferred_sample_rates */) override {
+      std::span<const int> /* preferred_sample_rates */) override {
     return kDefaultFrequency;
   }
   ~HighOutputRateCalculator() override {}
diff --git a/modules/audio_mixer/default_output_rate_calculator.cc b/modules/audio_mixer/default_output_rate_calculator.cc
index be9819c..8eb6a05 100644
--- a/modules/audio_mixer/default_output_rate_calculator.cc
+++ b/modules/audio_mixer/default_output_rate_calculator.cc
@@ -12,15 +12,15 @@
 
 #include <algorithm>
 #include <iterator>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio/audio_processing.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
 
 int DefaultOutputRateCalculator::CalculateOutputRateFromRange(
-    ArrayView<const int> preferred_sample_rates) {
+    std::span<const int> preferred_sample_rates) {
   if (preferred_sample_rates.empty()) {
     return DefaultOutputRateCalculator::kDefaultFrequency;
   }
diff --git a/modules/audio_mixer/default_output_rate_calculator.h b/modules/audio_mixer/default_output_rate_calculator.h
index acae77f..e91a2d8 100644
--- a/modules/audio_mixer/default_output_rate_calculator.h
+++ b/modules/audio_mixer/default_output_rate_calculator.h
@@ -11,7 +11,8 @@
 #ifndef MODULES_AUDIO_MIXER_DEFAULT_OUTPUT_RATE_CALCULATOR_H_
 #define MODULES_AUDIO_MIXER_DEFAULT_OUTPUT_RATE_CALCULATOR_H_
 
-#include "api/array_view.h"
+#include <span>
+
 #include "modules/audio_mixer/output_rate_calculator.h"
 
 namespace webrtc {
@@ -25,7 +26,7 @@
   // AudioProcessing::NativeRate. If `preferred_sample_rates` is
   // empty, returns `kDefaultFrequency`.
   int CalculateOutputRateFromRange(
-      ArrayView<const int> preferred_sample_rates) override;
+      std::span<const int> preferred_sample_rates) override;
   ~DefaultOutputRateCalculator() override {}
 };
 
diff --git a/modules/audio_mixer/frame_combiner.cc b/modules/audio_mixer/frame_combiner.cc
index 6f5e1b7..7fd5caf 100644
--- a/modules/audio_mixer/frame_combiner.cc
+++ b/modules/audio_mixer/frame_combiner.cc
@@ -15,10 +15,10 @@
 #include <cstddef>
 #include <cstdint>
 #include <memory>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio/audio_view.h"
 #include "api/rtp_packet_info.h"
@@ -32,7 +32,7 @@
 namespace webrtc {
 namespace {
 
-void SetAudioFrameFields(ArrayView<const AudioFrame* const> mix_list,
+void SetAudioFrameFields(std::span<const AudioFrame* const> mix_list,
                          size_t number_of_channels,
                          int sample_rate,
                          size_t /* number_of_streams */,
@@ -70,7 +70,7 @@
   }
 }
 
-void MixFewFramesWithNoLimiter(ArrayView<const AudioFrame* const> mix_list,
+void MixFewFramesWithNoLimiter(std::span<const AudioFrame* const> mix_list,
                                AudioFrame* audio_frame_for_mixing) {
   if (mix_list.empty()) {
     audio_frame_for_mixing->Mute();
@@ -82,7 +82,7 @@
   CopySamples(dst, mix_list[0]->data_view());
 }
 
-void MixToFloatFrame(ArrayView<const AudioFrame* const> mix_list,
+void MixToFloatFrame(std::span<const AudioFrame* const> mix_list,
                      DeinterleavedView<float>& mixing_buffer) {
   const size_t number_of_channels = NumChannels(mixing_buffer);
   // Clear the mixing buffer.
@@ -133,7 +133,7 @@
 
 FrameCombiner::~FrameCombiner() = default;
 
-void FrameCombiner::Combine(ArrayView<AudioFrame* const> mix_list,
+void FrameCombiner::Combine(std::span<AudioFrame* const> mix_list,
                             size_t number_of_channels,
                             int sample_rate,
                             size_t number_of_streams,
diff --git a/modules/audio_mixer/frame_combiner.h b/modules/audio_mixer/frame_combiner.h
index 74c4547..c6ee55c 100644
--- a/modules/audio_mixer/frame_combiner.h
+++ b/modules/audio_mixer/frame_combiner.h
@@ -14,8 +14,8 @@
 #include <array>
 #include <cstddef>
 #include <memory>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "modules/audio_processing/agc2/limiter.h"
 
@@ -33,7 +33,7 @@
   // because 'mix_list' can be empty. The parameter
   // 'number_of_streams' is used for determining whether to pass the
   // data through a limiter.
-  void Combine(ArrayView<AudioFrame* const> mix_list,
+  void Combine(std::span<AudioFrame* const> mix_list,
                size_t number_of_channels,
                int sample_rate,
                size_t number_of_streams,
diff --git a/modules/audio_mixer/frame_combiner_unittest.cc b/modules/audio_mixer/frame_combiner_unittest.cc
index ae44046..e2afc47 100644
--- a/modules/audio_mixer/frame_combiner_unittest.cc
+++ b/modules/audio_mixer/frame_combiner_unittest.cc
@@ -14,10 +14,10 @@
 #include <cstdint>
 #include <initializer_list>
 #include <numeric>
+#include <span>
 #include <string>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/audio/audio_frame.h"
 #include "api/audio/channel_layout.h"
 #include "api/rtp_packet_info.h"
@@ -340,8 +340,8 @@
                        config.sample_rate_hz, number_of_streams,
                        &audio_frame_for_mixing);
       cumulative_change += change_calculator.CalculateGainChange(
-          ArrayView<const int16_t>(frame1.data(), number_of_samples),
-          ArrayView<const int16_t>(audio_frame_for_mixing.data(),
+          std::span<const int16_t>(frame1.data(), number_of_samples),
+          std::span<const int16_t>(audio_frame_for_mixing.data(),
                                    number_of_samples));
     }
 
diff --git a/modules/audio_mixer/gain_change_calculator.cc b/modules/audio_mixer/gain_change_calculator.cc
index ff14baa..6420468 100644
--- a/modules/audio_mixer/gain_change_calculator.cc
+++ b/modules/audio_mixer/gain_change_calculator.cc
@@ -13,9 +13,9 @@
 #include <cmath>
 #include <cstdint>
 #include <cstdlib>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
@@ -24,8 +24,8 @@
 constexpr int16_t kReliabilityThreshold = 100;
 }  // namespace
 
-float GainChangeCalculator::CalculateGainChange(ArrayView<const int16_t> in,
-                                                ArrayView<const int16_t> out) {
+float GainChangeCalculator::CalculateGainChange(std::span<const int16_t> in,
+                                                std::span<const int16_t> out) {
   RTC_DCHECK_EQ(in.size(), out.size());
 
   std::vector<float> gain(in.size());
@@ -37,9 +37,9 @@
   return last_reliable_gain_;
 }
 
-void GainChangeCalculator::CalculateGain(ArrayView<const int16_t> in,
-                                         ArrayView<const int16_t> out,
-                                         ArrayView<float> gain) {
+void GainChangeCalculator::CalculateGain(std::span<const int16_t> in,
+                                         std::span<const int16_t> out,
+                                         std::span<float> gain) {
   RTC_DCHECK_EQ(in.size(), out.size());
   RTC_DCHECK_EQ(in.size(), gain.size());
 
@@ -52,7 +52,7 @@
 }
 
 float GainChangeCalculator::CalculateDifferences(
-    ArrayView<const float> values) {
+    std::span<const float> values) {
   float res = 0;
   for (float f : values) {
     res += fabs(f - last_value_);
diff --git a/modules/audio_mixer/gain_change_calculator.h b/modules/audio_mixer/gain_change_calculator.h
index b17db3b..2b5013a 100644
--- a/modules/audio_mixer/gain_change_calculator.h
+++ b/modules/audio_mixer/gain_change_calculator.h
@@ -13,7 +13,7 @@
 
 #include <stdint.h>
 
-#include "api/array_view.h"
+#include <span>
 
 namespace webrtc {
 
@@ -22,17 +22,17 @@
   // The 'out' signal is assumed to be produced from 'in' by applying
   // a smoothly varying gain. This method computes variations of the
   // gain and handles special cases when the samples are small.
-  float CalculateGainChange(ArrayView<const int16_t> in,
-                            ArrayView<const int16_t> out);
+  float CalculateGainChange(std::span<const int16_t> in,
+                            std::span<const int16_t> out);
 
   float LatestGain() const;
 
  private:
-  void CalculateGain(ArrayView<const int16_t> in,
-                     ArrayView<const int16_t> out,
-                     ArrayView<float> gain);
+  void CalculateGain(std::span<const int16_t> in,
+                     std::span<const int16_t> out,
+                     std::span<float> gain);
 
-  float CalculateDifferences(ArrayView<const float> values);
+  float CalculateDifferences(std::span<const float> values);
   float last_value_ = 0.f;
   float last_reliable_gain_ = 1.0f;
 };
diff --git a/modules/audio_mixer/output_rate_calculator.h b/modules/audio_mixer/output_rate_calculator.h
index 755da32..e9938a0 100644
--- a/modules/audio_mixer/output_rate_calculator.h
+++ b/modules/audio_mixer/output_rate_calculator.h
@@ -11,7 +11,7 @@
 #ifndef MODULES_AUDIO_MIXER_OUTPUT_RATE_CALCULATOR_H_
 #define MODULES_AUDIO_MIXER_OUTPUT_RATE_CALCULATOR_H_
 
-#include "api/array_view.h"
+#include <span>
 
 namespace webrtc {
 
@@ -20,7 +20,7 @@
 class OutputRateCalculator {
  public:
   virtual int CalculateOutputRateFromRange(
-      ArrayView<const int> preferred_sample_rates) = 0;
+      std::span<const int> preferred_sample_rates) = 0;
 
   virtual ~OutputRateCalculator() {}
 };
diff --git a/modules/audio_processing/agc2/rnn_vad/BUILD.gn b/modules/audio_processing/agc2/rnn_vad/BUILD.gn
index 53c9af2..2e9c473 100644
--- a/modules/audio_processing/agc2/rnn_vad/BUILD.gn
+++ b/modules/audio_processing/agc2/rnn_vad/BUILD.gn
@@ -302,7 +302,6 @@
         ":rnn_vad",
         ":rnn_vad_common",
         "..:cpu_features",
-        "../../../../api:array_view",
         "../../../../common_audio",
         "../../../../rtc_base:checks",
         "../../../../rtc_base:logging",
diff --git a/modules/congestion_controller/goog_cc/BUILD.gn b/modules/congestion_controller/goog_cc/BUILD.gn
index 837b108..a8c9da4 100644
--- a/modules/congestion_controller/goog_cc/BUILD.gn
+++ b/modules/congestion_controller/goog_cc/BUILD.gn
@@ -125,7 +125,6 @@
     "loss_based_bwe_v2.h",
   ]
   deps = [
-    "../../../api:array_view",
     "../../../api:field_trials_view",
     "../../../api/transport:network_control",
     "../../../api/units:data_rate",
diff --git a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc
index 55c7873..9649332 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc
+++ b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc
@@ -16,10 +16,10 @@
 #include <cstdlib>
 #include <limits>
 #include <optional>
+#include <span>
 #include <vector>
 
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
@@ -187,7 +187,7 @@
 }
 
 void LossBasedBweV2::UpdateBandwidthEstimate(
-    ArrayView<const PacketResult> packet_results,
+    std::span<const PacketResult> packet_results,
     DataRate delay_based_estimate,
     bool in_alr) {
   delay_based_estimate_ = delay_based_estimate;
@@ -1147,7 +1147,7 @@
 }
 
 bool LossBasedBweV2::PushBackObservation(
-    ArrayView<const PacketResult> packet_results) {
+    std::span<const PacketResult> packet_results) {
   if (packet_results.empty()) {
     return false;
   }
diff --git a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h
index b088420..ce3219e 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h
+++ b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h
@@ -13,10 +13,10 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <unordered_map>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
@@ -72,7 +72,7 @@
 
   void SetAcknowledgedBitrate(DataRate acknowledged_bitrate);
   void SetMinMaxBitrate(DataRate min_bitrate, DataRate max_bitrate);
-  void UpdateBandwidthEstimate(ArrayView<const PacketResult> packet_results,
+  void UpdateBandwidthEstimate(std::span<const PacketResult> packet_results,
                                DataRate delay_based_estimate,
                                bool in_alr);
 
@@ -193,7 +193,7 @@
   void NewtonsMethodUpdate(ChannelParameters& channel_parameters) const;
 
   // Returns false if no observation was created.
-  bool PushBackObservation(ArrayView<const PacketResult> packet_results);
+  bool PushBackObservation(std::span<const PacketResult> packet_results);
   bool IsEstimateIncreasingWhenLossLimited(DataRate old_estimate,
                                            DataRate new_estimate);
   bool IsInLossLimitedState() const;
diff --git a/modules/congestion_controller/rtp/BUILD.gn b/modules/congestion_controller/rtp/BUILD.gn
index 27c108a..23e6a06 100644
--- a/modules/congestion_controller/rtp/BUILD.gn
+++ b/modules/congestion_controller/rtp/BUILD.gn
@@ -69,7 +69,6 @@
     ]
     deps = [
       ":transport_feedback",
-      "../../../api:array_view",
       "../../../api/transport:ecn_marking",
       "../../../api/transport:network_control",
       "../../../api/units:data_size",
diff --git a/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc b/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc
index bdb63b7..cf36947 100644
--- a/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc
+++ b/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc
@@ -15,10 +15,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/transport/ecn_marking.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_size.h"
@@ -145,7 +145,7 @@
 }
 
 rtcp::TransportFeedback BuildRtcpTransportFeedbackPacket(
-    ArrayView<const PacketTemplate> packets) {
+    std::span<const PacketTemplate> packets) {
   rtcp::TransportFeedback feedback;
   feedback.SetBase(packets[0].transport_sequence_number,
                    packets[0].receive_timestamp);
@@ -160,7 +160,7 @@
 }
 
 rtcp::CongestionControlFeedback BuildRtcpCongestionControlFeedbackPacket(
-    ArrayView<const PacketTemplate> packets) {
+    std::span<const PacketTemplate> packets) {
   // Assume the feedback was sent when the last packet was received.
   Timestamp feedback_sent_time = Timestamp::MinusInfinity();
   for (auto it = packets.rbegin(); it != packets.rend(); ++it) {
@@ -215,7 +215,7 @@
   bool UseRfc8888CongestionControlFeedback() const { return GetParam(); }
 
   std::optional<TransportPacketsFeedback> CreateAndProcessFeedback(
-      ArrayView<const PacketTemplate> packets,
+      std::span<const PacketTemplate> packets,
       TransportFeedbackAdapter& adapter) {
     if (UseRfc8888CongestionControlFeedback()) {
       rtcp::CongestionControlFeedback rtcp_feedback =
@@ -599,9 +599,9 @@
   }
 
   std::optional<TransportPacketsFeedback> adapted_feedback_1 =
-      CreateAndProcessFeedback(MakeArrayView(&packets[0], 1), adapter);
+      CreateAndProcessFeedback(std::span(&packets[0], 1), adapter);
   std::optional<TransportPacketsFeedback> adapted_feedback_2 =
-      CreateAndProcessFeedback(MakeArrayView(&packets[1], 1), adapter);
+      CreateAndProcessFeedback(std::span(&packets[1], 1), adapter);
   EXPECT_EQ(adapted_feedback_1->data_in_flight, packets[1].packet_size);
   EXPECT_EQ(adapted_feedback_2->data_in_flight, DataSize::Zero());
 }
@@ -812,7 +812,7 @@
   const TimeDelta kExpectedRtt = TimeDelta::Millis(20);
   for (int i = 0; i < 4; i = i + 2) {
     rtcp::CongestionControlFeedback rtcp_feedback =
-        BuildRtcpCongestionControlFeedbackPacket(MakeArrayView(&packets[i], 2));
+        BuildRtcpCongestionControlFeedbackPacket(std::span(&packets[i], 2));
     std::optional<TransportPacketsFeedback> adapted_feedback =
         adapter.ProcessCongestionControlFeedback(
             rtcp_feedback,
diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn
index 3da5304..6b15ad7 100644
--- a/modules/desktop_capture/BUILD.gn
+++ b/modules/desktop_capture/BUILD.gn
@@ -69,7 +69,6 @@
         ":desktop_capture_mock",
         ":primitives",
         ":screen_drawer",
-        "../../api:array_view",
         "../../rtc_base:base64",
         "../../rtc_base:threading",
         "../../test:test_support",
@@ -163,7 +162,6 @@
       ":desktop_capture",
       ":desktop_capture_mock",
       ":primitives",
-      "../../api:array_view",
       "../../api/units:time_delta",
       "../../api/units:timestamp",
       "../../rtc_base:checks",
diff --git a/modules/desktop_capture/desktop_frame_unittest.cc b/modules/desktop_capture/desktop_frame_unittest.cc
index ea3b2bb..a29cc8e 100644
--- a/modules/desktop_capture/desktop_frame_unittest.cc
+++ b/modules/desktop_capture/desktop_frame_unittest.cc
@@ -14,8 +14,8 @@
 #include <cstring>
 #include <memory>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "modules/desktop_capture/desktop_geometry.h"
 #include "test/gtest.h"
 
@@ -77,7 +77,7 @@
   }
 }
 
-void RunTests(ArrayView<const TestData> tests) {
+void RunTests(std::span<const TestData> tests) {
   for (const TestData& test : tests) {
     SCOPED_TRACE(test.description);
 
diff --git a/modules/desktop_capture/screen_capturer_integration_test.cc b/modules/desktop_capture/screen_capturer_integration_test.cc
index a1f61e3..34996fc 100644
--- a/modules/desktop_capture/screen_capturer_integration_test.cc
+++ b/modules/desktop_capture/screen_capturer_integration_test.cc
@@ -14,11 +14,11 @@
 #include <initializer_list>
 #include <iostream>  // TODO(zijiehe): Remove once flaky has been resolved.
 #include <memory>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "modules/desktop_capture/desktop_capture_options.h"
 #include "modules/desktop_capture/desktop_capturer.h"
 #include "modules/desktop_capture/desktop_frame.h"
@@ -216,7 +216,7 @@
           // The else if statement is for debugging purpose only,
           // which should be removed after flakiness of
           // ScreenCapturerIntegrationTest has been resolved.
-          ArrayView<const uint8_t> frame_data(
+          std::span<const uint8_t> frame_data(
               frame->data(), frame->size().height() * frame->stride());
           std::string result = Base64Encode(frame_data);
           std::cout << frame->size().width() << " x " << frame->size().height()
diff --git a/modules/pacing/BUILD.gn b/modules/pacing/BUILD.gn
index 11c8d02..083b6ec 100644
--- a/modules/pacing/BUILD.gn
+++ b/modules/pacing/BUILD.gn
@@ -29,7 +29,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../api:field_trials_view",
     "../../api:rtp_headers",
     "../../api:rtp_packet_sender",
@@ -87,7 +86,6 @@
     deps = [
       ":interval_budget",
       ":pacing",
-      "../../api:array_view",
       "../../api:field_trials",
       "../../api:rtp_headers",
       "../../api:sequence_checker",
diff --git a/modules/pacing/pacing_controller.cc b/modules/pacing/pacing_controller.cc
index 96fb3cb..8c2dda6 100644
--- a/modules/pacing/pacing_controller.cc
+++ b/modules/pacing/pacing_controller.cc
@@ -16,12 +16,12 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/cleanup/cleanup.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
@@ -102,7 +102,7 @@
 PacingController::~PacingController() = default;
 
 void PacingController::CreateProbeClusters(
-    ArrayView<const ProbeClusterConfig> probe_cluster_configs) {
+    std::span<const ProbeClusterConfig> probe_cluster_configs) {
   for (const ProbeClusterConfig probe_cluster_config : probe_cluster_configs) {
     prober_.CreateProbeCluster(probe_cluster_config);
   }
diff --git a/modules/pacing/pacing_controller.h b/modules/pacing/pacing_controller.h
index 0311423..6e24401 100644
--- a/modules/pacing/pacing_controller.h
+++ b/modules/pacing/pacing_controller.h
@@ -17,10 +17,10 @@
 #include <array>
 #include <memory>
 #include <optional>
+#include <span>
 #include <vector>
 
 #include "absl/base/attributes.h"
-#include "api/array_view.h"
 #include "api/field_trials_view.h"
 #include "api/rtp_packet_sender.h"
 #include "api/transport/network_types.h"
@@ -59,7 +59,7 @@
     // have been updated.
     virtual void OnAbortedRetransmissions(
         uint32_t /* ssrc */,
-        ArrayView<const uint16_t> /* sequence_numbers */) {}
+        std::span<const uint16_t> /* sequence_numbers */) {}
     virtual std::optional<uint32_t> GetRtxSsrcForMedia(
         uint32_t /* ssrc */) const {
       return std::nullopt;
@@ -133,7 +133,7 @@
   void EnqueuePacket(std::unique_ptr<RtpPacketToSend> packet);
 
   void CreateProbeClusters(
-      ArrayView<const ProbeClusterConfig> probe_cluster_configs);
+      std::span<const ProbeClusterConfig> probe_cluster_configs);
 
   void Pause();   // Temporarily pause all sending.
   void Resume();  // Resume sending packets.
diff --git a/modules/pacing/pacing_controller_unittest.cc b/modules/pacing/pacing_controller_unittest.cc
index 84fa97c..0370248 100644
--- a/modules/pacing/pacing_controller_unittest.cc
+++ b/modules/pacing/pacing_controller_unittest.cc
@@ -17,10 +17,10 @@
 #include <cstdlib>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/field_trials.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
@@ -139,7 +139,7 @@
   MOCK_METHOD(size_t, SendPadding, (size_t target_size));
   MOCK_METHOD(void,
               OnAbortedRetransmissions,
-              (uint32_t, ArrayView<const uint16_t>),
+              (uint32_t, std::span<const uint16_t>),
               (override));
   MOCK_METHOD(std::optional<uint32_t>,
               GetRtxSsrcForMedia,
@@ -167,7 +167,7 @@
               (override));
   MOCK_METHOD(void,
               OnAbortedRetransmissions,
-              (uint32_t, ArrayView<const uint16_t>),
+              (uint32_t, std::span<const uint16_t>),
               (override));
   MOCK_METHOD(std::optional<uint32_t>,
               GetRtxSsrcForMedia,
@@ -205,7 +205,7 @@
     return packets;
   }
 
-  void OnAbortedRetransmissions(uint32_t, ArrayView<const uint16_t>) override {}
+  void OnAbortedRetransmissions(uint32_t, std::span<const uint16_t>) override {}
   std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
     return std::nullopt;
   }
@@ -265,7 +265,7 @@
     return packets;
   }
 
-  void OnAbortedRetransmissions(uint32_t, ArrayView<const uint16_t>) override {}
+  void OnAbortedRetransmissions(uint32_t, std::span<const uint16_t>) override {}
   std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
     return std::nullopt;
   }
diff --git a/modules/pacing/packet_router.cc b/modules/pacing/packet_router.cc
index 67c3a63..a8b4aea 100644
--- a/modules/pacing/packet_router.cc
+++ b/modules/pacing/packet_router.cc
@@ -14,11 +14,11 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/functional/any_invocable.h"
-#include "api/array_view.h"
 #include "api/rtp_headers.h"
 #include "api/sequence_checker.h"
 #include "api/transport/network_types.h"
@@ -291,7 +291,7 @@
 
 void PacketRouter::OnAbortedRetransmissions(
     uint32_t ssrc,
-    ArrayView<const uint16_t> sequence_numbers) {
+    std::span<const uint16_t> sequence_numbers) {
   RTC_DCHECK_RUN_ON(&thread_checker_);
   auto it = send_modules_map_.find(ssrc);
   if (it != send_modules_map_.end()) {
diff --git a/modules/pacing/packet_router.h b/modules/pacing/packet_router.h
index 2a7336a..7b0ab39 100644
--- a/modules/pacing/packet_router.h
+++ b/modules/pacing/packet_router.h
@@ -19,11 +19,11 @@
 #include <memory>
 #include <optional>
 #include <set>
+#include <span>
 #include <unordered_map>
 #include <vector>
 
 #include "absl/functional/any_invocable.h"
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_size.h"
@@ -79,7 +79,7 @@
       DataSize size) override;
   void OnAbortedRetransmissions(
       uint32_t ssrc,
-      ArrayView<const uint16_t> sequence_numbers) override;
+      std::span<const uint16_t> sequence_numbers) override;
   std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t ssrc) const override;
   void OnBatchComplete() override;
 
diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h
index 78cccb3..027969a 100644
--- a/modules/rtp_rtcp/source/rtp_packet.h
+++ b/modules/rtp_rtcp/source/rtp_packet.h
@@ -203,7 +203,7 @@
   ExtensionInfo& FindOrCreateExtensionInfo(int id);
 
   // Allocates and returns place to store rtp header extension.
-  // Returns empty arrayview on failure.
+  // Returns empty std::span on failure.
   std::span<uint8_t> AllocateRawExtension(int id, size_t length);
 
   // Promotes existing one-byte header extensions to two-byte header extensions
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 029ddb6..74c0115 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -47,7 +47,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../common_video/generic_frame_descriptor",
     "../../rtc_base:checks",
     "../../rtc_base:logging",
@@ -113,7 +112,6 @@
     ":codec_globals_headers",
     ":h264_sprop_parameter_sets",
     ":packet_buffer",
-    "../../api:array_view",
     "../../api/video:video_frame",
     "../../api/video:video_frame_type",
     "../../common_video",
@@ -199,7 +197,6 @@
     "..:module_api",
     "..:module_api_public",
     "..:module_fec_api",
-    "../../api:array_view",
     "../../api:fec_controller_api",
     "../../api:field_trials_view",
     "../../api:rtp_packet_info",
@@ -338,7 +335,6 @@
   ]
 
   deps = [
-    "../../api:array_view",
     "../../api:field_trials_view",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
@@ -619,7 +615,6 @@
     ":video_codec_interface",
     ":video_coding_utility",
     ":webrtc_libvpx_interface",
-    "../../api:array_view",
     "../../api:fec_controller_api",
     "../../api:field_trials_view",
     "../../api:refcountedbase",
@@ -854,7 +849,6 @@
       ":video_coding_utility",
       ":videocodec_test_stats_impl",
       ":webrtc_vp9_helpers",
-      "../../api:array_view",
       "../../api:field_trials_view",
       "../../api:make_ref_counted",
       "../../api:rtp_parameters",
@@ -993,7 +987,6 @@
       ":webrtc_vp8",
       ":webrtc_vp9",
       ":webrtc_vp9_helpers",
-      "../../api:array_view",
       "../../api:create_frame_generator",
       "../../api:create_videocodec_test_fixture_api",
       "../../api:field_trials",
@@ -1131,7 +1124,6 @@
       ":webrtc_vp9_helpers",
       "..:module_api",
       "..:module_fec_api",
-      "../../api:array_view",
       "../../api:create_frame_generator",
       "../../api:create_simulcast_test_fixture_api",
       "../../api:fec_controller_api",
diff --git a/modules/video_coding/codecs/av1/BUILD.gn b/modules/video_coding/codecs/av1/BUILD.gn
index 5d6156f..3490a9f 100644
--- a/modules/video_coding/codecs/av1/BUILD.gn
+++ b/modules/video_coding/codecs/av1/BUILD.gn
@@ -121,7 +121,6 @@
       ":av1_svc_config",
       ":dav1d_decoder",
       "../..:video_codec_interface",
-      "../../../../api:array_view",
       "../../../../api:field_trials",
       "../../../../api:make_ref_counted",
       "../../../../api:scoped_refptr",
diff --git a/modules/video_coding/codecs/av1/dav1d_decoder_unittest.cc b/modules/video_coding/codecs/av1/dav1d_decoder_unittest.cc
index 217edc1..edb969e 100644
--- a/modules/video_coding/codecs/av1/dav1d_decoder_unittest.cc
+++ b/modules/video_coding/codecs/av1/dav1d_decoder_unittest.cc
@@ -13,9 +13,9 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
 #include "api/video/color_space.h"
@@ -45,7 +45,7 @@
     0x22, 0x02, 0x02, 0x03, 0x08, 0x32, 0x0e, 0x10, 0x00, 0xac, 0x02, 0x05,
     0x14, 0x20, 0x81, 0x00, 0x02, 0x00, 0x95, 0xe1, 0xe0};
 
-EncodedImage CreateEncodedImage(ArrayView<const uint8_t> data) {
+EncodedImage CreateEncodedImage(std::span<const uint8_t> data) {
   EncodedImage image;
   image.SetEncodedData(EncodedImageBuffer::Create(data.data(), data.size()));
   return image;
diff --git a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
index 4260669..5c60bdb 100644
--- a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
@@ -24,7 +24,6 @@
 #include "absl/strings/match.h"
 #include "absl/strings/str_replace.h"
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "api/environment/environment_factory.h"
 #include "api/field_trials_view.h"
 #include "api/make_ref_counted.h"
diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc b/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc
index 77740ef..0dafd3e 100644
--- a/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc
+++ b/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc
@@ -17,8 +17,8 @@
 #include <cstdint>
 #include <cstring>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/scoped_refptr.h"
 #include "api/video/color_space.h"
 #include "api/video/encoded_image.h"
@@ -209,7 +209,7 @@
   if (input_image.IsKey()) {
     std::optional<Vp9UncompressedHeader> frame_info =
         ParseUncompressedVp9Header(
-            MakeArrayView(input_image.data(), input_image.size()));
+            std::span(input_image.data(), input_image.size()));
     if (frame_info) {
       RenderResolution frame_resolution(frame_info->frame_width,
                                         frame_info->frame_height);
diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc
index 105a6e8..d757f1a 100644
--- a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc
+++ b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc
@@ -21,12 +21,12 @@
 #include <memory>
 #include <numeric>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
 #include "absl/algorithm/container.h"
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/fec_controller_override.h"
 #include "api/field_trials_view.h"
@@ -203,7 +203,7 @@
 }
 
 vpx_svc_ref_frame_config_t Vp9References(
-    ArrayView<const ScalableVideoController::LayerFrameConfig> layers) {
+    std::span<const ScalableVideoController::LayerFrameConfig> layers) {
   vpx_svc_ref_frame_config_t ref_config = {};
   for (const ScalableVideoController::LayerFrameConfig& layer_frame : layers) {
     const auto& buffers = layer_frame.Buffers();
diff --git a/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc b/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc
index c6ffdb9..30884f4 100644
--- a/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc
+++ b/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc
@@ -14,13 +14,13 @@
 #include <functional>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <tuple>
 #include <vector>
 
 #include "absl/container/inlined_vector.h"
 #include "absl/memory/memory.h"
-#include "api/array_view.h"
 #include "api/environment/environment_factory.h"
 #include "api/field_trials.h"
 #include "api/make_ref_counted.h"
@@ -2116,7 +2116,7 @@
     if (picture_idx == 0) {
       EXPECT_EQ(vp9.num_ref_pics, 0) << "Frame " << i;
     } else {
-      EXPECT_THAT(MakeArrayView(vp9.p_diff, vp9.num_ref_pics),
+      EXPECT_THAT(std::span(vp9.p_diff, vp9.num_ref_pics),
                   UnorderedElementsAreArray(gof.pid_diff[gof_idx],
                                             gof.num_ref_pics[gof_idx]))
           << "Frame " << i;
diff --git a/modules/video_coding/frame_dependencies_calculator.cc b/modules/video_coding/frame_dependencies_calculator.cc
index ca046f2..2d28a41 100644
--- a/modules/video_coding/frame_dependencies_calculator.cc
+++ b/modules/video_coding/frame_dependencies_calculator.cc
@@ -14,10 +14,10 @@
 #include <iterator>
 #include <optional>
 #include <set>
+#include <span>
 
 #include "absl/algorithm/container.h"
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -26,7 +26,7 @@
 
 absl::InlinedVector<int64_t, 5> FrameDependenciesCalculator::FromBuffersUsage(
     int64_t frame_id,
-    ArrayView<const CodecBufferUsage> buffers_usage) {
+    std::span<const CodecBufferUsage> buffers_usage) {
   absl::InlinedVector<int64_t, 5> dependencies;
   RTC_DCHECK_GT(buffers_usage.size(), 0);
   for (const CodecBufferUsage& buffer_usage : buffers_usage) {
diff --git a/modules/video_coding/frame_dependencies_calculator.h b/modules/video_coding/frame_dependencies_calculator.h
index 3a354c5..d9da436 100644
--- a/modules/video_coding/frame_dependencies_calculator.h
+++ b/modules/video_coding/frame_dependencies_calculator.h
@@ -14,9 +14,9 @@
 #include <stdint.h>
 
 #include <optional>
+#include <span>
 
 #include "absl/container/inlined_vector.h"
-#include "api/array_view.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 
 namespace webrtc {
@@ -32,7 +32,7 @@
   // Calculates frame dependencies based on previous encoder buffer usage.
   absl::InlinedVector<int64_t, 5> FromBuffersUsage(
       int64_t frame_id,
-      ArrayView<const CodecBufferUsage> buffers_usage);
+      std::span<const CodecBufferUsage> buffers_usage);
 
  private:
   struct BufferUsage {
diff --git a/modules/video_coding/generic_decoder_unittest.cc b/modules/video_coding/generic_decoder_unittest.cc
index 7c08345..23ecf26 100644
--- a/modules/video_coding/generic_decoder_unittest.cc
+++ b/modules/video_coding/generic_decoder_unittest.cc
@@ -12,10 +12,10 @@
 
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/field_trials.h"
 #include "api/rtp_packet_infos.h"
 #include "api/scoped_refptr.h"
@@ -75,7 +75,7 @@
     return ret;
   }
 
-  ArrayView<const VideoFrame> GetAllFrames() const { return frames_; }
+  std::span<const VideoFrame> GetAllFrames() const { return frames_; }
 
   void OnDroppedFrames(uint32_t frames_dropped) override {
     frames_dropped_ += frames_dropped;
diff --git a/modules/video_coding/h264_sps_pps_tracker.cc b/modules/video_coding/h264_sps_pps_tracker.cc
index 3f76077..ebd8035 100644
--- a/modules/video_coding/h264_sps_pps_tracker.cc
+++ b/modules/video_coding/h264_sps_pps_tracker.cc
@@ -13,10 +13,10 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/video_codec_type.h"
 #include "common_video/h264/h264_common.h"
 #include "common_video/h264/pps_parser.h"
@@ -35,7 +35,7 @@
 }  // namespace
 
 H264SpsPpsTracker::FixedBitstream H264SpsPpsTracker::CopyAndFixBitstream(
-    ArrayView<const uint8_t> bitstream,
+    std::span<const uint8_t> bitstream,
     RTPVideoHeader* video_header) {
   RTC_DCHECK(video_header);
   RTC_DCHECK(video_header->codec == kVideoCodecH264);
@@ -206,9 +206,9 @@
     return;
   }
   std::optional<SpsParser::SpsState> parsed_sps = SpsParser::ParseSps(
-      ArrayView<const uint8_t>(sps).subspan(kNaluHeaderOffset));
+      std::span<const uint8_t>(sps).subspan(kNaluHeaderOffset));
   std::optional<PpsParser::PpsState> parsed_pps = PpsParser::ParsePps(
-      ArrayView<const uint8_t>(pps).subspan(kNaluHeaderOffset));
+      std::span<const uint8_t>(pps).subspan(kNaluHeaderOffset));
 
   if (!parsed_sps) {
     RTC_LOG(LS_WARNING) << "Failed to parse SPS.";
diff --git a/modules/video_coding/h264_sps_pps_tracker.h b/modules/video_coding/h264_sps_pps_tracker.h
index 132aaa0..b8c04c0 100644
--- a/modules/video_coding/h264_sps_pps_tracker.h
+++ b/modules/video_coding/h264_sps_pps_tracker.h
@@ -14,9 +14,9 @@
 #include <cstddef>
 #include <cstdint>
 #include <map>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "modules/rtp_rtcp/source/rtp_video_header.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/copy_on_write_buffer.h"
@@ -38,7 +38,7 @@
   ~H264SpsPpsTracker() = default;
 
   // Returns fixed bitstream and modifies `video_header`.
-  FixedBitstream CopyAndFixBitstream(ArrayView<const uint8_t> bitstream,
+  FixedBitstream CopyAndFixBitstream(std::span<const uint8_t> bitstream,
                                      RTPVideoHeader* video_header);
 
   void InsertSpsPpsNalus(const std::vector<uint8_t>& sps,
diff --git a/modules/video_coding/h264_sps_pps_tracker_unittest.cc b/modules/video_coding/h264_sps_pps_tracker_unittest.cc
index 079049d..adb2307 100644
--- a/modules/video_coding/h264_sps_pps_tracker_unittest.cc
+++ b/modules/video_coding/h264_sps_pps_tracker_unittest.cc
@@ -11,9 +11,9 @@
 #include "modules/video_coding/h264_sps_pps_tracker.h"
 
 #include <cstdint>
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/video_codec_type.h"
 #include "common_video/h264/h264_common.h"
 #include "modules/rtp_rtcp/source/rtp_video_header.h"
@@ -30,7 +30,7 @@
 
 const uint8_t start_code[] = {0, 0, 0, 1};
 
-ArrayView<const uint8_t> Bitstream(
+std::span<const uint8_t> Bitstream(
     const H264SpsPpsTracker::FixedBitstream& fixed) {
   return fixed.bitstream;
 }
diff --git a/modules/video_coding/h26x_packet_buffer.cc b/modules/video_coding/h26x_packet_buffer.cc
index 10c22f3..cee203a 100644
--- a/modules/video_coding/h26x_packet_buffer.cc
+++ b/modules/video_coding/h26x_packet_buffer.cc
@@ -17,12 +17,12 @@
 #include <limits>
 #include <memory>
 #include <optional>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "absl/algorithm/container.h"
-#include "api/array_view.h"
 #include "api/video/video_codec_type.h"
 #include "api/video/video_frame_type.h"
 #include "common_video/h264/h264_common.h"
@@ -77,7 +77,7 @@
   });
 }
 
-int64_t* GetContinuousSequence(ArrayView<int64_t> last_continuous,
+int64_t* GetContinuousSequence(std::span<int64_t> last_continuous,
                                int64_t unwrapped_seq_num) {
   for (int64_t& last : last_continuous) {
     if (unwrapped_seq_num - 1 == last) {
@@ -361,9 +361,9 @@
     return;
   }
   std::optional<SpsParser::SpsState> parsed_sps = SpsParser::ParseSps(
-      ArrayView<const uint8_t>(sps).subspan(kNaluHeaderOffset));
+      std::span<const uint8_t>(sps).subspan(kNaluHeaderOffset));
   std::optional<PpsParser::PpsState> parsed_pps = PpsParser::ParsePps(
-      ArrayView<const uint8_t>(pps).subspan(kNaluHeaderOffset));
+      std::span<const uint8_t>(pps).subspan(kNaluHeaderOffset));
 
   if (!parsed_sps) {
     RTC_LOG(LS_WARNING) << "Failed to parse SPS.";
diff --git a/modules/video_coding/h26x_packet_buffer_unittest.cc b/modules/video_coding/h26x_packet_buffer_unittest.cc
index f786776..8a50b78 100644
--- a/modules/video_coding/h26x_packet_buffer_unittest.cc
+++ b/modules/video_coding/h26x_packet_buffer_unittest.cc
@@ -12,11 +12,11 @@
 #include <cstdint>
 #include <cstring>
 #include <memory>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/render_resolution.h"
 #include "api/video/video_codec_type.h"
 #include "api/video/video_frame_type.h"
@@ -378,7 +378,7 @@
 }
 #endif
 
-ArrayView<const uint8_t> PacketPayload(
+std::span<const uint8_t> PacketPayload(
     const std::unique_ptr<H26xPacketBuffer::Packet>& packet) {
   return packet->video_payload;
 }
diff --git a/modules/video_coding/loss_notification_controller.cc b/modules/video_coding/loss_notification_controller.cc
index 97f86dc..4f4a008 100644
--- a/modules/video_coding/loss_notification_controller.cc
+++ b/modules/video_coding/loss_notification_controller.cc
@@ -12,8 +12,8 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "modules/include/module_common_types.h"
 #include "rtc_base/checks.h"
@@ -113,7 +113,7 @@
     uint16_t first_seq_num,
     int64_t frame_id,
     bool discardable,
-    ArrayView<const int64_t> frame_dependencies) {
+    std::span<const int64_t> frame_dependencies) {
   RTC_DCHECK_RUN_ON(&sequence_checker_);
 
   DiscardOldInformation();  // Prevent memory overconsumption.
@@ -139,7 +139,7 @@
 }
 
 bool LossNotificationController::AllDependenciesDecodable(
-    ArrayView<const int64_t> frame_dependencies) const {
+    std::span<const int64_t> frame_dependencies) const {
   RTC_DCHECK_RUN_ON(&sequence_checker_);
 
   // Due to packet reordering, frame buffering and asynchronous decoders, it is
diff --git a/modules/video_coding/loss_notification_controller.h b/modules/video_coding/loss_notification_controller.h
index f6b9992..0726584 100644
--- a/modules/video_coding/loss_notification_controller.h
+++ b/modules/video_coding/loss_notification_controller.h
@@ -15,8 +15,8 @@
 
 #include <optional>
 #include <set>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/sequence_checker.h"
 #include "modules/include/module_common_types.h"
 #include "rtc_base/system/no_unique_address.h"
@@ -29,7 +29,7 @@
   struct FrameDetails {
     bool is_keyframe;
     int64_t frame_id;
-    ArrayView<const int64_t> frame_dependencies;
+    std::span<const int64_t> frame_dependencies;
   };
 
   LossNotificationController(KeyFrameRequestSender* key_frame_request_sender,
@@ -45,13 +45,13 @@
   void OnAssembledFrame(uint16_t first_seq_num,
                         int64_t frame_id,
                         bool discardable,
-                        ArrayView<const int64_t> frame_dependencies);
+                        std::span<const int64_t> frame_dependencies);
 
  private:
   void DiscardOldInformation();
 
   bool AllDependenciesDecodable(
-      ArrayView<const int64_t> frame_dependencies) const;
+      std::span<const int64_t> frame_dependencies) const;
 
   // When the loss of a packet or the non-decodability of a frame is detected,
   // produces a key frame request or a loss notification.
diff --git a/modules/video_coding/packet_buffer_unittest.cc b/modules/video_coding/packet_buffer_unittest.cc
index af994c1..29f13e4 100644
--- a/modules/video_coding/packet_buffer_unittest.cc
+++ b/modules/video_coding/packet_buffer_unittest.cc
@@ -14,10 +14,10 @@
 #include <limits>
 #include <memory>
 #include <ostream>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/video_codec_type.h"
 #include "api/video/video_frame_type.h"
 #include "common_video/h264/h264_common.h"
@@ -48,7 +48,7 @@
 // Validates frame boundaries are valid and returns first sequence_number for
 // each frame.
 std::vector<uint16_t> StartSeqNums(
-    ArrayView<const std::unique_ptr<PacketBuffer::Packet>> packets) {
+    std::span<const std::unique_ptr<PacketBuffer::Packet>> packets) {
   std::vector<uint16_t> result;
   bool frame_boundary = true;
   for (const auto& packet : packets) {
@@ -117,7 +117,7 @@
                                   IsKeyFrame keyframe,  // is keyframe
                                   IsFirst first,  // is first packet of frame
                                   IsLast last,    // is last packet of frame
-                                  ArrayView<const uint8_t> data = {},
+                                  std::span<const uint8_t> data = {},
                                   uint32_t timestamp = 123u) {  // rtp timestamp
     auto packet = std::make_unique<PacketBuffer::Packet>();
     packet->video_header.codec = kVideoCodecGeneric;
@@ -421,7 +421,7 @@
       IsFirst first,        // is first packet of frame
       IsLast last,          // is last packet of frame
       uint32_t timestamp,   // rtp timestamp
-      ArrayView<const uint8_t> data = {},
+      std::span<const uint8_t> data = {},
       uint32_t width = 0,      // width of frame (SPS/IDR)
       uint32_t height = 0,     // height of frame (SPS/IDR)
       bool generic = false) {  // has generic descriptor
@@ -459,7 +459,7 @@
       IsFirst first,        // is first packet of frame
       IsLast last,          // is last packet of frame
       uint32_t timestamp,   // rtp timestamp
-      ArrayView<const uint8_t> data = {},
+      std::span<const uint8_t> data = {},
       uint32_t width = 0,     // width of frame (SPS/IDR)
       uint32_t height = 0) {  // height of frame (SPS/IDR)
     auto packet = std::make_unique<PacketBuffer::Packet>();
diff --git a/modules/video_coding/rtp_vp8_ref_finder_unittest.cc b/modules/video_coding/rtp_vp8_ref_finder_unittest.cc
index 0ed70b2..b52d1fb 100644
--- a/modules/video_coding/rtp_vp8_ref_finder_unittest.cc
+++ b/modules/video_coding/rtp_vp8_ref_finder_unittest.cc
@@ -13,10 +13,10 @@
 #include <cstdint>
 #include <memory>
 #include <optional>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/rtp_packet_infos.h"
 #include "api/video/encoded_frame.h"
 #include "api/video/encoded_image.h"
@@ -44,7 +44,7 @@
 MATCHER_P2(HasIdAndRefs, id, refs, "") {
   return Matches(Eq(id))(arg->Id()) &&
          Matches(UnorderedElementsAreArray(refs))(
-             ArrayView<int64_t>(arg->references, arg->num_references));
+             std::span<int64_t>(arg->references, arg->num_references));
 }
 
 Matcher<const std::vector<std::unique_ptr<EncodedFrame>>&>
diff --git a/modules/video_coding/rtp_vp9_ref_finder_unittest.cc b/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
index ab3c67b..0863325 100644
--- a/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
+++ b/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
@@ -16,10 +16,10 @@
 #include <memory>
 #include <optional>
 #include <ostream>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/rtp_packet_infos.h"
 #include "api/video/encoded_frame.h"
 #include "api/video/encoded_image.h"
@@ -192,7 +192,7 @@
       return false;
     }
 
-    ArrayView<int64_t> actual_refs((*it)->references, (*it)->num_references);
+    std::span<int64_t> actual_refs((*it)->references, (*it)->num_references);
     if (!Matches(UnorderedElementsAreArray(expected_refs_))(actual_refs)) {
       if (result_listener->IsInterested()) {
         *result_listener << "Frame with frame_id:" << frame_id_ << " and "
diff --git a/modules/video_coding/svc/BUILD.gn b/modules/video_coding/svc/BUILD.gn
index 7a7864b..dc08441 100644
--- a/modules/video_coding/svc/BUILD.gn
+++ b/modules/video_coding/svc/BUILD.gn
@@ -127,7 +127,6 @@
       ":scalable_video_controller",
       "..:chain_diff_calculator",
       "..:frame_dependencies_calculator",
-      "../../../api:array_view",
       "../../../api/transport/rtp:dependency_descriptor",
       "../../../api/video:video_bitrate_allocation",
       "../../../api/video:video_frame",
diff --git a/modules/video_coding/svc/scalability_structure_key_svc_unittest.cc b/modules/video_coding/svc/scalability_structure_key_svc_unittest.cc
index 145a278..71d64a3 100644
--- a/modules/video_coding/svc/scalability_structure_key_svc_unittest.cc
+++ b/modules/video_coding/svc/scalability_structure_key_svc_unittest.cc
@@ -9,9 +9,9 @@
  */
 #include "modules/video_coding/svc/scalability_structure_key_svc.h"
 
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 #include "modules/video_coding/svc/scalability_structure_test_helpers.h"
 #include "test/gmock.h"
@@ -234,7 +234,7 @@
   EXPECT_EQ(frames[13].temporal_id, 0);
   EXPECT_EQ(frames[14].temporal_id, 0);
   EXPECT_EQ(frames[15].temporal_id, 0);
-  auto all_frames = MakeArrayView(frames.data(), frames.size());
+  auto all_frames = std::span(frames.data(), frames.size());
   EXPECT_TRUE(wrapper.FrameReferencesAreValid(all_frames.subspan(0, 13)));
   // Frames starting from the frame#13 should not reference any earlier frames.
   EXPECT_TRUE(wrapper.FrameReferencesAreValid(all_frames.subspan(13)));
diff --git a/modules/video_coding/svc/scalability_structure_l2t2_key_shift_unittest.cc b/modules/video_coding/svc/scalability_structure_l2t2_key_shift_unittest.cc
index 1532940..ebf3ce4 100644
--- a/modules/video_coding/svc/scalability_structure_l2t2_key_shift_unittest.cc
+++ b/modules/video_coding/svc/scalability_structure_l2t2_key_shift_unittest.cc
@@ -9,9 +9,9 @@
  */
 #include "modules/video_coding/svc/scalability_structure_l2t2_key_shift.h"
 
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 #include "modules/video_coding/svc/scalability_structure_test_helpers.h"
 #include "test/gmock.h"
@@ -236,8 +236,7 @@
   EXPECT_THAT(frames[4].temporal_id, 1);
 
   // Expect frame[5] to be a key frame.
-  EXPECT_TRUE(
-      wrapper.FrameReferencesAreValid(MakeArrayView(frames.data() + 5, 4)));
+  EXPECT_TRUE(wrapper.FrameReferencesAreValid(std::span(frames.data() + 5, 4)));
 
   EXPECT_THAT(frames[5].spatial_id, 0);
   EXPECT_THAT(frames[6].spatial_id, 1);
diff --git a/modules/video_coding/svc/scalability_structure_test_helpers.cc b/modules/video_coding/svc/scalability_structure_test_helpers.cc
index 004b7d2..7b4f1e4 100644
--- a/modules/video_coding/svc/scalability_structure_test_helpers.cc
+++ b/modules/video_coding/svc/scalability_structure_test_helpers.cc
@@ -12,10 +12,10 @@
 #include <bitset>
 #include <cstddef>
 #include <cstdint>
+#include <span>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 #include "modules/video_coding/chain_diff_calculator.h"
@@ -66,7 +66,7 @@
 }
 
 bool ScalabilityStructureWrapper::FrameReferencesAreValid(
-    ArrayView<const GenericFrameInfo> frames) const {
+    std::span<const GenericFrameInfo> frames) const {
   bool valid = true;
   // VP9 and AV1 supports up to 8 buffers. Expect no more buffers are not used.
   std::bitset<8> buffer_contains_frame;
diff --git a/modules/video_coding/svc/scalability_structure_test_helpers.h b/modules/video_coding/svc/scalability_structure_test_helpers.h
index 42257b5..ddc492a 100644
--- a/modules/video_coding/svc/scalability_structure_test_helpers.h
+++ b/modules/video_coding/svc/scalability_structure_test_helpers.h
@@ -12,9 +12,9 @@
 
 #include <stdint.h>
 
+#include <span>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "common_video/generic_frame_descriptor/generic_frame_info.h"
 #include "modules/video_coding/chain_diff_calculator.h"
@@ -43,7 +43,7 @@
   // Returns false and ADD_FAILUREs for frames with invalid references.
   // In particular validates no frame frame reference to frame before frames[0].
   // In error messages frames are indexed starting with 0.
-  bool FrameReferencesAreValid(ArrayView<const GenericFrameInfo> frames) const;
+  bool FrameReferencesAreValid(std::span<const GenericFrameInfo> frames) const;
 
  private:
   ScalableVideoController& structure_controller_;
diff --git a/modules/video_coding/svc/scalability_structure_unittest.cc b/modules/video_coding/svc/scalability_structure_unittest.cc
index 849f08f..1d95c6f 100644
--- a/modules/video_coding/svc/scalability_structure_unittest.cc
+++ b/modules/video_coding/svc/scalability_structure_unittest.cc
@@ -14,11 +14,11 @@
 #include <optional>
 #include <ostream>
 #include <set>
+#include <span>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "api/array_view.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "api/video_codecs/scalability_mode.h"
@@ -115,14 +115,12 @@
       controller->StreamConfig();
   EXPECT_EQ(config.num_spatial_layers, static_config->num_spatial_layers);
   EXPECT_EQ(config.num_temporal_layers, static_config->num_temporal_layers);
-  EXPECT_THAT(
-      MakeArrayView(config.scaling_factor_num, config.num_spatial_layers),
-      ElementsAreArray(static_config->scaling_factor_num,
-                       static_config->num_spatial_layers));
-  EXPECT_THAT(
-      MakeArrayView(config.scaling_factor_den, config.num_spatial_layers),
-      ElementsAreArray(static_config->scaling_factor_den,
-                       static_config->num_spatial_layers));
+  EXPECT_THAT(std::span(config.scaling_factor_num, config.num_spatial_layers),
+              ElementsAreArray(static_config->scaling_factor_num,
+                               static_config->num_spatial_layers));
+  EXPECT_THAT(std::span(config.scaling_factor_den, config.num_spatial_layers),
+              ElementsAreArray(static_config->scaling_factor_den,
+                               static_config->num_spatial_layers));
 }
 
 TEST_P(ScalabilityStructureTest,
diff --git a/modules/video_coding/utility/qp_parser.cc b/modules/video_coding/utility/qp_parser.cc
index 491bae8..95cf4fd 100644
--- a/modules/video_coding/utility/qp_parser.cc
+++ b/modules/video_coding/utility/qp_parser.cc
@@ -13,8 +13,8 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 
-#include "api/array_view.h"
 #include "api/video/video_codec_constants.h"
 #include "api/video/video_codec_type.h"
 #include "modules/video_coding/utility/vp8_header_parser.h"
@@ -58,7 +58,7 @@
                                                       size_t frame_size) {
   MutexLock lock(&mutex_);
   bitstream_parser_.ParseBitstream(
-      ArrayView<const uint8_t>(frame_data, frame_size));
+      std::span<const uint8_t>(frame_data, frame_size));
   return bitstream_parser_.GetLastSliceQp();
 }
 
@@ -67,7 +67,7 @@
                                                       size_t frame_size) {
   MutexLock lock(&mutex_);
   bitstream_parser_.ParseBitstream(
-      ArrayView<const uint8_t>(frame_data, frame_size));
+      std::span<const uint8_t>(frame_data, frame_size));
   return bitstream_parser_.GetLastSliceQp();
 }
 #endif
diff --git a/modules/video_coding/utility/vp9_uncompressed_header_parser.cc b/modules/video_coding/utility/vp9_uncompressed_header_parser.cc
index ca3c859..4219ecd 100644
--- a/modules/video_coding/utility/vp9_uncompressed_header_parser.cc
+++ b/modules/video_coding/utility/vp9_uncompressed_header_parser.cc
@@ -12,10 +12,10 @@
 #include <cstddef>
 #include <cstdint>
 #include <optional>
+#include <span>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/array_view.h"
 #include "modules/video_coding/utility/vp9_constants.h"
 #include "rtc_base/bitstream_reader.h"
 #include "rtc_base/logging.h"
@@ -513,7 +513,7 @@
 }
 
 std::optional<Vp9UncompressedHeader> ParseUncompressedVp9Header(
-    ArrayView<const uint8_t> buf) {
+    std::span<const uint8_t> buf) {
   BitstreamReader reader(buf);
   Vp9UncompressedHeader frame_info;
   Parse(reader, &frame_info, /*qp_only=*/false);
@@ -526,7 +526,7 @@
 namespace vp9 {
 
 bool GetQp(const uint8_t* buf, size_t length, int* qp) {
-  BitstreamReader reader(MakeArrayView(buf, length));
+  BitstreamReader reader(std::span(buf, length));
   Vp9UncompressedHeader frame_info;
   Parse(reader, &frame_info, /*qp_only=*/true);
   if (!reader.Ok()) {
diff --git a/modules/video_coding/utility/vp9_uncompressed_header_parser.h b/modules/video_coding/utility/vp9_uncompressed_header_parser.h
index 0153a3b..400559b 100644
--- a/modules/video_coding/utility/vp9_uncompressed_header_parser.h
+++ b/modules/video_coding/utility/vp9_uncompressed_header_parser.h
@@ -17,9 +17,9 @@
 #include <array>
 #include <bitset>
 #include <optional>
+#include <span>
 #include <string>
 
-#include "api/array_view.h"
 #include "modules/video_coding/utility/vp9_constants.h"
 
 namespace webrtc {
@@ -151,7 +151,7 @@
 // Parses the uncompressed header and populates (most) values in a
 // UncompressedHeader struct. Returns nullopt on failure.
 std::optional<Vp9UncompressedHeader> ParseUncompressedVp9Header(
-    ArrayView<const uint8_t> buf);
+    std::span<const uint8_t> buf);
 
 }  // namespace webrtc