Refactoring: Look up codec vendor via RtpTransceiver

This is a necessary step in the process to get codecs to be
specified per media section, not per PeerConnection.

No behavior change expected.

Bug: webrtc:360058654
Change-Id: Ifd78c9bea115e1fa79ee243fb5ccb570559233a1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/380721
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44089}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 42b5047..a07b5d6 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -486,7 +486,13 @@
   sources = [ "peer_connection_factory_proxy.h" ]
   deps = [
     ":proxy",
+    "../api:audio_options_api",
     "../api:libjingle_peerconnection_api",
+    "../api:media_stream_interface",
+    "../api:rtc_error",
+    "../api:rtp_parameters",
+    "../api:scoped_refptr",
+    "//third_party/abseil-cpp/absl/strings:string_view",
   ]
 }
 
@@ -931,15 +937,32 @@
   visibility = [ ":*" ]
   sources = [ "peer_connection_internal.h" ]
   deps = [
+    ":data_channel_utils",
     ":jsep_transport_controller",
     ":peer_connection_message_handler",
     ":rtp_transceiver",
     ":rtp_transmission_manager",
     ":sctp_data_channel",
+    ":session_description",
+    ":transport_stats",
+    ":usage_pattern",
+    "../api:candidate",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
+    "../api:media_stream_interface",
+    "../api:rtc_error",
+    "../api:rtp_parameters",
+    "../api:scoped_refptr",
     "../api/audio:audio_device",
+    "../api/crypto:options",
     "../call:call_interfaces",
+    "../call:payload_type_picker",
     "../modules/audio_device",
+    "../p2p:port",
+    "../p2p:port_allocator",
+    "../rtc_base:ssl",
+    "../rtc_base:ssl_adapter",
+    "//third_party/abseil-cpp/absl/strings:string_view",
   ]
 }
 
@@ -1061,11 +1084,13 @@
   deps = [
     ":channel",
     ":channel_interface",
+    ":codec_vendor",
     ":connection_context",
     ":data_channel_controller",
     ":dtls_transport",
     ":jsep_transport_controller",
     ":legacy_stats_collector",
+    ":media_options",
     ":media_session",
     ":media_stream",
     ":media_stream_observer",
@@ -1127,6 +1152,7 @@
     "../rtc_base:event_tracer",
     "../rtc_base:logging",
     "../rtc_base:macromagic",
+    "../rtc_base:rtc_certificate_generator",
     "../rtc_base:rtc_operations_chain",
     "../rtc_base:ssl",
     "../rtc_base:ssl_adapter",
@@ -1226,6 +1252,7 @@
     "../api/units:time_delta",
     "../api/video:video_codec_constants",
     "../call:call_interfaces",
+    "../call:payload_type",
     "../call:payload_type_picker",
     "../media:codec",
     "../media:media_channel",
@@ -1435,7 +1462,9 @@
     "webrtc_session_description_factory.h",
   ]
   deps = [
+    ":codec_vendor",
     ":connection_context",
+    ":media_options",
     ":media_session",
     ":sdp_state_provider",
     ":session_description",
@@ -2107,6 +2136,7 @@
       "../api:candidate",
       "../api:dtls_transport_interface",
       "../api:field_trials",
+      "../api:field_trials_view",
       "../api:ice_transport_factory",
       "../api:ice_transport_interface",
       "../api:libjingle_peerconnection_api",
@@ -2549,6 +2579,7 @@
       "../rtc_base:refcount",
       "../rtc_base:rtc_base_tests_utils",
       "../rtc_base:rtc_certificate_generator",
+      "../rtc_base:rtc_event",
       "../rtc_base:rtc_json",
       "../rtc_base:safe_conversions",
       "../rtc_base:socket_address",
@@ -2564,6 +2595,7 @@
       "../rtc_base/synchronization:mutex",
       "../rtc_base/third_party/base64",
       "../rtc_base/third_party/sigslot",
+      "../system_wrappers",
       "../system_wrappers:metrics",
       "../test:audio_codec_mocks",
       "../test:rtc_expect_death",
diff --git a/pc/codec_vendor.h b/pc/codec_vendor.h
index 28fae16..04f9b6f 100644
--- a/pc/codec_vendor.h
+++ b/pc/codec_vendor.h
@@ -11,6 +11,7 @@
 #ifndef PC_CODEC_VENDOR_H_
 #define PC_CODEC_VENDOR_H_
 
+#include <string>
 #include <vector>
 
 #include "api/field_trials_view.h"
@@ -117,6 +118,16 @@
   TypedCodecVendor video_recv_codecs_;
 };
 
+// A class to assist in looking up data for a codec mapping.
+// Pure virtual to allow implementations that depend on things that
+// codec_vendor.h should not depend on.
+class CodecLookupHelper {
+ public:
+  virtual ~CodecLookupHelper() = default;
+  virtual webrtc::PayloadTypeSuggester* PayloadTypeSuggester() = 0;
+  virtual cricket::CodecVendor* CodecVendor(const std::string& mid) = 0;
+};
+
 }  // namespace cricket
 
 #endif  // PC_CODEC_VENDOR_H_
diff --git a/pc/media_session.cc b/pc/media_session.cc
index 8cd77a6..ec5c85c 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -27,7 +27,6 @@
 #include "api/rtc_error.h"
 #include "api/rtp_parameters.h"
 #include "api/rtp_transceiver_direction.h"
-#include "call/payload_type.h"
 #include "media/base/codec.h"
 #include "media/base/codec_list.h"
 #include "media/base/media_constants.h"
@@ -684,16 +683,15 @@
     bool rtx_enabled,
     rtc::UniqueRandomIdGenerator* ssrc_generator,
     const TransportDescriptionFactory* transport_desc_factory,
-    webrtc::PayloadTypeSuggester* pt_suggester)
+    CodecLookupHelper* codec_lookup_helper)
     : ssrc_generator_(ssrc_generator),
       transport_desc_factory_(transport_desc_factory),
-      pt_suggester_(pt_suggester),
+      codec_lookup_helper_(codec_lookup_helper),
       payload_types_in_transport_trial_enabled_(
           transport_desc_factory_->trials().IsEnabled(
               "WebRTC-PayloadTypesInTransport")) {
   RTC_CHECK(transport_desc_factory_);
-  codec_vendor_ = std::make_unique<CodecVendor>(
-      media_engine, rtx_enabled, transport_desc_factory_->trials());
+  RTC_CHECK(codec_lookup_helper_);
 }
 
 RtpHeaderExtensions
@@ -738,12 +736,12 @@
 
   CodecList offer_audio_codecs;
   CodecList offer_video_codecs;
