Remove most usage of MediaContentDescription::as_audio()/as_video()

and unify algorithms a bit more.

BUG=webrtc:15214

Change-Id: Ie9903f3e56d25b1dc026367e8ae6817275faa07b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/328442
Reviewed-by: Florent Castelli <orphis@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@microsoft.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41244}
diff --git a/pc/channel.cc b/pc/channel.cc
index 00ef3ae..792f67a 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -79,7 +79,7 @@
 }  // namespace
 
 void MediaChannelParametersFromMediaDescription(
-    const RtpMediaContentDescription* desc,
+    const MediaContentDescription* desc,
     const RtpHeaderExtensions& extensions,
     bool is_stream_active,
     MediaChannelParameters* params) {
@@ -97,7 +97,7 @@
 }
 
 void RtpSendParametersFromMediaDescription(
-    const RtpMediaContentDescription* desc,
+    const MediaContentDescription* desc,
     webrtc::RtpExtension::Filter extensions_filter,
     SenderParameters* send_params) {
   RtpHeaderExtensions extensions =
@@ -875,7 +875,7 @@
 
   AudioReceiverParameters recv_params = last_recv_params_;
   MediaChannelParametersFromMediaDescription(
-      content->as_audio(), header_extensions,
+      content, header_extensions,
       webrtc::RtpTransceiverDirectionHasRecv(content->direction()),
       &recv_params);
 
@@ -927,8 +927,8 @@
   RTC_LOG(LS_INFO) << "Setting remote voice description for " << ToString();
 
   AudioSenderParameter send_params = last_send_params_;
-  RtpSendParametersFromMediaDescription(content->as_audio(),
-                                        extensions_filter(), &send_params);
+  RtpSendParametersFromMediaDescription(content, extensions_filter(),
+                                        &send_params);
   send_params.mid = mid();
 
   bool parameters_applied =
@@ -1016,7 +1016,7 @@
   VideoReceiverParameters recv_params = last_recv_params_;
 
   MediaChannelParametersFromMediaDescription(
-      content->as_video(), header_extensions,
+      content, header_extensions,
       webrtc::RtpTransceiverDirectionHasRecv(content->direction()),
       &recv_params);
 
@@ -1100,7 +1100,7 @@
     last_send_params_ = send_params;
   }
 
