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);
     }
   }
 