-  if (codec_vendor_) {
-    RTCError error = codec_vendor_->GetCodecsForOffer(
-        current_active_contents, offer_audio_codecs, offer_video_codecs);
-    if (!error.ok()) {
-      return error;
-    }
+
+  // TODO: issues.webrtc.org/360058654 - Get codecs when we know the right mid.
+  RTCError error = codec_lookup_helper_->CodecVendor("")->GetCodecsForOffer(
+      current_active_contents, offer_audio_codecs, offer_video_codecs);
+  if (!error.ok()) {
+    return error;
   }
 
   AudioVideoRtpHeaderExtensions extensions_with_ids =
@@ -893,13 +891,12 @@
   // sections.
   CodecList answer_audio_codecs;
   CodecList answer_video_codecs;
-  if (codec_vendor_) {
-    RTCError error = codec_vendor_->GetCodecsForAnswer(
-        current_active_contents, *offer, answer_audio_codecs,
-        answer_video_codecs);
-    if (!error.ok()) {
-      return error;
-    }
+  // TODO: issues.webrtc.org/360058654 - do this when we have the MID.
+  RTCError error = codec_lookup_helper_->CodecVendor("")->GetCodecsForAnswer(
+      current_active_contents, *offer, answer_audio_codecs,
+      answer_video_codecs);
+  if (!error.ok()) {
+    return error;
   }
 
   auto answer = std::make_unique<SessionDescription>();
@@ -1206,10 +1203,11 @@
              media_description_options.type == MEDIA_TYPE_VIDEO);
 
   std::vector<Codec> codecs_to_include;
+  std::string mid = media_description_options.mid;
   webrtc::RTCErrorOr<std::vector<Codec>> error_or_filtered_codecs =
-      codec_vendor_->GetNegotiatedCodecsForOffer(
+      codec_lookup_helper_->CodecVendor(mid)->GetNegotiatedCodecsForOffer(
           media_description_options, session_options, current_content,
-          *pt_suggester_, codecs);
+          *codec_lookup_helper_->PayloadTypeSuggester(), codecs);
   if (!error_or_filtered_codecs.ok()) {
     return error_or_filtered_codecs.MoveError();
   }
@@ -1365,10 +1363,11 @@
 
   std::vector<Codec> codecs_to_include;
   webrtc::RTCErrorOr<std::vector<Codec>> error_or_filtered_codecs =
-      codec_vendor_->GetNegotiatedCodecsForAnswer(
-          media_description_options, session_options, offer_rtd, answer_rtd,
-          current_content, offer_content_description->codecs(), *pt_suggester_,
-          codecs);
+      codec_lookup_helper_->CodecVendor(media_description_options.mid)
+          ->GetNegotiatedCodecsForAnswer(
+              media_description_options, session_options, offer_rtd, answer_rtd,
+              current_content, offer_content_description->codecs(),
+              *codec_lookup_helper_->PayloadTypeSuggester(), codecs);
   if (!error_or_filtered_codecs.ok()) {
     return error_or_filtered_codecs.MoveError();
   }
diff --git a/pc/media_session.h b/pc/media_session.h
index 590f933..5c56dd9 100644
--- a/pc/media_session.h
+++ b/pc/media_session.h
@@ -19,8 +19,7 @@
 
 #include "api/media_types.h"
 #include "api/rtc_error.h"
-#include "call/payload_type.h"
-#include "media/base/codec.h"
+#include "media/base/codec_list.h"
 #include "media/base/stream_params.h"
 #include "p2p/base/ice_credentials_iterator.h"
 #include "p2p/base/transport_description.h"
@@ -58,7 +57,7 @@
                                  bool rtx_enabled,
                                  rtc::UniqueRandomIdGenerator* ssrc_generator,
                                  const TransportDescriptionFactory* factory,
-                                 webrtc::PayloadTypeSuggester* pt_suggester);
+                                 CodecLookupHelper* codec_lookup_helper);
 
   RtpHeaderExtensions filtered_rtp_header_extensions(
       RtpHeaderExtensions extensions) const;
@@ -79,8 +78,6 @@
       const MediaSessionOptions& options,
       const SessionDescription* current_description) const;
 
-  CodecVendor* CodecVendorForTesting() { return codec_vendor_.get(); }
-
  private:
   struct AudioVideoRtpHeaderExtensions {
     RtpHeaderExtensions audio;
@@ -188,10 +185,8 @@
       ssrc_generator_;
   bool enable_encrypted_rtp_header_extensions_ = true;
   const TransportDescriptionFactory* transport_desc_factory_;
-  // Payoad type tracker interface. Must live longer than this object.
-  webrtc::PayloadTypeSuggester* pt_suggester_;
+  CodecLookupHelper* codec_lookup_helper_;
   bool payload_types_in_transport_trial_enabled_;
-  std::unique_ptr<CodecVendor> codec_vendor_;
 };
 
 // Convenience functions.
diff --git a/pc/media_session_unittest.cc b/pc/media_session_unittest.cc
index 2b01a69..fa5b94b 100644
--- a/pc/media_session_unittest.cc
+++ b/pc/media_session_unittest.cc
@@ -26,11 +26,13 @@
 #include "api/array_view.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/candidate.h"
+#include "api/field_trials_view.h"
 #include "api/media_types.h"
 #include "api/rtp_parameters.h"
 #include "api/rtp_transceiver_direction.h"
 #include "api/video_codecs/sdp_video_format.h"
 #include "call/fake_payload_type_suggester.h"
+#include "call/payload_type.h"
 #include "media/base/codec.h"
 #include "media/base/codec_list.h"
 #include "media/base/media_constants.h"
@@ -42,6 +44,7 @@
 #include "p2p/base/transport_description.h"
 #include "p2p/base/transport_description_factory.h"
 #include "p2p/base/transport_info.h"
+#include "pc/codec_vendor.h"
 #include "pc/media_options.h"
 #include "pc/media_protocol_names.h"
 #include "pc/rtp_media_utils.h"
@@ -83,6 +86,23 @@
 
 using Candidates = std::vector<Candidate>;
 
+class CodecLookupHelperForTesting : public CodecLookupHelper {
+ public:
+  explicit CodecLookupHelperForTesting(
+      const webrtc::FieldTrialsView& field_trials)
+      : codec_vendor_(nullptr, false, field_trials) {}
+  webrtc::PayloadTypeSuggester* PayloadTypeSuggester() override {
+    return &payload_type_suggester_;
+  }
+  cricket::CodecVendor* CodecVendor(const std::string& mid) override {
+    return &codec_vendor_;
+  }
+
+ private:
+  webrtc::FakePayloadTypeSuggester payload_type_suggester_;
+  cricket::CodecVendor codec_vendor_;
+};
+
 Codec CreateRedAudioCodec(absl::string_view encoding_id) {
   Codec red = CreateAudioCodec(63, "red", 48000, 2);
   red.SetParam(kCodecParamNotInNameValueFormat,
@@ -510,16 +530,18 @@
   MediaSessionDescriptionFactoryTest()
       : tdf1_(field_trials),
         tdf2_(field_trials),
-        f1_(nullptr, false, &ssrc_generator1, &tdf1_, &pt_suggester_1_),
-        f2_(nullptr, false, &ssrc_generator2, &tdf2_, &pt_suggester_2_) {
-    f1_.CodecVendorForTesting()->set_audio_codecs(MAKE_VECTOR(kAudioCodecs1),
-                                                  MAKE_VECTOR(kAudioCodecs1));
-    f1_.CodecVendorForTesting()->set_video_codecs(MAKE_VECTOR(kVideoCodecs1),
-                                                  MAKE_VECTOR(kVideoCodecs1));
-    f2_.CodecVendorForTesting()->set_audio_codecs(MAKE_VECTOR(kAudioCodecs2),
-                                                  MAKE_VECTOR(kAudioCodecs2));
-    f2_.CodecVendorForTesting()->set_video_codecs(MAKE_VECTOR(kVideoCodecs2),
-                                                  MAKE_VECTOR(kVideoCodecs2));
+        codec_lookup_helper_1_(field_trials),
+        codec_lookup_helper_2_(field_trials),
+        f1_(nullptr, false, &ssrc_generator1, &tdf1_, &codec_lookup_helper_1_),
+        f2_(nullptr, false, &ssrc_generator2, &tdf2_, &codec_lookup_helper_2_) {
+    codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(
+        MAKE_VECTOR(kAudioCodecs1), MAKE_VECTOR(kAudioCodecs1));
+    codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(
+        MAKE_VECTOR(kVideoCodecs1), MAKE_VECTOR(kVideoCodecs1));
+    codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(
+        MAKE_VECTOR(kAudioCodecs2), MAKE_VECTOR(kAudioCodecs2));
+    codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(
+        MAKE_VECTOR(kVideoCodecs2), MAKE_VECTOR(kVideoCodecs2));
     tdf1_.set_certificate(rtc::RTCCertificate::Create(
         std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id1"))));
     tdf2_.set_certificate(rtc::RTCCertificate::Create(
@@ -760,8 +782,8 @@
   rtc::UniqueRandomIdGenerator ssrc_generator2;
   TransportDescriptionFactory tdf1_;
   TransportDescriptionFactory tdf2_;
-  webrtc::FakePayloadTypeSuggester pt_suggester_1_;
-  webrtc::FakePayloadTypeSuggester pt_suggester_2_;
+  CodecLookupHelperForTesting codec_lookup_helper_1_;
+  CodecLookupHelperForTesting codec_lookup_helper_2_;
   MediaSessionDescriptionFactory f1_;
   MediaSessionDescriptionFactory f2_;
 };
@@ -778,7 +800,7 @@
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
   const MediaContentDescription* acd = ac->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_THAT(f1_.CodecVendorForTesting()->audio_sendrecv_codecs(),
+  EXPECT_THAT(codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs(),
               ElementsAreArray(acd->codecs()));
   EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached.
   EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
@@ -792,9 +814,9 @@
   // First, prefer to only use opus and red.
   std::vector<webrtc::RtpCodecCapability> preferences;
   preferences.push_back(webrtc::ToRtpCodecCapability(
-      f1_.CodecVendorForTesting()->audio_sendrecv_codecs()[0]));
+      codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs()[0]));
   preferences.push_back(webrtc::ToRtpCodecCapability(
-      f1_.CodecVendorForTesting()->audio_sendrecv_codecs()[1]));
+      codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs()[1]));
   EXPECT_EQ("opus", preferences[0].name);
   EXPECT_EQ("red", preferences[1].name);
 
@@ -820,9 +842,9 @@
   // First, prefer to only use opus and red.
   std::vector<webrtc::RtpCodecCapability> preferences;
   preferences.push_back(webrtc::ToRtpCodecCapability(
-      f1_.CodecVendorForTesting()->audio_sendrecv_codecs()[1]));
+      codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs()[1]));
   preferences.push_back(webrtc::ToRtpCodecCapability(
-      f1_.CodecVendorForTesting()->audio_sendrecv_codecs()[0]));
+      codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs()[0]));
   EXPECT_EQ("red", preferences[0].name);
   EXPECT_EQ("opus", preferences[1].name);
 