-  if (!UpdateLocalStreams_w(content->as_video()->streams(), type, error_desc)) {
+  if (!UpdateLocalStreams_w(content->streams(), type, error_desc)) {
     RTC_DCHECK(!error_desc.empty());
     return false;
   }
@@ -1128,13 +1128,11 @@
   TRACE_EVENT0("webrtc", "VideoChannel::SetRemoteContent_w");
   RTC_LOG(LS_INFO) << "Setting remote video description for " << ToString();
 
-  const VideoContentDescription* video = content->as_video();
-
   VideoSenderParameters send_params = last_send_params_;
-  RtpSendParametersFromMediaDescription(video, extensions_filter(),
+  RtpSendParametersFromMediaDescription(content, extensions_filter(),
                                         &send_params);
   send_params.mid = mid();
-  send_params.conference_mode = video->conference_mode();
+  send_params.conference_mode = content->conference_mode();
 
   VideoReceiverParameters recv_params = last_recv_params_;
 
@@ -1145,15 +1143,15 @@
   // instead.
   bool needs_recv_params_update = false;
   if (type == SdpType::kAnswer || type == SdpType::kPrAnswer) {
-    webrtc::flat_set<const VideoCodec*> matched_codecs;
-    for (VideoCodec& recv_codec : recv_params.codecs) {
-      if (absl::c_any_of(matched_codecs, [&](const VideoCodec* c) {
+    webrtc::flat_set<const Codec*> matched_codecs;
+    for (Codec& recv_codec : recv_params.codecs) {
+      if (absl::c_any_of(matched_codecs, [&](const Codec* c) {
             return recv_codec.MatchesWithoutPacketization(*c);
           })) {
         continue;
       }
 
-      std::vector<const VideoCodec*> send_codecs =
+      std::vector<const Codec*> send_codecs =
           FindAllMatchingCodecs(send_params.codecs, recv_codec);
       if (send_codecs.empty()) {
         continue;
@@ -1161,7 +1159,7 @@
 
       bool may_ignore_packetization = false;
       bool has_matching_packetization = false;
-      for (const VideoCodec* send_codec : send_codecs) {
+      for (const Codec* send_codec : send_codecs) {
         if (!send_codec->packetization.has_value() &&
             recv_codec.packetization.has_value()) {
           may_ignore_packetization = true;
diff --git a/pc/media_session_unittest.cc b/pc/media_session_unittest.cc
index e15cc39..b0dc3ad 100644
--- a/pc/media_session_unittest.cc
+++ b/pc/media_session_unittest.cc
@@ -683,8 +683,8 @@
     ASSERT_TRUE(vc);
     EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
     EXPECT_EQ(MediaProtocolType::kRtp, vc->type);
-    const AudioContentDescription* acd = ac->media_description()->as_audio();
-    const VideoContentDescription* vcd = vc->media_description()->as_video();
+    const MediaContentDescription* acd = ac->media_description();
+    const MediaContentDescription* vcd = vc->media_description();
     EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
     EXPECT_THAT(acd->codecs(), ElementsAreArray(kAudioCodecsAnswer));
     EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
@@ -781,7 +781,7 @@
   ASSERT_TRUE(ac);
   EXPECT_FALSE(vc);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
+  const MediaContentDescription* acd = ac->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
   EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached.
@@ -814,7 +814,7 @@
   ASSERT_TRUE(ac != NULL);
   ASSERT_TRUE(vc == NULL);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
+  const MediaContentDescription* acd = ac->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_EQ(2U, acd->codecs().size());
   EXPECT_EQ("opus", acd->codecs()[0].name);
@@ -843,7 +843,7 @@
   ASSERT_TRUE(ac != NULL);
   ASSERT_TRUE(vc == NULL);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
+  const MediaContentDescription* acd = ac->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_EQ(2U, acd->codecs().size());
   EXPECT_EQ("red", acd->codecs()[0].name);
@@ -864,8 +864,8 @@
   ASSERT_TRUE(vc);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
   EXPECT_EQ(MediaProtocolType::kRtp, vc->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
   EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
@@ -1228,8 +1228,8 @@
   const ContentInfo* vc = offer->GetContentByName("video");
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
 
   EXPECT_FALSE(vcd->has_ssrcs());  // No StreamParams.
   EXPECT_FALSE(acd->has_ssrcs());  // No StreamParams.
@@ -1306,7 +1306,7 @@
   ASSERT_TRUE(ac);
   EXPECT_FALSE(vc);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
+  const MediaContentDescription* acd = ac->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_THAT(acd->codecs(), ElementsAreArray(kAudioCodecsAnswer));
   EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
@@ -1337,7 +1337,7 @@
   ASSERT_TRUE(ac);
   EXPECT_FALSE(vc);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
+  const MediaContentDescription* acd = ac->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_THAT(acd->codecs(), ElementsAreArray(kAudioCodecsAnswer));
   EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
@@ -1386,8 +1386,8 @@
   ASSERT_TRUE(vc);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
   EXPECT_EQ(MediaProtocolType::kRtp, vc->type);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_THAT(acd->codecs(), ElementsAreArray(kAudioCodecsAnswer));
   EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
@@ -2215,8 +2215,8 @@
   const ContentInfo* vc = answer->GetContentByName("video");
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
 
   EXPECT_FALSE(acd->has_ssrcs());  // No StreamParams.
   EXPECT_FALSE(vcd->has_ssrcs());  // No StreamParams.
@@ -2481,8 +2481,8 @@
   const ContentInfo* vc = offer->GetContentByName("video");
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
   EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
   EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
 
@@ -2526,10 +2526,8 @@
   vc = updated_offer->GetContentByName("video");
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
-  const AudioContentDescription* updated_acd =
-      ac->media_description()->as_audio();
-  const VideoContentDescription* updated_vcd =
-      vc->media_description()->as_video();
+  const MediaContentDescription* updated_acd = ac->media_description();
+  const MediaContentDescription* updated_vcd = vc->media_description();
 
   EXPECT_EQ(acd->type(), updated_acd->type());
   EXPECT_EQ(acd->codecs(), updated_acd->codecs());
@@ -2574,7 +2572,7 @@
   ASSERT_TRUE(offer.get());
   const ContentInfo* vc = offer->GetContentByName("video");
   ASSERT_TRUE(vc);
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* vcd = vc->media_description();
 
   const StreamParamsVec& video_streams = vcd->streams();
   ASSERT_EQ(1U, video_streams.size());
@@ -2786,8 +2784,8 @@
   const ContentInfo* vc = answer->GetContentByName("video");
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
   ASSERT_CRYPTO(acd, 1U, kDefaultSrtpCryptoSuite);
   ASSERT_CRYPTO(vcd, 1U, kDefaultSrtpCryptoSuite);
 
@@ -2831,10 +2829,8 @@
   vc = updated_answer->GetContentByName("video");
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
-  const AudioContentDescription* updated_acd =
-      ac->media_description()->as_audio();
-  const VideoContentDescription* updated_vcd =
-      vc->media_description()->as_video();
+  const MediaContentDescription* updated_acd = ac->media_description();
+  const MediaContentDescription* updated_vcd = vc->media_description();
 
   ASSERT_CRYPTO(updated_acd, 1U, kDefaultSrtpCryptoSuite);
   EXPECT_TRUE(CompareCryptoParams(acd->cryptos(), updated_acd->cryptos()));
@@ -3260,14 +3256,13 @@
   MediaContentDescription* media_desc =
       offer->GetContentDescriptionByName(CN_VIDEO);
   ASSERT_TRUE(media_desc);
-  VideoContentDescription* desc = media_desc->as_video();
-  std::vector<VideoCodec> codecs = desc->codecs();
-  for (VideoCodec& codec : codecs) {
+  std::vector<Codec> codecs = media_desc->codecs();
+  for (Codec& codec : codecs) {
     if (absl::StartsWith(codec.name, kRtxCodecName)) {
       codec.params.clear();
     }
   }
-  desc->set_codecs(codecs);
+  media_desc->set_codecs(codecs);
 
   std::unique_ptr<SessionDescription> answer =
       f2_.CreateAnswerOrError(offer.get(), opts, nullptr).MoveValue();
@@ -3404,8 +3399,7 @@
   MediaContentDescription* media_desc =
       offer->GetContentDescriptionByName(CN_VIDEO);
   ASSERT_TRUE(media_desc);
-  VideoContentDescription* desc = media_desc->as_video();
-  const StreamParamsVec& streams = desc->streams();
+  const StreamParamsVec& streams = media_desc->streams();
   // Single stream.
   ASSERT_EQ(1u, streams.size());
   // Stream should have 6 ssrcs: 3 for video, 3 for RTX.
@@ -3449,8 +3443,7 @@
   MediaContentDescription* media_desc =
       offer->GetContentDescriptionByName(CN_VIDEO);
   ASSERT_TRUE(media_desc);
-  VideoContentDescription* desc = media_desc->as_video();
-  const StreamParamsVec& streams = desc->streams();
+  const StreamParamsVec& streams = media_desc->streams();
   // Single stream.
   ASSERT_EQ(1u, streams.size());
   // Stream should have 2 ssrcs: 1 for video, 1 for FlexFEC.
@@ -3493,8 +3486,7 @@
   MediaContentDescription* media_desc =
       offer->GetContentDescriptionByName(CN_VIDEO);
   ASSERT_TRUE(media_desc);
-  VideoContentDescription* desc = media_desc->as_video();
-  const StreamParamsVec& streams = desc->streams();
+  const StreamParamsVec& streams = media_desc->streams();
   // Single stream.
   ASSERT_EQ(1u, streams.size());
   // Stream should have 3 ssrcs: 3 for video, 0 for FlexFEC.
@@ -3663,12 +3655,12 @@
   ASSERT_TRUE(ac);
   ASSERT_TRUE(vc);
   EXPECT_EQ(MediaProtocolType::kRtp, ac->type);
-  const AudioContentDescription* acd_copy = ac->media_description()->as_audio();
+  const MediaContentDescription* acd_copy = ac->media_description();
   EXPECT_EQ(acd->codecs(), acd_copy->codecs());
   EXPECT_EQ(1u, acd->first_ssrc());
 
   EXPECT_EQ(MediaProtocolType::kRtp, vc->type);
-  const VideoContentDescription* vcd_copy = vc->media_description()->as_video();
+  const MediaContentDescription* vcd_copy = vc->media_description();
   EXPECT_EQ(vcd->codecs(), vcd_copy->codecs());
   EXPECT_EQ(2u, vcd->first_ssrc());
 }
@@ -3812,8 +3804,8 @@
   ASSERT_TRUE(offer.get());
   ContentInfo* offer_content = offer->GetContentByName("audio");
   ASSERT_TRUE(offer_content);
-  AudioContentDescription* offer_audio_desc =
-      offer_content->media_description()->as_audio();
+  MediaContentDescription* offer_audio_desc =
+      offer_content->media_description();
   offer_audio_desc->set_protocol(kMediaProtocolDtlsSavpf);
 
   std::unique_ptr<SessionDescription> answer =
@@ -3839,8 +3831,8 @@
   ASSERT_TRUE(offer.get());
   ContentInfo* offer_content = offer->GetContentByName("audio");
   ASSERT_TRUE(offer_content);
-  AudioContentDescription* offer_audio_desc =
-      offer_content->media_description()->as_audio();
+  MediaContentDescription* offer_audio_desc =
+      offer_content->media_description();
   offer_audio_desc->set_protocol(kMediaProtocolDtlsSavpf);
 
   std::unique_ptr<SessionDescription> answer =
@@ -3852,8 +3844,8 @@
   ASSERT_TRUE(answer_content);
   ASSERT_FALSE(answer_content->rejected);
 
-  const AudioContentDescription* answer_audio_desc =
-      answer_content->media_description()->as_audio();
+  const MediaContentDescription* answer_audio_desc =
+      answer_content->media_description();
   EXPECT_EQ(kMediaProtocolDtlsSavpf, answer_audio_desc->protocol());
 }
 
@@ -4094,27 +4086,25 @@
 
   ASSERT_EQ(4u, offer->contents().size());
   EXPECT_FALSE(offer->contents()[0].rejected);
-  const AudioContentDescription* acd =
-      offer->contents()[0].media_description()->as_audio();
+  const MediaContentDescription* acd = offer->contents()[0].media_description();
   ASSERT_EQ(1u, acd->streams().size());
   EXPECT_EQ(kAudioTrack1, acd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, acd->direction());
 
   EXPECT_FALSE(offer->contents()[1].rejected);
-  const VideoContentDescription* vcd =
-      offer->contents()[1].media_description()->as_video();
+  const MediaContentDescription* vcd = offer->contents()[1].media_description();
   ASSERT_EQ(1u, vcd->streams().size());
   EXPECT_EQ(kVideoTrack1, vcd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, vcd->direction());
 
   EXPECT_FALSE(offer->contents()[2].rejected);
-  acd = offer->contents()[2].media_description()->as_audio();
+  acd = offer->contents()[2].media_description();
   ASSERT_EQ(1u, acd->streams().size());
   EXPECT_EQ(kAudioTrack2, acd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, acd->direction());
 
   EXPECT_FALSE(offer->contents()[3].rejected);
-  vcd = offer->contents()[3].media_description()->as_video();
+  vcd = offer->contents()[3].media_description();
   ASSERT_EQ(1u, vcd->streams().size());
   EXPECT_EQ(kVideoTrack2, vcd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, vcd->direction());
@@ -4157,27 +4147,27 @@
 
   ASSERT_EQ(4u, answer->contents().size());
   EXPECT_FALSE(answer->contents()[0].rejected);
-  const AudioContentDescription* acd =
-      answer->contents()[0].media_description()->as_audio();
+  const MediaContentDescription* acd =
+      answer->contents()[0].media_description();
   ASSERT_EQ(1u, acd->streams().size());
   EXPECT_EQ(kAudioTrack1, acd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, acd->direction());
 
   EXPECT_FALSE(answer->contents()[1].rejected);
-  const VideoContentDescription* vcd =
-      answer->contents()[1].media_description()->as_video();
+  const MediaContentDescription* vcd =
+      answer->contents()[1].media_description();
   ASSERT_EQ(1u, vcd->streams().size());
   EXPECT_EQ(kVideoTrack1, vcd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, vcd->direction());
 
   EXPECT_FALSE(answer->contents()[2].rejected);
-  acd = answer->contents()[2].media_description()->as_audio();
+  acd = answer->contents()[2].media_description();
   ASSERT_EQ(1u, acd->streams().size());
   EXPECT_EQ(kAudioTrack2, acd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, acd->direction());
 
   EXPECT_FALSE(answer->contents()[3].rejected);
-  vcd = answer->contents()[3].media_description()->as_video();
+  vcd = answer->contents()[3].media_description();
   ASSERT_EQ(1u, vcd->streams().size());
   EXPECT_EQ(kVideoTrack2, vcd->streams()[0].id);
   EXPECT_EQ(RtpTransceiverDirection::kSendRecv, vcd->direction());
@@ -4313,10 +4303,10 @@
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
   ASSERT_TRUE(offer);
   ASSERT_EQ(2u, offer->contents().size());
-  const VideoContentDescription* vcd1 =
-      offer->contents()[0].media_description()->as_video();
-  const VideoContentDescription* vcd2 =
-      offer->contents()[1].media_description()->as_video();
+  const MediaContentDescription* vcd1 =
+      offer->contents()[0].media_description();
+  const MediaContentDescription* vcd2 =
+      offer->contents()[1].media_description();
   EXPECT_EQ(vcd1->codecs().size(), vcd2->codecs().size());
   ASSERT_EQ(2u, vcd1->codecs().size());
   EXPECT_EQ(vcd1->codecs()[0].name, vcd2->codecs()[0].name);
@@ -4329,8 +4319,8 @@
       f2_.CreateAnswerOrError(offer.get(), opts, nullptr).MoveValue();
   ASSERT_TRUE(answer);
   ASSERT_EQ(2u, answer->contents().size());
-  vcd1 = answer->contents()[0].media_description()->as_video();
-  vcd2 = answer->contents()[1].media_description()->as_video();
+  vcd1 = answer->contents()[0].media_description();
+  vcd2 = answer->contents()[1].media_description();
   EXPECT_EQ(vcd1->codecs().size(), vcd2->codecs().size());
   ASSERT_EQ(1u, vcd1->codecs().size());
   EXPECT_EQ(vcd1->codecs()[0].name, vcd2->codecs()[0].name);
@@ -4353,15 +4343,14 @@
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
   ASSERT_THAT(offer, NotNull());
-  VideoContentDescription& video =
-      *offer->contents()[0].media_description()->as_video();
+  MediaContentDescription& video = *offer->contents()[0].media_description();
   video.set_codecs({vp8, vp8_raw});
   std::unique_ptr<SessionDescription> updated_offer =
       f1_.CreateOfferOrError(opts, offer.get()).MoveValue();
   ASSERT_THAT(updated_offer, NotNull());
 
-  VideoContentDescription& updated_video =
-      *updated_offer->contents()[0].media_description()->as_video();
+  MediaContentDescription& updated_video =
+      *updated_offer->contents()[0].media_description();
   EXPECT_THAT(
       updated_video.codecs(),
       ElementsAre(AllOf(Field(&cricket::Codec::name, "VP8"),
@@ -4398,8 +4387,8 @@
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
   ASSERT_TRUE(offer);
   ASSERT_EQ(1u, offer->contents().size());
-  const VideoContentDescription* vcd1 =
-      offer->contents()[0].media_description()->as_video();
+  const MediaContentDescription* vcd1 =
+      offer->contents()[0].media_description();
   ASSERT_EQ(1u, vcd1->codecs().size());
   EXPECT_EQ(vcd1->codecs()[0].packetization, "raw");
 
@@ -4408,7 +4397,7 @@
       f2_.CreateAnswerOrError(offer.get(), opts, nullptr).MoveValue();
   ASSERT_TRUE(answer);
   ASSERT_EQ(1u, answer->contents().size());
-  vcd1 = answer->contents()[0].media_description()->as_video();
+  vcd1 = answer->contents()[0].media_description();
   ASSERT_EQ(1u, vcd1->codecs().size());
   EXPECT_EQ(vcd1->codecs()[0].packetization, "raw");
 }
@@ -4429,10 +4418,9 @@
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
   ASSERT_TRUE(offer);
   ASSERT_EQ(2u, offer->contents().size());
-  VideoContentDescription* vcd1 =
-      offer->contents()[0].media_description()->as_video();
-  const VideoContentDescription* vcd2 =
-      offer->contents()[1].media_description()->as_video();
+  MediaContentDescription* vcd1 = offer->contents()[0].media_description();
+  const MediaContentDescription* vcd2 =
+      offer->contents()[1].media_description();
   auto video_codecs = MAKE_VECTOR(kVideoCodecs1);
   EXPECT_EQ(video_codecs, vcd1->codecs());
   EXPECT_EQ(video_codecs, vcd2->codecs());
@@ -4443,8 +4431,8 @@
   vcd1->set_codecs(video_codecs_reverse);
   std::unique_ptr<SessionDescription> updated_offer(
       f1_.CreateOfferOrError(opts, offer.get()).MoveValue());
-  vcd1 = updated_offer->contents()[0].media_description()->as_video();
-  vcd2 = updated_offer->contents()[1].media_description()->as_video();
+  vcd1 = updated_offer->contents()[0].media_description();
+  vcd2 = updated_offer->contents()[1].media_description();
   // The video codec preference order should be respected.
   EXPECT_EQ(video_codecs_reverse, vcd1->codecs());
   EXPECT_EQ(video_codecs, vcd2->codecs());
@@ -4466,10 +4454,9 @@
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
   ASSERT_TRUE(offer);
   ASSERT_EQ(2u, offer->contents().size());
-  VideoContentDescription* vcd1 =
-      offer->contents()[0].media_description()->as_video();
-  const VideoContentDescription* vcd2 =
-      offer->contents()[1].media_description()->as_video();
+  MediaContentDescription* vcd1 = offer->contents()[0].media_description();
+  const MediaContentDescription* vcd2 =
+      offer->contents()[1].media_description();
   auto video_codecs = MAKE_VECTOR(kVideoCodecs1);
   EXPECT_EQ(video_codecs, vcd1->codecs());
   EXPECT_EQ(video_codecs, vcd2->codecs());
@@ -4480,8 +4467,8 @@
   vcd1->set_codecs(video_codecs_reverse);
   std::unique_ptr<SessionDescription> answer =
       f1_.CreateAnswerOrError(offer.get(), opts, nullptr).MoveValue();
-  vcd1 = answer->contents()[0].media_description()->as_video();
-  vcd2 = answer->contents()[1].media_description()->as_video();
+  vcd1 = answer->contents()[0].media_description();
+  vcd2 = answer->contents()[1].media_description();
   // The video codec preference order should be respected.
   EXPECT_EQ(video_codecs_reverse, vcd1->codecs());
   EXPECT_EQ(video_codecs, vcd2->codecs());
@@ -4524,8 +4511,8 @@
   std::unique_ptr<SessionDescription> offer =
       f1_.CreateOfferOrError(opts, nullptr).MoveValue();
   ASSERT_TRUE(offer);
-  auto offer_acd = offer->contents()[0].media_description()->as_audio();
-  auto offer_vcd = offer->contents()[1].media_description()->as_video();
+  auto offer_acd = offer->contents()[0].media_description();
+  auto offer_vcd = offer->contents()[1].media_description();
   std::string value;
   EXPECT_TRUE(offer_acd->codecs()[0].GetParam(audio_param_name, &value));
   EXPECT_EQ(audio_value1, value);
@@ -4535,8 +4522,8 @@
   std::unique_ptr<SessionDescription> answer =
       f2_.CreateAnswerOrError(offer.get(), opts, nullptr).MoveValue();
   ASSERT_TRUE(answer);
-  auto answer_acd = answer->contents()[0].media_description()->as_audio();
-  auto answer_vcd = answer->contents()[1].media_description()->as_video();
+  auto answer_acd = answer->contents()[0].media_description();
+  auto answer_vcd = answer->contents()[1].media_description();
   // Use the parameters from the local codecs.
   EXPECT_TRUE(answer_acd->codecs()[0].GetParam(audio_param_name, &value));
   EXPECT_EQ(audio_value2, value);
@@ -4581,7 +4568,7 @@
   // Answer should have one negotiated codec with packetization-mode=1 using the
   // offered payload type.
   ASSERT_EQ(1u, answer->contents().size());
-  auto answer_vcd = answer->contents()[0].media_description()->as_video();
+  auto answer_vcd = answer->contents()[0].media_description();
   ASSERT_EQ(1u, answer_vcd->codecs().size());
   auto answer_codec = answer_vcd->codecs()[0];
   EXPECT_EQ(h264_pm1.id, answer_codec.id);
@@ -4640,8 +4627,8 @@
   ASSERT_TRUE(vc);
   EXPECT_FALSE(ac->rejected);  // the offer is accepted
   EXPECT_FALSE(vc->rejected);
-  const AudioContentDescription* acd = ac->media_description()->as_audio();
-  const VideoContentDescription* vcd = vc->media_description()->as_video();
+  const MediaContentDescription* acd = ac->media_description();
+  const MediaContentDescription* vcd = vc->media_description();
   EXPECT_EQ(GetParam(), acd->protocol());
   EXPECT_EQ(GetParam(), vcd->protocol());
 }
@@ -4753,7 +4740,7 @@
   // send nor receive audio. The checks are still in place if at some point
   // we'd instead create an inactive stream.
   if (ac) {
-    AudioContentDescription* acd = ac->media_description()->as_audio();
+    MediaContentDescription* acd = ac->media_description();
     // sendrecv and inactive should both present lists as if the channel was
     // to be used for sending and receiving. Inactive essentially means it
     // might eventually be used anything, but we don't know more at this
@@ -4872,7 +4859,7 @@
   // we'd instead create an inactive stream.
   if (ac) {
     ASSERT_EQ(MEDIA_TYPE_AUDIO, ac->media_description()->type());
-    const AudioContentDescription* acd = ac->media_description()->as_audio();
+    const MediaContentDescription* acd = ac->media_description();
 
     std::vector<AudioCodec> target_codecs;
     // For offers with sendrecv or inactive, we should never reply with more
diff --git a/pc/peer_connection_integrationtest.cc b/pc/peer_connection_integrationtest.cc
index 029046e..7e3da9b 100644
--- a/pc/peer_connection_integrationtest.cc
+++ b/pc/peer_connection_integrationtest.cc
@@ -1086,11 +1086,7 @@
                                     }),
                      extensions.end());
     media->set_rtp_header_extensions(extensions);
-    cricket::VideoContentDescription* video = media->as_video();
-    ASSERT_TRUE(video != nullptr);
-    std::vector<cricket::VideoCodec> codecs = {
-        cricket::CreateVideoCodec(pt++, "VP8")};
-    video->set_codecs(codecs);
+    media->set_codecs({cricket::CreateVideoCodec(pt++, "VP8")});
   }
 }
 
@@ -3757,11 +3753,10 @@
   // codecs.
   caller()->SetGeneratedSdpMunger([](cricket::SessionDescription* desc) {
     for (ContentInfo& content : desc->contents()) {
-      cricket::AudioContentDescription* media =
-          content.media_description()->as_audio();
-      std::vector<cricket::AudioCodec> codecs = media->codecs();
-      std::vector<cricket::AudioCodec> codecs_out;
-      for (cricket::AudioCodec codec : codecs) {
+      cricket::MediaContentDescription* media = content.media_description();
+      std::vector<cricket::Codec> codecs = media->codecs();
+      std::vector<cricket::Codec> codecs_out;
+      for (cricket::Codec codec : codecs) {
         if (codec.name == "opus") {
           codec.AddFeedbackParam(cricket::FeedbackParam(
               cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
@@ -3808,11 +3803,10 @@
   // codecs.
   caller()->SetGeneratedSdpMunger([](cricket::SessionDescription* desc) {
     for (ContentInfo& content : desc->contents()) {
-      cricket::VideoContentDescription* media =
-          content.media_description()->as_video();
-      std::vector<cricket::VideoCodec> codecs = media->codecs();
-      std::vector<cricket::VideoCodec> codecs_out;
-      for (cricket::VideoCodec codec : codecs) {
+      cricket::MediaContentDescription* media = content.media_description();
+      std::vector<cricket::Codec> codecs = media->codecs();
+      std::vector<cricket::Codec> codecs_out;
+      for (cricket::Codec codec : codecs) {
         if (codec.name == "VP8") {
           ASSERT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
               cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc
index c057e55..5ee9881 100644
--- a/pc/peer_connection_interface_unittest.cc
+++ b/pc/peer_connection_interface_unittest.cc
@@ -1227,8 +1227,7 @@
   bool HasCNCodecs(const cricket::ContentInfo* content) {
     RTC_DCHECK(content);
     RTC_DCHECK(content->media_description());
-    for (const cricket::AudioCodec& codec :
-         content->media_description()->as_audio()->codecs()) {
+    for (const cricket::Codec& codec : content->media_description()->codecs()) {
       if (codec.name == "CN") {
         return true;
       }
diff --git a/pc/peer_connection_media_unittest.cc b/pc/peer_connection_media_unittest.cc
index 796520f..387094c 100644
--- a/pc/peer_connection_media_unittest.cc
+++ b/pc/peer_connection_media_unittest.cc
@@ -1638,7 +1638,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_audio()
                     ->codecs();
   EXPECT_TRUE(CompareCodecs(sender_audio_codecs, codecs));
 }
@@ -1661,7 +1660,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_audio()
                     ->codecs();
   EXPECT_TRUE(CompareCodecs(sender_audio_codecs, codecs));
 }
@@ -1733,7 +1731,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   EXPECT_TRUE(CompareCodecs(sender_video_codecs, codecs));
 }
@@ -1757,7 +1754,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   EXPECT_TRUE(CompareCodecs(sender_video_codecs, codecs));
 }
@@ -1786,7 +1782,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   EXPECT_TRUE(CompareCodecs(single_codec, codecs));
 }
@@ -1831,7 +1826,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
 
   EXPECT_TRUE(CompareCodecs(video_codecs_vpx_rtx, codecs));
@@ -1878,7 +1872,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
 
   EXPECT_EQ(codecs.size(), 2u);  // VP8, VP9
@@ -1903,7 +1896,6 @@
   auto recv_codecs = answer->description()
                          ->contents()[0]
                          .media_description()
-                         ->as_video()
                          ->codecs();
   EXPECT_EQ(recv_codecs.size(), 1u);  // VP8
 }
@@ -1951,7 +1943,6 @@
   auto codecs = offer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   EXPECT_EQ(codecs.size(), 2u);  // VP9, VP8
   EXPECT_TRUE(CompareCodecs(video_codecs_vpx, codecs));
@@ -1966,7 +1957,6 @@
   auto recv_codecs = answer->description()
                          ->contents()[0]
                          .media_description()
-                         ->as_video()
                          ->codecs();
 
   EXPECT_TRUE(CompareCodecs(video_codecs_vpx_reverse, recv_codecs));
diff --git a/pc/peer_connection_signaling_unittest.cc b/pc/peer_connection_signaling_unittest.cc
index aeba7ef..190fb38 100644
--- a/pc/peer_connection_signaling_unittest.cc
+++ b/pc/peer_connection_signaling_unittest.cc
@@ -984,13 +984,10 @@
 
   auto answer = caller->CreateAnswer();
   ASSERT_EQ(answer->description()->contents().size(), 1u);
-  ASSERT_NE(
-      answer->description()->contents()[0].media_description()->as_video(),
-      nullptr);
+  ASSERT_NE(answer->description()->contents()[0].media_description(), nullptr);
   auto codecs = answer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   ASSERT_EQ(codecs.size(), 2u);
   EXPECT_EQ(codecs[1].name, "flexfec-03");
@@ -1040,13 +1037,10 @@
 
   auto answer = caller->CreateAnswer();
   ASSERT_EQ(answer->description()->contents().size(), 1u);
-  ASSERT_NE(
-      answer->description()->contents()[0].media_description()->as_video(),
-      nullptr);
+  ASSERT_NE(answer->description()->contents()[0].media_description(), nullptr);
   auto codecs = answer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   ASSERT_EQ(codecs.size(), 2u);
   EXPECT_EQ(codecs[1].name, "flexfec-03");
@@ -1059,7 +1053,6 @@
   auto offer_codecs = offer->description()
                           ->contents()[0]
                           .media_description()
-                          ->as_video()
                           ->codecs();
   auto flexfec_it = std::find_if(
       offer_codecs.begin(), offer_codecs.end(),
@@ -1353,7 +1346,6 @@
   auto codecs = reoffer->description()
                     ->contents()[0]
                     .media_description()
-                    ->as_video()
                     ->codecs();
   ASSERT_GT(codecs.size(), 2u);
   EXPECT_EQ(codecs[0].name, "VP8");
diff --git a/pc/sdp_offer_answer.cc b/pc/sdp_offer_answer.cc
index 04d1aff..b61fbf5 100644
--- a/pc/sdp_offer_answer.cc
+++ b/pc/sdp_offer_answer.cc
@@ -565,22 +565,9 @@
       continue;
     }
     const auto type = media_description->type();
-    if (type == cricket::MEDIA_TYPE_AUDIO) {
-      RTC_DCHECK(media_description->as_audio());
-      for (const auto& codec : media_description->as_audio()->codecs()) {
-        if (!cricket::UsedPayloadTypes::IsIdValid(
-                codec, media_description->rtcp_mux())) {
-          LOG_AND_RETURN_ERROR(
-              RTCErrorType::INVALID_PARAMETER,
-              "The media section with MID='" + content.mid() +
-                  "' used an invalid payload type " + rtc::ToString(codec.id) +
-                  " for codec '" + codec.name + ", rtcp-mux:" +
-                  (media_description->rtcp_mux() ? "enabled" : "disabled"));
-        }
-      }
-    } else if (type == cricket::MEDIA_TYPE_VIDEO) {
-      RTC_DCHECK(media_description->as_video());
-      for (const auto& codec : media_description->as_video()->codecs()) {
+    if (type == cricket::MEDIA_TYPE_AUDIO ||
+        type == cricket::MEDIA_TYPE_VIDEO) {
+      for (const auto& codec : media_description->codecs()) {
         if (!cricket::UsedPayloadTypes::IsIdValid(
                 codec, media_description->rtcp_mux())) {
           LOG_AND_RETURN_ERROR(
@@ -1887,8 +1874,8 @@
       if (audio_content->rejected) {
         RemoveSenders(cricket::MEDIA_TYPE_AUDIO);
       } else {
-        const cricket::AudioContentDescription* audio_desc =
-            audio_content->media_description()->as_audio();
+        const cricket::MediaContentDescription* audio_desc =
+            audio_content->media_description();
         UpdateLocalSenders(audio_desc->streams(), audio_desc->type());
       }
     }
@@ -1899,8 +1886,8 @@
       if (video_content->rejected) {
         RemoveSenders(cricket::MEDIA_TYPE_VIDEO);
       } else {
-        const cricket::VideoContentDescription* video_desc =
-            video_content->media_description()->as_video();
+        const cricket::MediaContentDescription* video_desc =
+            video_content->media_description();
         UpdateLocalSenders(video_desc->streams(), video_desc->type());
       }
     }
@@ -5365,44 +5352,40 @@
       // Ignore transceivers that are not receiving.
       continue;
     }
-    switch (content_info.media_description()->type()) {
-      case cricket::MediaType::MEDIA_TYPE_AUDIO: {
-        if (!mid_header_extension_missing_audio) {
-          mid_header_extension_missing_audio =
-              !ContentHasHeaderExtension(content_info, RtpExtension::kMidUri);
-        }
-        const cricket::AudioContentDescription* audio_desc =
-            content_info.media_description()->as_audio();
-        for (const cricket::AudioCodec& audio : audio_desc->codecs()) {
-          if (payload_types->audio_payload_types.count(audio.id)) {
+    const cricket::MediaType media_type =
+        content_info.media_description()->type();
+    if (media_type == cricket::MediaType::MEDIA_TYPE_AUDIO ||
+        media_type == cricket::MediaType::MEDIA_TYPE_VIDEO) {
+      if (media_type == cricket::MediaType::MEDIA_TYPE_AUDIO &&
+          !mid_header_extension_missing_audio) {
+        mid_header_extension_missing_audio =
+            !ContentHasHeaderExtension(content_info, RtpExtension::kMidUri);
+      } else if (media_type == cricket::MEDIA_TYPE_VIDEO &&
+                 !mid_header_extension_missing_video) {
+        mid_header_extension_missing_video =
+            !ContentHasHeaderExtension(content_info, RtpExtension::kMidUri);
+      }
+      const cricket::MediaContentDescription* media_desc =
+          content_info.media_description();
+      for (const cricket::Codec& codec : media_desc->codecs()) {
+        if (media_type == cricket::MediaType::MEDIA_TYPE_AUDIO) {
+          if (payload_types->audio_payload_types.count(codec.id)) {
             // Two m= sections are using the same payload type, thus demuxing
             // by payload type is not possible.
-            payload_types->pt_demuxing_possible_audio = false;
+            if (media_type == cricket::MediaType::MEDIA_TYPE_AUDIO) {
+              payload_types->pt_demuxing_possible_audio = false;
+            }
           }
-          payload_types->audio_payload_types.insert(audio.id);
-        }
-        break;
-      }
-      case cricket::MediaType::MEDIA_TYPE_VIDEO: {
-        if (!mid_header_extension_missing_video) {
-          mid_header_extension_missing_video =
-              !ContentHasHeaderExtension(content_info, RtpExtension::kMidUri);
-        }
-        const cricket::VideoContentDescription* video_desc =
-            content_info.media_description()->as_video();
-        for (const cricket::VideoCodec& video : video_desc->codecs()) {
-          if (payload_types->video_payload_types.count(video.id)) {
+          payload_types->audio_payload_types.insert(codec.id);
+        } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
+          if (payload_types->video_payload_types.count(codec.id)) {
             // Two m= sections are using the same payload type, thus demuxing
             // by payload type is not possible.
             payload_types->pt_demuxing_possible_video = false;
           }
-          payload_types->video_payload_types.insert(video.id);
+          payload_types->video_payload_types.insert(codec.id);
         }
-        break;
       }
-      default:
-        // Ignore data channels.
-        continue;
     }
   }
 
diff --git a/pc/sdp_offer_answer_unittest.cc b/pc/sdp_offer_answer_unittest.cc
index 9a44360..f158feb 100644
--- a/pc/sdp_offer_answer_unittest.cc
+++ b/pc/sdp_offer_answer_unittest.cc
@@ -990,8 +990,7 @@
 
   auto offer = pc->CreateOffer();
   ASSERT_EQ(offer->description()->contents().size(), 1u);
-  auto* audio =
-      offer->description()->contents()[0].media_description()->as_audio();
+  auto* audio = offer->description()->contents()[0].media_description();
   ASSERT_GT(audio->codecs().size(), 0u);
   EXPECT_TRUE(audio->rtcp_mux());
   auto codecs = audio->codecs();
diff --git a/pc/webrtc_sdp_unittest.cc b/pc/webrtc_sdp_unittest.cc
index 2c43c35..ae26ba0 100644
--- a/pc/webrtc_sdp_unittest.cc
+++ b/pc/webrtc_sdp_unittest.cc
@@ -1316,8 +1316,9 @@
     return video;
   }
 
-  template <class MCD>
-  void CompareMediaContentDescription(const MCD* cd1, const MCD* cd2) {
+  void CompareMediaContentDescription(
+      const cricket::MediaContentDescription* cd1,
+      const cricket::MediaContentDescription* cd2) {
     // type
     EXPECT_EQ(cd1->type(), cd2->type());
 
@@ -1427,20 +1428,14 @@
 
       ASSERT_EQ(IsAudioContent(&c1), IsAudioContent(&c2));
       if (IsAudioContent(&c1)) {
-        const AudioContentDescription* acd1 =
-            c1.media_description()->as_audio();
-        const AudioContentDescription* acd2 =
-            c2.media_description()->as_audio();
-        CompareMediaContentDescription<AudioContentDescription>(acd1, acd2);
+        CompareMediaContentDescription(c1.media_description(),
+                                       c2.media_description());
       }
 
       ASSERT_EQ(IsVideoContent(&c1), IsVideoContent(&c2));
       if (IsVideoContent(&c1)) {
-        const VideoContentDescription* vcd1 =
-            c1.media_description()->as_video();
-        const VideoContentDescription* vcd2 =
-            c2.media_description()->as_video();
-        CompareMediaContentDescription<VideoContentDescription>(vcd1, vcd2);
+        CompareMediaContentDescription(c1.media_description(),
+                                       c2.media_description());
       }
 
       ASSERT_EQ(IsDataContent(&c1), IsDataContent(&c2));
@@ -5015,7 +5010,7 @@
   EXPECT_TRUE(SdpDeserialize(sdp, &jdesc));
   ASSERT_EQ(1u, jdesc.description()->contents().size());
   const auto content = jdesc.description()->contents()[0];
-  const auto* audio_description = content.media_description()->as_audio();
+  const auto* audio_description = content.media_description();
   ASSERT_NE(audio_description, nullptr);
   const auto& extensions = audio_description->rtp_header_extensions();
   ASSERT_EQ(1u, extensions.size());
diff --git a/test/peer_scenario/scenario_connection.cc b/test/peer_scenario/scenario_connection.cc
index 66eca27..2c7a589 100644
--- a/test/peer_scenario/scenario_connection.cc
+++ b/test/peer_scenario/scenario_connection.cc
@@ -177,17 +177,8 @@
   RTC_CHECK(res.ok()) << res.message();
   RtpDemuxerCriteria criteria;
   for (const auto& content : remote_description_->description()->contents()) {
-    if (content.media_description()->as_audio()) {
-      for (const auto& codec :
-           content.media_description()->as_audio()->codecs()) {
-        criteria.payload_types().insert(codec.id);
-      }
-    }
-    if (content.media_description()->as_video()) {
-      for (const auto& codec :
-           content.media_description()->as_video()->codecs()) {
-        criteria.payload_types().insert(codec.id);
-      }
+    for (const auto& codec : content.media_description()->codecs()) {
+      criteria.payload_types().insert(codec.id);
     }
   }