Use std::span in ToRtpCapabilities

Make ToRtpCapabilities take std::span<const Codec> and
std::span<const RtpHeaderExtensionCapability> instead of vector.

Rename GetDefaultEnabledRtpHeaderExtensions to
GetDefaultEnabledRtpHeaderCapabilities and make it return
std::vector<RtpHeaderExtensionCapability> instead of RtpExtension.
Remove the old GetDefaultEnabledRtpHeaderExtensions.

Update tests and callers to match the new signatures.
In voice engine test, convert capabilities to extensions when needed.

Bug: webrtc:514817938
Change-Id: I742abe7c3459ffb48466129dbec914ccb659cbe5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/479801
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47933}
diff --git a/media/base/media_engine.cc b/media/base/media_engine.cc
index 5fa4529..281837e 100644
--- a/media/base/media_engine.cc
+++ b/media/base/media_engine.cc
@@ -22,7 +22,6 @@
 #include "absl/algorithm/container.h"
 #include "api/field_trials_view.h"
 #include "api/rtc_error.h"
-#include "api/rtp_header_extension_id.h"
 #include "api/rtp_headers.h"
 #include "api/rtp_parameters.h"
 #include "api/rtp_transceiver_direction.h"
@@ -93,18 +92,6 @@
   return extensions;
 }
 
-std::vector<RtpExtension> GetDefaultEnabledRtpHeaderExtensions(
-    const RtpHeaderExtensionQueryInterface& query_interface,
-    const FieldTrialsView* field_trials) {
-  std::vector<RtpExtension> extensions;
-  for (const RtpHeaderExtensionCapability& entry :
-       GetDefaultEnabledRtpHeaderCapabilities(query_interface, field_trials)) {
-    extensions.emplace_back(
-        entry.uri, entry.preferred_id.value_or(RtpHeaderExtensionId::NotSet()));
-  }
-  return extensions;
-}
-
 RTCError CheckScalabilityModeValues(const RtpParameters& rtp_parameters,
                                     std::span<const Codec> send_codecs,
                                     std::optional<Codec> send_codec) {
diff --git a/media/base/media_engine.h b/media/base/media_engine.h
index c5abbe3..eca6629 100644
--- a/media/base/media_engine.h
+++ b/media/base/media_engine.h
@@ -309,10 +309,6 @@
 // GetCapabilities(). The returned vector only shows what will definitely be
 // offered by default, i.e. the list of extensions returned from
 // GetRtpHeaderExtensions() that are not kStopped.
-std::vector<RtpExtension> GetDefaultEnabledRtpHeaderExtensions(
-    const RtpHeaderExtensionQueryInterface& query_interface,
-    const FieldTrialsView* field_trials);
-
 std::vector<RtpHeaderExtensionCapability>
 GetDefaultEnabledRtpHeaderCapabilities(
     const RtpHeaderExtensionQueryInterface& query_interface,
diff --git a/media/base/media_engine_unittest.cc b/media/base/media_engine_unittest.cc
index e1d8ccd..fa28623 100644
--- a/media/base/media_engine_unittest.cc
+++ b/media/base/media_engine_unittest.cc
@@ -62,11 +62,12 @@
        RtpHeaderExtensionCapability("uri5", RtpHeaderExtensionId(5),
                                     RtpTransceiverDirection::kRecvOnly)});
   EXPECT_CALL(mock, GetRtpHeaderExtensions).WillOnce(Return(extensions));