@@ -859,15 +881,17 @@
   const MediaContentDescription* acd = ac->media_description();
   const MediaContentDescription* vcd = vc->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(f1_.CodecVendorForTesting()->audio_sendrecv_codecs().codecs(),
-            acd->codecs());
+  EXPECT_EQ(
+      codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs().codecs(),
+      acd->codecs());
   EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
   EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
   EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
   EXPECT_EQ(kMediaProtocolDtlsSavpf, acd->protocol());
   EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-  EXPECT_EQ(f1_.CodecVendorForTesting()->video_sendrecv_codecs().codecs(),
-            vcd->codecs());
+  EXPECT_EQ(
+      codec_lookup_helper_1_.CodecVendor("")->video_sendrecv_codecs().codecs(),
+      vcd->codecs());
   EXPECT_EQ(0U, vcd->first_ssrc());             // no sender is attached
   EXPECT_EQ(kAutoBandwidth, vcd->bandwidth());  // default bandwidth (auto)
   EXPECT_TRUE(vcd->rtcp_mux());                 // rtcp-mux defaults on
@@ -967,9 +991,9 @@
 // duplicate RTP payload types.
 TEST_F(MediaSessionDescriptionFactoryTest, TestBundleOfferWithSameCodecPlType) {
   Codec offered_video_codec =
-      f2_.CodecVendorForTesting()->video_sendrecv_codecs()[0];
+      codec_lookup_helper_2_.CodecVendor("")->video_sendrecv_codecs()[0];
   Codec offered_audio_codec =
-      f2_.CodecVendorForTesting()->audio_sendrecv_codecs()[0];
+      codec_lookup_helper_2_.CodecVendor("")->audio_sendrecv_codecs()[0];
   ASSERT_EQ(offered_video_codec.id, offered_audio_codec.id);
 
   MediaSessionOptions opts;
@@ -1418,10 +1442,12 @@
                              RtpTransceiverDirection::kSendRecv, kActive,
                              &opts);
   std::vector f1_codecs = {CreateAudioCodec(96, "opus", 48000, 1)};
-  f1_.CodecVendorForTesting()->set_audio_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateAudioCodec(0, "PCMU", 8000, 1)};
-  f2_.CodecVendorForTesting()->set_audio_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -1469,10 +1495,12 @@
                              RtpTransceiverDirection::kSendRecv, kActive,
                              &opts);
   std::vector f1_codecs = {CreateVideoCodec(96, "H264")};
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateVideoCodec(97, "VP8")};
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -1493,11 +1521,13 @@
                              &opts);
   std::vector f1_codecs = {CreateVideoCodec(96, "H264"),
                            CreateVideoCodec(118, "flexfec-03")};
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateVideoCodec(97, "VP8"),
                            CreateVideoCodec(118, "flexfec-03")};
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -2625,8 +2655,9 @@
   const MediaContentDescription* acd = ac->media_description();
   const MediaContentDescription* vcd = vc->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(f1_.CodecVendorForTesting()->audio_sendrecv_codecs().codecs(),
-            acd->codecs());
+  EXPECT_EQ(
+      codec_lookup_helper_1_.CodecVendor("")->audio_sendrecv_codecs().codecs(),
+      acd->codecs());
 
   const StreamParamsVec& audio_streams = acd->streams();
   ASSERT_EQ(2U, audio_streams.size());
@@ -2642,8 +2673,9 @@
   EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
 
   EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-  EXPECT_EQ(f1_.CodecVendorForTesting()->video_sendrecv_codecs().codecs(),
-            vcd->codecs());
+  EXPECT_EQ(
+      codec_lookup_helper_1_.CodecVendor("")->video_sendrecv_codecs().codecs(),
+      vcd->codecs());
 
   const StreamParamsVec& video_streams = vcd->streams();
   ASSERT_EQ(1U, video_streams.size());
@@ -3038,8 +3070,10 @@
 // that is being recycled.
 TEST_F(MediaSessionDescriptionFactoryTest,
        ReOfferDoesNotReUseRecycledAudioCodecs) {
-  f1_.CodecVendorForTesting()->set_video_codecs(CodecList{}, CodecList{});
-  f2_.CodecVendorForTesting()->set_video_codecs(CodecList{}, CodecList{});
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(CodecList{},
+                                                           CodecList{});
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(CodecList{},
+                                                           CodecList{});
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_AUDIO, "a0",
@@ -3072,8 +3106,10 @@
 // that is being recycled.
 TEST_F(MediaSessionDescriptionFactoryTest,
        ReOfferDoesNotReUseRecycledVideoCodecs) {
-  f1_.CodecVendorForTesting()->set_audio_codecs(CodecList{}, CodecList{});
-  f2_.CodecVendorForTesting()->set_audio_codecs(CodecList{}, CodecList{});
+  codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(CodecList{},
+                                                           CodecList{});
+  codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(CodecList{},
+                                                           CodecList{});
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "v0",
@@ -3099,8 +3135,10 @@
 // section that is being recycled.
 TEST_F(MediaSessionDescriptionFactoryTest,
        ReAnswerDoesNotReUseRecycledAudioCodecs) {
-  f1_.CodecVendorForTesting()->set_video_codecs(CodecList{}, CodecList{});
-  f2_.CodecVendorForTesting()->set_video_codecs(CodecList{}, CodecList{});
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(CodecList{},
+                                                           CodecList{});
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(CodecList{},
+                                                           CodecList{});
 
   // Perform initial offer/answer in reverse (`f2_` as offerer) so that the
   // second offer/answer is forward (`f1_` as offerer).
@@ -3131,8 +3169,10 @@
 // section that is being recycled.
 TEST_F(MediaSessionDescriptionFactoryTest,
        ReAnswerDoesNotReUseRecycledVideoCodecs) {
-  f1_.CodecVendorForTesting()->set_audio_codecs(CodecList{}, CodecList{});
-  f2_.CodecVendorForTesting()->set_audio_codecs(CodecList{}, CodecList{});
+  codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(CodecList{},
+                                                           CodecList{});
+  codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(CodecList{},
+                                                           CodecList{});
 
   // Perform initial offer/answer in reverse (`f2_` as offerer) so that the
   // second offer/answer is forward (`f1_` as offerer).
@@ -3171,12 +3211,14 @@
   std::vector<Codec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
   // This creates rtx for H264 with the payload type `f1_` uses.
   AddRtxCodec(CreateVideoRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector<Codec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
   // This creates rtx for H264 with the payload type `f2_` uses.
   AddRtxCodec(CreateVideoRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -3233,11 +3275,15 @@
   // *doesn't* honor the existing preferred codec (VP8) we'll notice.
   std::vector<Codec> f2_codecs = {vp9, vp9_rtx, vp8_answerer, vp8_answerer_rtx};
 
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
   std::vector<Codec> audio_codecs;
-  f1_.CodecVendorForTesting()->set_audio_codecs(audio_codecs, audio_codecs);
-  f2_.CodecVendorForTesting()->set_audio_codecs(audio_codecs, audio_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(audio_codecs,
+                                                           audio_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(audio_codecs,
+                                                           audio_codecs);
 
   // Offer will be {VP8, RTX for VP8}. Answer will be the same.
   std::unique_ptr<SessionDescription> offer =
@@ -3270,7 +3316,8 @@
   std::vector<Codec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
   // This creates rtx for H264 with the payload type `f1_` uses.
   AddRtxCodec(CreateVideoRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_AUDIO, "audio",
@@ -3296,7 +3343,8 @@
   int used_pl_type = acd->codecs()[0].id;
   f2_codecs[0].id = used_pl_type;  // Set the payload type for H264.
   AddRtxCodec(CreateVideoRtxCodec(125, used_pl_type), &f2_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> updated_offer(
       f2_.CreateOfferOrError(opts, answer.get()).MoveValue());
@@ -3333,7 +3381,8 @@
   std::vector<Codec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
   // This creates rtx for H264 with the payload type `f2_` uses.
   AddRtxCodec(CreateVideoRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -3372,12 +3421,14 @@
   std::vector<Codec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
   // This creates RTX without associated payload type parameter.
   AddRtxCodec(CreateVideoCodec(126, kRtxCodecName), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector<Codec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
   // This creates RTX for H264 with the payload type `f2_` uses.
   AddRtxCodec(CreateVideoRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -3415,12 +3466,14 @@
   std::vector<Codec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
   // This creates RTX for H264 in sender.
   AddRtxCodec(CreateVideoRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector<Codec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
   // This creates RTX for H263 in receiver.
   AddRtxCodec(CreateVideoRtxCodec(125, kVideoCodecs2[1].id), &f2_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -3446,16 +3499,19 @@
   std::vector<Codec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
   // This creates RTX for H264-SVC in sender.
   AddRtxCodec(CreateVideoRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   // This creates RTX for H264 in sender.
   AddRtxCodec(CreateVideoRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector<Codec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
   // This creates RTX for H264 in receiver.
   AddRtxCodec(CreateVideoRtxCodec(124, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f1_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f1_codecs);
 
   // H264-SVC codec is removed in the answer, therefore, associated RTX codec
   // for H264-SVC should also be removed.
@@ -3482,7 +3538,8 @@
   std::vector<Codec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
   // This creates RTX for H264 for the offerer.
   AddRtxCodec(CreateVideoRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
@@ -3496,7 +3553,8 @@
 
   // Now, attempt to add RTX for H264-SVC.
   AddRtxCodec(CreateVideoRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::unique_ptr<SessionDescription> updated_offer(
       f1_.CreateOfferOrError(opts, offer.get()).MoveValue());
@@ -3522,7 +3580,8 @@
   std::vector<Codec> f1_codecs;
   f1_codecs.push_back(CreateVideoCodec(97, "H264"));
   AddRtxCodec(CreateVideoRtxCodec(125, 97), &f1_codecs);
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   // Ensure that the offer has an RTX ssrc for each regular ssrc, and that there
   // is a FID ssrc + grouping for each.
@@ -3566,7 +3625,8 @@
   std::vector<Codec> f1_codecs;
   f1_codecs.push_back(CreateVideoCodec(97, "H264"));
   f1_codecs.push_back(CreateVideoCodec(118, "flexfec-03"));
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   // Ensure that the offer has a single FlexFEC ssrc and that
   // there is no FEC-FR ssrc + grouping for each.
@@ -3609,7 +3669,8 @@
   std::vector<Codec> f1_codecs;
   f1_codecs.push_back(CreateVideoCodec(97, "H264"));
   f1_codecs.push_back(CreateVideoCodec(118, "flexfec-03"));
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   // Ensure that the offer has no FlexFEC ssrcs for each regular ssrc, and that
   // there is no FEC-FR ssrc + grouping for each.
@@ -4275,11 +4336,13 @@
 TEST_F(MediaSessionDescriptionFactoryTest, H265TxModeIsEqualRetainIt) {
   std::vector f1_codecs = {CreateVideoCodec(96, "H265")};
   f1_codecs.back().tx_mode = "mrst";
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateVideoCodec(96, "H265")};
   f2_codecs.back().tx_mode = "mrst";
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video1",
@@ -4311,11 +4374,13 @@
 TEST_F(MediaSessionDescriptionFactoryTest, H265TxModeIsDifferentDropCodecs) {
   std::vector f1_codecs = {CreateVideoCodec(96, "H265")};
   f1_codecs.back().tx_mode = "mrst";
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateVideoCodec(96, "H265")};
   f2_codecs.back().tx_mode = "mrmt";
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video1",
@@ -4348,11 +4413,13 @@
 TEST_F(MediaSessionDescriptionFactoryTest, PacketizationIsEqual) {
   std::vector f1_codecs = {CreateVideoCodec(96, "H264")};
   f1_codecs.back().packetization = "raw";
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateVideoCodec(96, "H264")};
   f2_codecs.back().packetization = "raw";
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video1",
@@ -4384,11 +4451,13 @@
 TEST_F(MediaSessionDescriptionFactoryTest, PacketizationIsDifferent) {
   std::vector f1_codecs = {CreateVideoCodec(96, "H264")};
   f1_codecs.back().packetization = "raw";
-  f1_.CodecVendorForTesting()->set_video_codecs(f1_codecs, f1_codecs);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(f1_codecs,
+                                                           f1_codecs);
 
   std::vector f2_codecs = {CreateVideoCodec(96, "H264")};
   f2_codecs.back().packetization = "notraw";
-  f2_.CodecVendorForTesting()->set_video_codecs(f2_codecs, f2_codecs);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(f2_codecs,
+                                                           f2_codecs);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video1",
@@ -4508,10 +4577,14 @@
   audio_codecs2[0].SetParam(audio_param_name, audio_value2);
   video_codecs2[0].SetParam(video_param_name, video_value2);
 
-  f1_.CodecVendorForTesting()->set_audio_codecs(audio_codecs1, audio_codecs1);
-  f1_.CodecVendorForTesting()->set_video_codecs(video_codecs1, video_codecs1);
-  f2_.CodecVendorForTesting()->set_audio_codecs(audio_codecs2, audio_codecs2);
-  f2_.CodecVendorForTesting()->set_video_codecs(video_codecs2, video_codecs2);
+  codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(audio_codecs1,
+                                                           audio_codecs1);
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(video_codecs1,
+                                                           video_codecs1);
+  codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(audio_codecs2,
+                                                           audio_codecs2);
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(video_codecs2,
+                                                           video_codecs2);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_AUDIO, "audio",
@@ -4562,9 +4635,10 @@
 
   // Offerer will send both codecs, answerer should choose the one with matching
   // packetization mode (and not the first one it sees).
-  f1_.CodecVendorForTesting()->set_video_codecs({h264_pm0, h264_pm1},
-                                                {h264_pm0, h264_pm1});
-  f2_.CodecVendorForTesting()->set_video_codecs({h264_pm1}, {h264_pm1});
+  codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(
+      {h264_pm0, h264_pm1}, {h264_pm0, h264_pm1});
+  codec_lookup_helper_2_.CodecVendor("")->set_video_codecs({h264_pm1},
+                                                           {h264_pm1});
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -4593,16 +4667,18 @@
   MediaProtocolTest()
       : tdf1_(field_trials_),
         tdf2_(field_trials_),
-        f1_(nullptr, false, &ssrc_generator1, &tdf1_, &pt_suggester_1_),
-        f2_(nullptr, false, &ssrc_generator2, &tdf2_, &pt_suggester_2_) {
-    f1_.CodecVendorForTesting()->set_audio_codecs(MAKE_VECTOR(kAudioCodecs1),
-                                                  MAKE_VECTOR(kAudioCodecs1));
-    f1_.CodecVendorForTesting()->set_video_codecs(MAKE_VECTOR(kVideoCodecs1),
-                                                  MAKE_VECTOR(kVideoCodecs1));
-    f2_.CodecVendorForTesting()->set_audio_codecs(MAKE_VECTOR(kAudioCodecs2),
-                                                  MAKE_VECTOR(kAudioCodecs2));
-    f2_.CodecVendorForTesting()->set_video_codecs(MAKE_VECTOR(kVideoCodecs2),
-                                                  MAKE_VECTOR(kVideoCodecs2));
+        codec_lookup_helper_1_(field_trials_),
+        codec_lookup_helper_2_(field_trials_),
+        f1_(nullptr, false, &ssrc_generator1, &tdf1_, &codec_lookup_helper_1_),
+        f2_(nullptr, false, &ssrc_generator2, &tdf2_, &codec_lookup_helper_2_) {
+    codec_lookup_helper_1_.CodecVendor("")->set_audio_codecs(
+        MAKE_VECTOR(kAudioCodecs1), MAKE_VECTOR(kAudioCodecs1));
+    codec_lookup_helper_1_.CodecVendor("")->set_video_codecs(
+        MAKE_VECTOR(kVideoCodecs1), MAKE_VECTOR(kVideoCodecs1));
+    codec_lookup_helper_2_.CodecVendor("")->set_audio_codecs(
+        MAKE_VECTOR(kAudioCodecs2), MAKE_VECTOR(kAudioCodecs2));
+    codec_lookup_helper_2_.CodecVendor("")->set_video_codecs(
+        MAKE_VECTOR(kVideoCodecs2), MAKE_VECTOR(kVideoCodecs2));
     tdf1_.set_certificate(rtc::RTCCertificate::Create(
         std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id1"))));
     tdf2_.set_certificate(rtc::RTCCertificate::Create(
@@ -4613,8 +4689,8 @@
   webrtc::test::ScopedKeyValueConfig field_trials_;
   TransportDescriptionFactory tdf1_;
   TransportDescriptionFactory tdf2_;
-  webrtc::FakePayloadTypeSuggester pt_suggester_1_;
-  webrtc::FakePayloadTypeSuggester pt_suggester_2_;
+  CodecLookupHelperForTesting codec_lookup_helper_1_;
+  CodecLookupHelperForTesting codec_lookup_helper_2_;
   MediaSessionDescriptionFactory f1_;
   MediaSessionDescriptionFactory f2_;
   rtc::UniqueRandomIdGenerator ssrc_generator1;
@@ -4674,13 +4750,14 @@
       std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id"))));
 
   rtc::UniqueRandomIdGenerator ssrc_generator;
-  webrtc::FakePayloadTypeSuggester pt_suggester;
+  CodecLookupHelperForTesting codec_lookup_helper(field_trials);
   MediaSessionDescriptionFactory sf(nullptr, false, &ssrc_generator, &tdf,
-                                    &pt_suggester);
+                                    &codec_lookup_helper);
   const std::vector<Codec> send_codecs = MAKE_VECTOR(kAudioCodecs1);
   const std::vector<Codec> recv_codecs = MAKE_VECTOR(kAudioCodecs2);
   const std::vector<Codec> sendrecv_codecs = MAKE_VECTOR(kAudioCodecsAnswer);
-  sf.CodecVendorForTesting()->set_audio_codecs(send_codecs, recv_codecs);
+  codec_lookup_helper.CodecVendor("")->set_audio_codecs(send_codecs,
+                                                        recv_codecs);
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_AUDIO, "audio", direction, kActive,
@@ -4781,17 +4858,18 @@
       rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
           new rtc::FakeSSLIdentity("answer_id"))));
   rtc::UniqueRandomIdGenerator ssrc_generator1, ssrc_generator2;
-  webrtc::FakePayloadTypeSuggester offer_pt_suggester;
-  MediaSessionDescriptionFactory offer_factory(nullptr, false, &ssrc_generator1,
-                                               &offer_tdf, &offer_pt_suggester);
-  webrtc::FakePayloadTypeSuggester answer_pt_suggester;
-  MediaSessionDescriptionFactory answer_factory(
-      nullptr, false, &ssrc_generator2, &answer_tdf, &answer_pt_suggester);
+  CodecLookupHelperForTesting offer_codec_lookup_helper(field_trials);
+  MediaSessionDescriptionFactory offer_factory(
+      nullptr, false, &ssrc_generator1, &offer_tdf, &offer_codec_lookup_helper);
+  CodecLookupHelperForTesting answer_codec_lookup_helper(field_trials);
+  MediaSessionDescriptionFactory answer_factory(nullptr, false,
+                                                &ssrc_generator2, &answer_tdf,
+                                                &answer_codec_lookup_helper);
 
-  offer_factory.CodecVendorForTesting()->set_audio_codecs(
+  offer_codec_lookup_helper.CodecVendor("")->set_audio_codecs(
       VectorFromIndices(kOfferAnswerCodecs, kOfferSendCodecs),
       VectorFromIndices(kOfferAnswerCodecs, kOfferRecvCodecs));
-  answer_factory.CodecVendorForTesting()->set_audio_codecs(
+  answer_codec_lookup_helper.CodecVendor("")->set_audio_codecs(
       VectorFromIndices(kOfferAnswerCodecs, kAnswerSendCodecs),
       VectorFromIndices(kOfferAnswerCodecs, kAnswerRecvCodecs));
 
@@ -4934,12 +5012,14 @@
                     false,
                     &ssrc_generator_offerer_,
                     &tdf_offerer_,
-                    &pt_suggester_offerer_),
+                    &codec_lookup_helper_offerer_),
         sf_answerer_(nullptr,
                      false,
                      &ssrc_generator_answerer_,
                      &tdf_answerer_,
-                     &pt_suggester_answerer_) {
+                     &codec_lookup_helper_answerer_),
+        codec_lookup_helper_offerer_(field_trials_),
+        codec_lookup_helper_answerer_(field_trials_) {
     tdf_offerer_.set_certificate(
         rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
             new rtc::FakeSSLIdentity("offer_id"))));
@@ -4967,8 +5047,8 @@
   rtc::UniqueRandomIdGenerator ssrc_generator_answerer_;
   MediaSessionDescriptionFactory sf_offerer_;
   MediaSessionDescriptionFactory sf_answerer_;
-  webrtc::FakePayloadTypeSuggester pt_suggester_offerer_;
-  webrtc::FakePayloadTypeSuggester pt_suggester_answerer_;
+  CodecLookupHelperForTesting codec_lookup_helper_offerer_;
+  CodecLookupHelperForTesting codec_lookup_helper_answerer_;
 };
 
 // Both sides support H.265 level 5.2 for encoding and decoding.
@@ -4979,13 +5059,13 @@
   const std::vector<Codec> recv_codecs = MAKE_VECTOR(kVideoCodecsH265Level52);
   const std::vector<Codec> sendrecv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(send_codecs,
-                                                        recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(recv_codecs,
-                                                         send_codecs);
-  EXPECT_EQ(
-      sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(send_codecs,
+                                                                 recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(recv_codecs,
+                                                                  send_codecs);
+  EXPECT_EQ(sendrecv_codecs, codec_lookup_helper_offerer_.CodecVendor("")
+                                 ->video_sendrecv_codecs()
+                                 .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5030,13 +5110,13 @@
   const std::vector<Codec> recv_codecs = MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> sendrecv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(send_codecs,
-                                                        recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(recv_codecs,
-                                                         send_codecs);
-  EXPECT_EQ(
-      sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(send_codecs,
+                                                                 recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(recv_codecs,
+                                                                  send_codecs);
+  EXPECT_EQ(sendrecv_codecs, codec_lookup_helper_offerer_.CodecVendor("")
+                                 ->video_sendrecv_codecs()
+                                 .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5078,13 +5158,13 @@
   const std::vector<Codec> recv_codecs = MAKE_VECTOR(kVideoCodecsH265Level52);
   const std::vector<Codec> sendrecv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(send_codecs,
-                                                        recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(recv_codecs,
-                                                         send_codecs);
-  EXPECT_EQ(
-      sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(send_codecs,
+                                                                 recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(recv_codecs,
+                                                                  send_codecs);
+  EXPECT_EQ(sendrecv_codecs, codec_lookup_helper_offerer_.CodecVendor("")
+                                 ->video_sendrecv_codecs()
+                                 .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5132,13 +5212,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5191,13 +5272,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level52);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5250,13 +5332,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level31);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level5);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5319,13 +5402,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level4);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5378,13 +5462,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5437,13 +5522,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5493,13 +5579,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level52);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5549,13 +5636,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level31);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level5);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5605,13 +5693,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level4);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5661,13 +5750,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5717,13 +5807,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5774,13 +5865,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level52);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5831,13 +5923,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level31);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level5);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5888,13 +5981,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level4);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level6);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5945,13 +6039,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -5998,13 +6093,14 @@
       MAKE_VECTOR(kVideoCodecsH265Level6);
   const std::vector<Codec> answerer_recv_codecs =
       MAKE_VECTOR(kVideoCodecsH265Level52);
-  sf_offerer_.CodecVendorForTesting()->set_video_codecs(offerer_send_codecs,
-                                                        offerer_recv_codecs);
-  sf_answerer_.CodecVendorForTesting()->set_video_codecs(answerer_send_codecs,
-                                                         answerer_recv_codecs);
-  EXPECT_EQ(
-      offerer_sendrecv_codecs,
-      sf_offerer_.CodecVendorForTesting()->video_sendrecv_codecs().codecs());
+  codec_lookup_helper_offerer_.CodecVendor("")->set_video_codecs(
+      offerer_send_codecs, offerer_recv_codecs);
+  codec_lookup_helper_answerer_.CodecVendor("")->set_video_codecs(
+      answerer_send_codecs, answerer_recv_codecs);
+  EXPECT_EQ(offerer_sendrecv_codecs,
+            codec_lookup_helper_offerer_.CodecVendor("")
+                ->video_sendrecv_codecs()
+                .codecs());
 
   MediaSessionOptions opts;
   AddMediaDescriptionOptions(MEDIA_TYPE_VIDEO, "video",
@@ -6015,7 +6111,7 @@
                                         {kMediaStream1}, 1, &opts);
   std::vector<webrtc::RtpCodecCapability> preferences;
   for (const auto& codec :
-       sf_offerer_.CodecVendorForTesting()->video_recv_codecs()) {
+       codec_lookup_helper_offerer_.CodecVendor("")->video_recv_codecs()) {
     preferences.push_back(webrtc::ToRtpCodecCapability(codec));
   }
   opts.media_description_options[0].codec_preferences = preferences;
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index 6dde889..473b77d 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -63,6 +63,7 @@
 #include "api/video/video_codec_constants.h"
 #include "call/audio_state.h"
 #include "call/packet_receiver.h"
+#include "call/payload_type.h"
 #include "media/base/codec.h"
 #include "media/base/media_config.h"
 #include "media/base/media_engine.h"
@@ -140,6 +141,38 @@
 namespace {
 static const int REPORT_USAGE_PATTERN_DELAY_MS = 60000;
 
+class CodecLookupHelperForPeerConnection : public cricket::CodecLookupHelper {
+ public:
+  explicit CodecLookupHelperForPeerConnection(PeerConnection* self)
+      : self_(self) {}
+
+  webrtc::PayloadTypeSuggester* PayloadTypeSuggester() override {
+    return self_->transport_controller_s();
+  }
+
+  cricket::CodecVendor* CodecVendor(const std::string& mid) override {
+    auto transceiver = self_->rtp_manager()->transceivers()->FindByMid(mid);
+    if (!transceiver) {
+      // This codepath exists because of some codec lookups that have not
+      // yet been converted to be transceiver specific.
+      if (!fallback_codec_vendor_) {
+        RTC_LOG(LS_WARNING) << "Creating fallback codec vendor due to "
+                               "lookup of mid "
+                            << mid;
+        fallback_codec_vendor_ = std::make_unique<cricket::CodecVendor>(
+            self_->context()->media_engine(), self_->context()->use_rtx(),
+            self_->context()->env().field_trials());
+      }
+      return fallback_codec_vendor_.get();
+    }
+    return transceiver->internal()->codec_vendor();
+  }
+
+ private:
+  PeerConnection* self_;
+  std::unique_ptr<cricket::CodecVendor> fallback_codec_vendor_;
+};
+
 uint32_t ConvertIceTransportTypeToCandidateFilter(
     PeerConnectionInterface::IceTransportsType type) {
   switch (type) {
@@ -544,6 +577,8 @@
       session_id_(rtc::ToString(rtc::CreateRandomId64() & LLONG_MAX)),
       data_channel_controller_(this),
       message_handler_(signaling_thread()),
+      codec_lookup_helper_(
+          std::make_unique<CodecLookupHelperForPeerConnection>(this)),
       weak_factory_(this) {
   // Field trials specific to the peerconnection should be owned by the `env`,
   RTC_DCHECK(dependencies.trials == nullptr);
@@ -561,7 +596,7 @@
   sdp_handler_ = SdpOfferAnswerHandler::Create(
       this, configuration_, std::move(dependencies.cert_generator),
       std::move(dependencies.video_bitrate_allocator_factory), context_.get(),
-      transport_controller_copy_);
+      codec_lookup_helper_.get());
   rtp_manager_ = std::make_unique<RtpTransmissionManager>(
       env_, IsUnifiedPlan(), context_.get(), &usage_pattern_, observer_,
       legacy_stats_.get(), [this]() {
diff --git a/pc/peer_connection.h b/pc/peer_connection.h
index fb0cb3d..180b2ab 100644
--- a/pc/peer_connection.h
+++ b/pc/peer_connection.h
@@ -63,6 +63,7 @@
 #include "p2p/base/port_allocator.h"
 #include "p2p/base/transport_description.h"
 #include "pc/channel_interface.h"
+#include "pc/codec_vendor.h"
 #include "pc/connection_context.h"
 #include "pc/data_channel_controller.h"
 #include "pc/data_channel_utils.h"
@@ -728,6 +729,8 @@
   // Accessed on both signaling and network thread. Const after Initialize().
   std::unique_ptr<RtpTransmissionManager> rtp_manager_;
 
+  std::unique_ptr<cricket::CodecLookupHelper> codec_lookup_helper_;
+
   // This variable needs to be the last one in the class.
   WeakPtrFactory<PeerConnection> weak_factory_;
 };
diff --git a/pc/peer_connection_encodings_integrationtest.cc b/pc/peer_connection_encodings_integrationtest.cc
index d095bba..f42ca15 100644
--- a/pc/peer_connection_encodings_integrationtest.cc
+++ b/pc/peer_connection_encodings_integrationtest.cc
@@ -27,6 +27,7 @@
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/audio_options.h"
 #include "api/field_trials.h"
+#include "api/field_trials_view.h"
 #include "api/jsep.h"
 #include "api/make_ref_counted.h"
 #include "api/media_stream_interface.h"
@@ -42,6 +43,8 @@
 #include "api/test/rtc_error_matchers.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
+#include "api/video_codecs/scalability_mode.h"
+#include "api/video_codecs/sdp_video_format.h"
 #include "media/base/codec.h"
 #include "media/engine/fake_webrtc_video_engine.h"
 #include "pc/sdp_utils.h"
diff --git a/pc/peer_connection_end_to_end_unittest.cc b/pc/peer_connection_end_to_end_unittest.cc
index 34bc5d4..21c935b 100644
--- a/pc/peer_connection_end_to_end_unittest.cc
+++ b/pc/peer_connection_end_to_end_unittest.cc
@@ -35,7 +35,6 @@
 #include "api/data_channel_interface.h"
 #include "api/environment/environment.h"
 #include "api/make_ref_counted.h"
-#include "api/media_stream_interface.h"
 #include "api/peer_connection_interface.h"
 #include "api/rtc_error.h"
 #include "api/rtp_parameters.h"
diff --git a/pc/peer_connection_factory.h b/pc/peer_connection_factory.h
index 2a96dd1..3d99c13 100644
--- a/pc/peer_connection_factory.h
+++ b/pc/peer_connection_factory.h
@@ -20,6 +20,7 @@
 
 #include "absl/strings/string_view.h"
 #include "api/audio_options.h"
+#include "api/environment/environment.h"
 #include "api/fec_controller.h"
 #include "api/field_trials_view.h"
 #include "api/media_stream_interface.h"
@@ -37,10 +38,8 @@
 #include "api/transport/sctp_transport_factory_interface.h"
 #include "call/call.h"
 #include "call/rtp_transport_controller_send_factory_interface.h"
-#include "p2p/base/port_allocator.h"
+#include "media/base/media_engine.h"
 #include "pc/connection_context.h"
-#include "rtc_base/checks.h"
-#include "rtc_base/rtc_certificate_generator.h"
 #include "rtc_base/thread.h"
 #include "rtc_base/thread_annotations.h"
 
diff --git a/pc/peer_connection_factory_proxy.h b/pc/peer_connection_factory_proxy.h
index b9bd1cb..88ee3b1 100644
--- a/pc/peer_connection_factory_proxy.h
+++ b/pc/peer_connection_factory_proxy.h
@@ -11,11 +11,18 @@
 #ifndef PC_PEER_CONNECTION_FACTORY_PROXY_H_
 #define PC_PEER_CONNECTION_FACTORY_PROXY_H_
 
-#include <memory>
+#include <cstdint>
+#include <cstdio>
 #include <string>
-#include <utility>
 
+#include "absl/strings/string_view.h"
+#include "api/audio_options.h"
+#include "api/media_stream_interface.h"
+#include "api/media_types.h"
 #include "api/peer_connection_interface.h"
+#include "api/rtc_error.h"
+#include "api/rtp_parameters.h"
+#include "api/scoped_refptr.h"
 #include "pc/proxy.h"
 
 namespace webrtc {
diff --git a/pc/peer_connection_factory_unittest.cc b/pc/peer_connection_factory_unittest.cc
index d34004c..7ca1ccc 100644
--- a/pc/peer_connection_factory_unittest.cc
+++ b/pc/peer_connection_factory_unittest.cc
@@ -11,13 +11,13 @@
 #include "pc/peer_connection_factory.h"
 
 #include <algorithm>
+#include <cstddef>
+#include <cstdio>
 #include <memory>
 #include <utility>
 #include <vector>
 
 #include "api/audio/audio_device.h"
-#include "api/audio/audio_mixer.h"
-#include "api/audio/audio_processing.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/create_peerconnection_factory.h"
@@ -29,8 +29,15 @@
 #include "api/jsep.h"
 #include "api/make_ref_counted.h"
 #include "api/media_stream_interface.h"
+#include "api/media_types.h"
+#include "api/packet_socket_factory.h"
+#include "api/peer_connection_interface.h"
+#include "api/rtp_parameters.h"
+#include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/test/mock_packet_socket_factory.h"
+#include "api/units/time_delta.h"
+#include "api/video_codecs/scalability_mode.h"
 #include "api/video_codecs/video_decoder_factory_template.h"
 #include "api/video_codecs/video_decoder_factory_template_dav1d_adapter.h"
 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp8_adapter.h"
@@ -42,18 +49,22 @@
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
 #include "media/base/fake_frame_source.h"
+#include "media/base/media_constants.h"
 #include "modules/audio_processing/include/mock_audio_processing.h"
+#include "p2p/base/basic_packet_socket_factory.h"
 #include "p2p/base/port.h"
 #include "p2p/base/port_allocator.h"
 #include "p2p/base/port_interface.h"
 #include "p2p/test/fake_port_allocator.h"
+#include "pc/connection_context.h"
 #include "pc/test/fake_audio_capture_module.h"
 #include "pc/test/fake_video_track_source.h"
-#include "pc/test/mock_peer_connection_observers.h"
-#include "rtc_base/gunit.h"
+#include "rtc_base/event.h"
 #include "rtc_base/internal/default_socket_server.h"
-#include "rtc_base/rtc_certificate_generator.h"
+#include "rtc_base/network.h"
 #include "rtc_base/socket_address.h"
+#include "rtc_base/socket_server.h"
+#include "rtc_base/thread.h"
 #include "rtc_base/time_utils.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
diff --git a/pc/peer_connection_field_trial_tests.cc b/pc/peer_connection_field_trial_tests.cc
index e6aa9a9..be9c49f 100644
--- a/pc/peer_connection_field_trial_tests.cc
+++ b/pc/peer_connection_field_trial_tests.cc
@@ -13,28 +13,27 @@
 
 #include <memory>
 #include <set>
+#include <utility>
 
-#include "api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "api/audio_codecs/builtin_audio_encoder_factory.h"
+#include "absl/algorithm/container.h"
 #include "api/create_peerconnection_factory.h"
 #include "api/enable_media_with_defaults.h"
 #include "api/field_trials.h"
 #include "api/field_trials_view.h"
+#include "api/media_types.h"
 #include "api/peer_connection_interface.h"
-#include "api/stats/rtcstats_objects.h"
+#include "api/rtp_parameters.h"
+#include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
-#include "api/video_codecs/builtin_video_decoder_factory.h"
-#include "api/video_codecs/builtin_video_encoder_factory.h"
-#include "media/engine/webrtc_media_engine.h"
 #include "pc/peer_connection_wrapper.h"
 #include "pc/session_description.h"
 #include "pc/test/fake_audio_capture_module.h"
-#include "pc/test/frame_generator_capturer_video_track_source.h"
-#include "pc/test/peer_connection_test_wrapper.h"
-#include "rtc_base/gunit.h"
+#include "pc/test/mock_peer_connection_observers.h"
+#include "rtc_base/checks.h"
 #include "rtc_base/internal/default_socket_server.h"
-#include "rtc_base/physical_socket_server.h"
+#include "rtc_base/socket_server.h"
 #include "rtc_base/thread.h"
+#include "system_wrappers/include/clock.h"
 #include "test/gtest.h"
 
 #ifdef WEBRTC_ANDROID
diff --git a/pc/peer_connection_header_extension_unittest.cc b/pc/peer_connection_header_extension_unittest.cc
index 0abaf8e..ef296f5 100644
--- a/pc/peer_connection_header_extension_unittest.cc
+++ b/pc/peer_connection_header_extension_unittest.cc
@@ -22,23 +22,20 @@
 #include "api/peer_connection_interface.h"
 #include "api/rtc_error.h"
 #include "api/rtc_event_log/rtc_event_log_factory.h"
-#include "api/rtc_event_log/rtc_event_log_factory_interface.h"
 #include "api/rtp_parameters.h"
 #include "api/rtp_transceiver_direction.h"
 #include "api/rtp_transceiver_interface.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
-#include "api/task_queue/task_queue_factory.h"
 #include "media/base/fake_media_engine.h"
-#include "media/base/media_engine.h"
-#include "p2p/base/port_allocator.h"
+#include "p2p/base/basic_packet_socket_factory.h"
 #include "p2p/test/fake_port_allocator.h"
 #include "pc/peer_connection_wrapper.h"
 #include "pc/session_description.h"
 #include "pc/test/enable_fake_media.h"
 #include "pc/test/mock_peer_connection_observers.h"
 #include "rtc_base/internal/default_socket_server.h"
-#include "rtc_base/rtc_certificate_generator.h"
+#include "rtc_base/socket_server.h"
 #include "rtc_base/strings/string_builder.h"
 #include "rtc_base/thread.h"
 #include "test/gmock.h"
diff --git a/pc/peer_connection_integrationtest.cc b/pc/peer_connection_integrationtest.cc
index 64a527f..34878cb 100644
--- a/pc/peer_connection_integrationtest.cc
+++ b/pc/peer_connection_integrationtest.cc
@@ -53,8 +53,10 @@
 #include "api/test/rtc_error_matchers.h"
 #include "api/transport/rtp/rtp_source.h"
 #include "api/uma_metrics.h"
+#include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/video/video_rotation.h"
+#include "api/video_codecs/sdp_video_format.h"
 #include "logging/rtc_event_log/fake_rtc_event_log.h"
 #include "logging/rtc_event_log/fake_rtc_event_log_factory.h"
 #include "media/base/codec.h"
diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc
index 7c072da..1f1a8fc 100644
--- a/pc/peer_connection_interface_unittest.cc
+++ b/pc/peer_connection_interface_unittest.cc
@@ -63,6 +63,7 @@
 #include "media/base/media_config.h"
 #include "media/base/stream_params.h"
 #include "media/sctp/sctp_transport_internal.h"
+#include "p2p/base/basic_packet_socket_factory.h"
 #include "p2p/base/p2p_constants.h"
 #include "p2p/base/port.h"
 #include "p2p/base/port_allocator.h"
diff --git a/pc/peer_connection_internal.h b/pc/peer_connection_internal.h
index 54f69b9..0026b3e 100644
--- a/pc/peer_connection_internal.h
+++ b/pc/peer_connection_internal.h
@@ -18,14 +18,34 @@
 #include <string>
 #include <vector>
 
+#include "absl/strings/string_view.h"
 #include "api/audio/audio_device.h"
+#include "api/candidate.h"
+#include "api/crypto/crypto_options.h"
+#include "api/data_channel_interface.h"
+#include "api/field_trials_view.h"
+#include "api/jsep.h"
+#include "api/media_stream_interface.h"
+#include "api/media_types.h"
 #include "api/peer_connection_interface.h"
+#include "api/rtc_error.h"
+#include "api/rtp_transceiver_interface.h"
+#include "api/scoped_refptr.h"
 #include "call/call.h"
+#include "call/payload_type_picker.h"
+#include "p2p/base/port.h"
+#include "p2p/base/port_allocator.h"
+#include "pc/data_channel_utils.h"
 #include "pc/jsep_transport_controller.h"
 #include "pc/peer_connection_message_handler.h"
 #include "pc/rtp_transceiver.h"
 #include "pc/rtp_transmission_manager.h"
-#include "pc/sctp_data_channel.h"
+#include "pc/session_description.h"
+#include "pc/transport_stats.h"
+#include "pc/usage_pattern.h"
+#include "rtc_base/rtc_certificate.h"
+#include "rtc_base/ssl_certificate.h"
+#include "rtc_base/ssl_stream_adapter.h"
 
 namespace webrtc {
 
diff --git a/pc/peer_connection_jsep_unittest.cc b/pc/peer_connection_jsep_unittest.cc
index 8e97f0b..547593b 100644
--- a/pc/peer_connection_jsep_unittest.cc
+++ b/pc/peer_connection_jsep_unittest.cc
@@ -20,9 +20,7 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "api/audio/audio_device.h"
 #include "api/enable_media_with_defaults.h"
-#include "api/field_trials_view.h"
 #include "api/jsep.h"
 #include "api/media_stream_interface.h"
 #include "api/media_types.h"
@@ -35,14 +33,9 @@
 #include "api/rtp_transceiver_interface.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
-#include "api/task_queue/task_queue_factory.h"
 #include "api/transport/field_trial_based_config.h"
-#include "api/transport/sctp_transport_factory_interface.h"
-#include "media/base/media_engine.h"
 #include "media/base/stream_params.h"
-#include "media/engine/webrtc_media_engine.h"
 #include "p2p/base/p2p_constants.h"
-#include "p2p/base/port_allocator.h"
 #include "p2p/base/transport_info.h"
 #include "pc/channel_interface.h"
 #include "pc/media_session.h"
@@ -50,7 +43,6 @@
 #include "pc/sdp_utils.h"
 #include "pc/session_description.h"
 #include "pc/test/mock_peer_connection_observers.h"
-#include "rtc_base/rtc_certificate_generator.h"
 #include "rtc_base/thread.h"
 #include "test/gtest.h"
 #ifdef WEBRTC_ANDROID
diff --git a/pc/rtp_transceiver.h b/pc/rtp_transceiver.h
index dfaee4f..6ab4f1f 100644
--- a/pc/rtp_transceiver.h
+++ b/pc/rtp_transceiver.h
@@ -301,6 +301,8 @@
   void OnNegotiationUpdate(SdpType sdp_type,
                            const cricket::MediaContentDescription* content);
 
+  cricket::CodecVendor* codec_vendor() { return &codec_vendor_; }
+
  private:
   cricket::MediaEngineInterface* media_engine() const {
     return context_->media_engine();
diff --git a/pc/sdp_offer_answer.cc b/pc/sdp_offer_answer.cc
index e2df01f..4f88549 100644
--- a/pc/sdp_offer_answer.cc
+++ b/pc/sdp_offer_answer.cc
@@ -64,10 +64,12 @@
 #include "p2p/base/transport_description_factory.h"
 #include "p2p/base/transport_info.h"
 #include "pc/channel_interface.h"
+#include "pc/codec_vendor.h"
 #include "pc/connection_context.h"
 #include "pc/dtls_transport.h"
 #include "pc/jsep_transport_controller.h"
 #include "pc/legacy_stats_collector.h"
+#include "pc/media_options.h"
 #include "pc/media_session.h"
 #include "pc/media_stream.h"
 #include "pc/media_stream_observer.h"
@@ -92,6 +94,7 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/operations_chain.h"
 #include "rtc_base/rtc_certificate.h"
+#include "rtc_base/rtc_certificate_generator.h"
 #include "rtc_base/ssl_stream_adapter.h"
 #include "rtc_base/string_encode.h"
 #include "rtc_base/strings/string_builder.h"
@@ -1426,11 +1429,11 @@
     std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
         video_bitrate_allocator_factory,
     ConnectionContext* context,
-    PayloadTypeSuggester* pt_suggester) {
+    cricket::CodecLookupHelper* codec_lookup_helper) {
   auto handler = absl::WrapUnique(new SdpOfferAnswerHandler(pc, context));
   handler->Initialize(configuration, std::move(cert_generator),
                       std::move(video_bitrate_allocator_factory), context,
-                      pt_suggester);
+                      codec_lookup_helper);
   return handler;
 }
 
@@ -1440,7 +1443,7 @@
     std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
         video_bitrate_allocator_factory,
     ConnectionContext* context,
-    PayloadTypeSuggester* pt_suggester) {
+    cricket::CodecLookupHelper* codec_lookup_helper) {
   RTC_DCHECK_RUN_ON(signaling_thread());
   // 100 kbps is used by default, but can be overriden by a non-standard
   // RTCConfiguration value (not available on Web).
@@ -1473,7 +1476,7 @@
             RTC_DCHECK_RUN_ON(signaling_thread());
             transport_controller_s()->SetLocalCertificate(certificate);
           },
-          pt_suggester, pc_->trials());
+          codec_lookup_helper, pc_->trials());
 
   if (pc_->options()->disable_encryption) {
     RTC_LOG(LS_INFO)
diff --git a/pc/sdp_offer_answer.h b/pc/sdp_offer_answer.h
index 7ceca8b..235a630 100644
--- a/pc/sdp_offer_answer.h
+++ b/pc/sdp_offer_answer.h
@@ -38,13 +38,14 @@
 #include "api/set_remote_description_observer_interface.h"
 #include "api/uma_metrics.h"
 #include "api/video/video_bitrate_allocator_factory.h"
-#include "call/payload_type.h"
 #include "media/base/media_channel.h"
 #include "media/base/stream_params.h"
 #include "p2p/base/port_allocator.h"
+#include "pc/codec_vendor.h"
 #include "pc/connection_context.h"
 #include "pc/data_channel_controller.h"
 #include "pc/jsep_transport_controller.h"
+#include "pc/media_options.h"
 #include "pc/media_session.h"
 #include "pc/media_stream_observer.h"
 #include "pc/peer_connection_internal.h"
@@ -57,6 +58,7 @@
 #include "pc/transceiver_list.h"
 #include "pc/webrtc_session_description_factory.h"
 #include "rtc_base/operations_chain.h"
+#include "rtc_base/rtc_certificate_generator.h"
 #include "rtc_base/ssl_stream_adapter.h"
 #include "rtc_base/thread.h"
 #include "rtc_base/thread_annotations.h"
@@ -84,7 +86,7 @@
       std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
           video_bitrate_allocator_factory,
       ConnectionContext* context,
-      PayloadTypeSuggester* pt_suggester);
+      cricket::CodecLookupHelper* codec_lookup_helper);
 
   void ResetSessionDescFactory() {
     RTC_DCHECK_RUN_ON(signaling_thread());
@@ -219,7 +221,7 @@
       std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
           video_bitrate_allocator_factory,
       ConnectionContext* context,
-      PayloadTypeSuggester* pt_suggester);
+      cricket::CodecLookupHelper* codec_lookup_helper);
 
   rtc::Thread* signaling_thread() const;
   rtc::Thread* network_thread() const;
diff --git a/pc/webrtc_session_description_factory.cc b/pc/webrtc_session_description_factory.cc
index 8b32191..75f48b27 100644
--- a/pc/webrtc_session_description_factory.cc
+++ b/pc/webrtc_session_description_factory.cc
@@ -30,8 +30,9 @@
 #include "api/rtc_error.h"
 #include "api/scoped_refptr.h"
 #include "api/sequence_checker.h"
-#include "call/payload_type.h"
+#include "pc/codec_vendor.h"
 #include "pc/connection_context.h"
+#include "pc/media_options.h"
 #include "pc/media_session.h"
 #include "pc/sdp_state_provider.h"
 #include "pc/session_description.h"
@@ -118,7 +119,7 @@
     rtc::scoped_refptr<rtc::RTCCertificate> certificate,
     std::function<void(const rtc::scoped_refptr<rtc::RTCCertificate>&)>
         on_certificate_ready,
-    PayloadTypeSuggester* pt_suggester,
+    cricket::CodecLookupHelper* codec_lookup_helper,
     const FieldTrialsView& field_trials)
     : signaling_thread_(context->signaling_thread()),
       transport_desc_factory_(field_trials),
@@ -126,7 +127,7 @@
                             context->use_rtx(),
                             context->ssrc_generator(),
                             &transport_desc_factory_,
-                            pt_suggester),
+                            codec_lookup_helper),
       // RFC 4566 suggested a Network Time Protocol (NTP) format timestamp
       // as the session id and session version. To simplify, it should be fine
       // to just use a random number as session id and start version from
diff --git a/pc/webrtc_session_description_factory.h b/pc/webrtc_session_description_factory.h
index de7fd42..935a008 100644
--- a/pc/webrtc_session_description_factory.h
+++ b/pc/webrtc_session_description_factory.h
@@ -25,8 +25,9 @@
 #include "api/rtc_error.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/task_queue_base.h"
-#include "call/payload_type.h"
 #include "p2p/base/transport_description_factory.h"
+#include "pc/codec_vendor.h"
+#include "pc/media_options.h"
 #include "pc/media_session.h"
 #include "pc/sdp_state_provider.h"
 #include "rtc_base/rtc_certificate.h"
@@ -54,7 +55,7 @@
       rtc::scoped_refptr<rtc::RTCCertificate> certificate,
       std::function<void(const rtc::scoped_refptr<rtc::RTCCertificate>&)>
           on_certificate_ready,
-      PayloadTypeSuggester* pt_suggester,
+      cricket::CodecLookupHelper* codec_lookup_helper,
       const FieldTrialsView& field_trials);
   ~WebRtcSessionDescriptionFactory();