-  EXPECT_THAT(GetDefaultEnabledRtpHeaderExtensions(mock, nullptr),
-              ElementsAre(Field(&RtpExtension::uri, StrEq("uri1")),
-                          Field(&RtpExtension::uri, StrEq("uri2")),
-                          Field(&RtpExtension::uri, StrEq("uri4")),
-                          Field(&RtpExtension::uri, StrEq("uri5"))));
+  EXPECT_THAT(
+      GetDefaultEnabledRtpHeaderCapabilities(mock, nullptr),
+      ElementsAre(Field(&RtpHeaderExtensionCapability::uri, StrEq("uri1")),
+                  Field(&RtpHeaderExtensionCapability::uri, StrEq("uri2")),
+                  Field(&RtpHeaderExtensionCapability::uri, StrEq("uri4")),
+                  Field(&RtpHeaderExtensionCapability::uri, StrEq("uri5"))));
 }
 
 // This class mocks methods declared as pure virtual in the interface.
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index c6d74b5..6381c81 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -1047,13 +1047,15 @@
 
 void WebRtcVideoEngineTest::ExpectRtpCapabilitySupport(const char* uri,
                                                        bool supported) const {
-  const std::vector<RtpExtension> header_extensions =
-      GetDefaultEnabledRtpHeaderExtensions(*engine_,
-                                           /* field_trials= */ nullptr);
+  const std::vector<RtpHeaderExtensionCapability> header_extensions =
+      GetDefaultEnabledRtpHeaderCapabilities(*engine_,
+                                             /* field_trials= */ nullptr);
   if (supported) {
-    EXPECT_THAT(header_extensions, Contains(Field(&RtpExtension::uri, uri)));
+    EXPECT_THAT(header_extensions,
+                Contains(Field(&RtpHeaderExtensionCapability::uri, uri)));
   } else {
-    EXPECT_THAT(header_extensions, Each(Field(&RtpExtension::uri, StrNe(uri))));
+    EXPECT_THAT(header_extensions,
+                Each(Field(&RtpHeaderExtensionCapability::uri, StrNe(uri))));
   }
 }
 
diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc
index d41739cd..9c270fa 100644
--- a/media/engine/webrtc_voice_engine_unittest.cc
+++ b/media/engine/webrtc_voice_engine_unittest.cc
@@ -2341,12 +2341,12 @@
 
 TEST_P(WebRtcVoiceEngineTestFake,
        SupportsTransportSequenceNumberHeaderExtension) {
-  const std::vector<RtpExtension> header_extensions =
-      GetDefaultEnabledRtpHeaderExtensions(*engine_,
-                                           /* field_trials= */ nullptr);
+  const std::vector<RtpHeaderExtensionCapability> header_extensions =
+      GetDefaultEnabledRtpHeaderCapabilities(*engine_,
+                                             /* field_trials= */ nullptr);
   EXPECT_THAT(
       header_extensions,
-      Contains(::testing::Field("uri", &RtpExtension::uri,
+      Contains(::testing::Field("uri", &RtpHeaderExtensionCapability::uri,
                                 RtpExtension::kTransportSequenceNumberUri)));
 }
 
@@ -3364,9 +3364,15 @@
   }
 
   // Set up receive extensions.
-  const std::vector<RtpExtension> header_extensions =
-      GetDefaultEnabledRtpHeaderExtensions(*engine_,
-                                           /* field_trials= */ nullptr);
+  const auto header_extensions_caps =
+      GetDefaultEnabledRtpHeaderCapabilities(*engine_,
+                                             /* field_trials= */ nullptr);
+  std::vector<RtpExtension> header_extensions;
+  for (const auto& cap : header_extensions_caps) {
+    header_extensions.emplace_back(
+        cap.uri, cap.preferred_id.value_or(RtpHeaderExtensionId::NotSet()),
+        cap.preferred_encrypt);
+  }
   AudioReceiverParameters recv_parameters;
   recv_parameters.extensions = header_extensions;
   receive_channel_->SetReceiverParameters(recv_parameters);
diff --git a/pc/rtp_parameters_conversion.cc b/pc/rtp_parameters_conversion.cc
index 3153b46..22ac23a 100644
--- a/pc/rtp_parameters_conversion.cc
+++ b/pc/rtp_parameters_conversion.cc
@@ -102,9 +102,9 @@
   return codec;
 }
 
-namespace {
-RtpCapabilities ToRtpCapabilitiesWithoutExtensions(
-    const std::vector<Codec>& cricket_codecs) {
+RtpCapabilities ToRtpCapabilities(
+    std::span<const Codec> cricket_codecs,
+    std::span<const RtpHeaderExtensionCapability> extensions) {
   RtpCapabilities capabilities;
   bool have_red = false;
   bool have_ulpfec = false;
@@ -138,6 +138,9 @@
     }
     capabilities.codecs.push_back(codec_capability);
   }
+
+  capabilities.header_extensions.assign(extensions.begin(), extensions.end());
+
   if (have_red) {
     capabilities.fec.push_back(FecMechanism::RED);
   }
@@ -149,15 +152,5 @@
   }
   return capabilities;
 }
-}  // namespace
-
-RtpCapabilities ToRtpCapabilities(
-    const std::vector<Codec>& cricket_codecs,
-    std::span<const RtpHeaderExtensionCapability> extensions) {
-  RtpCapabilities capabilities =
-      ToRtpCapabilitiesWithoutExtensions(cricket_codecs);
-  capabilities.header_extensions.assign(extensions.begin(), extensions.end());
-  return capabilities;
-}
 
 }  // namespace webrtc
diff --git a/pc/rtp_parameters_conversion.h b/pc/rtp_parameters_conversion.h
index d81ec3a..3c11c3a 100644
--- a/pc/rtp_parameters_conversion.h
+++ b/pc/rtp_parameters_conversion.h
@@ -13,7 +13,6 @@
 
 #include <optional>
 #include <span>
-#include <vector>
 
 #include "api/rtp_parameters.h"
 #include "media/base/codec.h"
@@ -38,7 +37,7 @@
 RtpCodecCapability ToRtpCodecCapability(const Codec& cricket_codec);
 
 RtpCapabilities ToRtpCapabilities(
-    const std::vector<Codec>& cricket_codecs,
+    std::span<const Codec> cricket_codecs,
     std::span<const RtpHeaderExtensionCapability> extensions);
 
 }  // namespace webrtc
diff --git a/pc/rtp_parameters_conversion_unittest.cc b/pc/rtp_parameters_conversion_unittest.cc
index 297bdd2..37ebdb7 100644
--- a/pc/rtp_parameters_conversion_unittest.cc
+++ b/pc/rtp_parameters_conversion_unittest.cc
@@ -149,15 +149,12 @@
   Codec red2 = CreateVideoCodec(127, "red");
   Codec ulpfec = CreateVideoCodec(103, "ulpfec");
   Codec flexfec = CreateVideoCodec(102, "flexfec-03");
-  Codec rtx = CreateVideoRtxCodec(014, 101);
+  Codec rtx = CreateVideoRtxCodec(104, 101);
   Codec rtx2 = CreateVideoRtxCodec(105, 109);
 
-  std::vector<RtpHeaderExtensionCapability> header_extension_caps = {
-      {RtpHeaderExtensionCapability("uri", RtpHeaderExtensionId(1)),
-       RtpHeaderExtensionCapability("uri2", RtpHeaderExtensionId(3))}};
-
-  RtpCapabilities capabilities =
-      ToRtpCapabilities({vp8, ulpfec, rtx, rtx2}, header_extension_caps);
+  RtpCapabilities capabilities = ToRtpCapabilities(
+      {{vp8, ulpfec, rtx, rtx2}},
+      {{{"uri", RtpHeaderExtensionId(1)}, {"uri2", RtpHeaderExtensionId(3)}}});
   ASSERT_EQ(3u, capabilities.codecs.size());
   EXPECT_EQ("VP8", capabilities.codecs[0].name);
   EXPECT_EQ("ulpfec", capabilities.codecs[1].name);
@@ -172,13 +169,13 @@
             capabilities.header_extensions[1].preferred_id);
   EXPECT_EQ(0u, capabilities.fec.size());
 
-  capabilities = ToRtpCapabilities({vp8, red, red2, ulpfec, rtx}, {});
+  capabilities = ToRtpCapabilities({{vp8, red, red2, ulpfec, rtx}}, {});
   EXPECT_EQ(4u, capabilities.codecs.size());
   EXPECT_THAT(
       capabilities.fec,
       UnorderedElementsAre(FecMechanism::RED, FecMechanism::RED_AND_ULPFEC));
 
-  capabilities = ToRtpCapabilities({vp8, red, flexfec}, {});
+  capabilities = ToRtpCapabilities({{vp8, red, flexfec}}, {});
   EXPECT_EQ(3u, capabilities.codecs.size());
   EXPECT_THAT(capabilities.fec,
               UnorderedElementsAre(FecMechanism::RED, FecMechanism::FLEXFEC));