Remove AsSendChannel/AsReceiveChannel methods

This CL removes a couple more opportunities for client code
to interact directly with the MediaChannel implementation classes.

No-try because of infra failure.

No-Try: true
Bug: webrtc:13931
Change-Id: I658b8b04eff11de7831a1933d16d40fc59c3f0fc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/288380
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38935}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index dca97e9..6ff7615 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -450,6 +450,7 @@
   deps = [
     ":codec",
     ":media_channel",
+    ":media_channel_impl",
     ":media_constants",
     ":rtc_media_base",
     ":rtp_utils",
diff --git a/media/base/media_channel_impl.h b/media/base/media_channel_impl.h
index 45a250e..190477a 100644
--- a/media/base/media_channel_impl.h
+++ b/media/base/media_channel_impl.h
@@ -74,11 +74,6 @@
                         bool enable_dscp = false);
   virtual ~MediaChannel();
 
-  // Downcasting to the implemented interfaces.
-  MediaSendChannelInterface* AsSendChannel() { return this; }
-
-  MediaReceiveChannelInterface* AsReceiveChannel() { return this; }
-
   // Downcasting to the subclasses.
   virtual VideoMediaChannel* AsVideoChannel() {
     RTC_CHECK_NOTREACHED();
diff --git a/media/base/media_engine.h b/media/base/media_engine.h
index 96b54ba..521b824 100644
--- a/media/base/media_engine.h
+++ b/media/base/media_engine.h
@@ -24,7 +24,6 @@
 #include "call/audio_state.h"
 #include "media/base/codec.h"
 #include "media/base/media_channel.h"
-#include "media/base/media_channel_impl.h"
 #include "media/base/media_config.h"
 #include "media/base/video_common.h"
 #include "rtc_base/system/file_wrapper.h"
@@ -38,6 +37,9 @@
 
 namespace cricket {
 
+class VideoMediaChannel;
+class VoiceMediaChannel;
+
 // Checks that the scalability_mode value of each encoding is supported by at
 // least one video codec of the list. If the list is empty, no check is done.
 webrtc::RTCError CheckScalabilityModeValues(
diff --git a/media/engine/webrtc_video_engine.h b/media/engine/webrtc_video_engine.h
index 832d808..2df2932 100644
--- a/media/engine/webrtc_video_engine.h
+++ b/media/engine/webrtc_video_engine.h
@@ -31,6 +31,7 @@
 #include "call/flexfec_receive_stream.h"
 #include "call/video_receive_stream.h"
 #include "call/video_send_stream.h"
+#include "media/base/media_channel_impl.h"
 #include "media/base/media_engine.h"
 #include "rtc_base/network_route.h"
 #include "rtc_base/synchronization/mutex.h"
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 91cd59a..0e63b57 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -437,8 +437,8 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      StreamParams::CreateLegacy(kSsrc)));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
   // Add CVO extension.
   const int id = 1;
@@ -446,13 +446,13 @@
   parameters.codecs.push_back(GetEngineCodec("VP8"));
   parameters.extensions.push_back(
       RtpExtension(RtpExtension::kVideoRotationUri, id));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 
   EXPECT_CALL(
       video_source,
       AddOrUpdateSink(_, Field(&rtc::VideoSinkWants::rotation_applied, false)));
   // Set capturer.
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &video_source));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &video_source));
 
   // Verify capturer has turned off applying rotation.
   ::testing::Mock::VerifyAndClear(&video_source);
@@ -463,7 +463,7 @@
       video_source,
       AddOrUpdateSink(_, Field(&rtc::VideoSinkWants::rotation_applied, true)));
 
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 }
 
 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) {
@@ -475,15 +475,15 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
   // Add CVO extension.
   const int id = 1;
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
   parameters.extensions.push_back(
       RtpExtension(RtpExtension::kVideoRotationUri, id));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      StreamParams::CreateLegacy(kSsrc)));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
   // Set source.
   EXPECT_CALL(
@@ -500,14 +500,15 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      StreamParams::CreateLegacy(kSsrc)));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+
+  EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
   // Set capturer.
   EXPECT_CALL(
       video_source,
       AddOrUpdateSink(_, Field(&rtc::VideoSinkWants::rotation_applied, true)));
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &video_source));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &video_source));
 
   // Verify capturer has turned on applying rotation.
   ::testing::Mock::VerifyAndClear(&video_source);
@@ -524,7 +525,7 @@
   EXPECT_CALL(
       video_source,
       AddOrUpdateSink(_, Field(&rtc::VideoSinkWants::rotation_applied, false)));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 
   // Verify capturer has turned off applying rotation.
   ::testing::Mock::VerifyAndClear(&video_source);
@@ -534,7 +535,7 @@
   EXPECT_CALL(
       video_source,
       AddOrUpdateSink(_, Field(&rtc::VideoSinkWants::rotation_applied, true)));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 }
 
 TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) {
@@ -543,13 +544,13 @@
   std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
       call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
 
-  EXPECT_TRUE(
-      channel->AsSendChannel()->AddSendStream(StreamParams::CreateLegacy(123)));
+  EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123)));
 
-  EXPECT_FALSE(channel->SetSend(true))
+  EXPECT_FALSE(send_channel->SetSend(true))
       << "Channel should not start without codecs.";
-  EXPECT_TRUE(channel->SetSend(false))
+  EXPECT_TRUE(send_channel->SetSend(false))
       << "Channel should be stoppable even without set codecs.";
 }
 
@@ -559,8 +560,9 @@
   std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
       call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  EXPECT_TRUE(
-      channel->AsSendChannel()->AddSendStream(StreamParams::CreateLegacy(123)));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+
+  EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123)));
   VideoMediaInfo info;
   channel->GetStats(&info);
 }
@@ -570,16 +572,18 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  channel->AsSendChannel()->OnReadyToSend(true);
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
 
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrc)));
+  send_channel->OnReadyToSend(true);
+
+  EXPECT_TRUE(
+      send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
   EXPECT_EQ(0, encoder_factory_->GetNumCreatedEncoders());
-  EXPECT_TRUE(channel->SetSend(true));
+  EXPECT_TRUE(send_channel->SetSend(true));
   webrtc::test::FrameForwarder frame_forwarder;
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 30);
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
   // Sending one frame will have allocate the encoder.
@@ -594,11 +598,11 @@
   // (expecting a no-op).
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
   EXPECT_EQ(num_created_encoders, encoder_factory_->GetNumCreatedEncoders());
 
   // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel->RemoveSendStream(kSsrc));
   EXPECT_EQ(0u, encoder_factory_->encoders().size());
 }
 
@@ -649,8 +653,10 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
+  auto receive_channel =
+      std::make_unique<VideoMediaReceiveChannel>(channel.get());
 
-  EXPECT_TRUE(channel->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
 }
 #endif  // defined(RTC_ENABLE_VP9)
@@ -661,14 +667,15 @@
   call_.reset(fake_call);
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
 
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrc)));
+  EXPECT_TRUE(
+      send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
 
   webrtc::test::FrameForwarder frame_forwarder;
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 60);
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
   channel->SetSend(true);
 
   FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
@@ -706,7 +713,7 @@
   }
 
   // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel->RemoveSendStream(kSsrc));
 }
 
 void WebRtcVideoEngineTest::AssignDefaultAptRtxTypes() {
@@ -821,11 +828,12 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      CreateSimStreamParams("cname", ssrcs)));
+  EXPECT_TRUE(
+      send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
   EXPECT_TRUE(channel->SetSend(true));
 
   webrtc::test::FrameForwarder frame_forwarder;
@@ -866,12 +874,13 @@
   std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
       call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
 
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrc)));
+  EXPECT_TRUE(
+      send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
   EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
   // Sending one frame will have allocate the encoder.
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -898,14 +907,15 @@
   std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
       call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      CreateSimStreamParams("cname", ssrcs)));
+  EXPECT_TRUE(
+      send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
   EXPECT_TRUE(channel->SetSend(true));
 
   // Send a fake frame, or else the media engine will configure the simulcast
@@ -936,12 +946,13 @@
   std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
       call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
 
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrc)));
+  EXPECT_TRUE(
+      send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
 
   // Send a frame of 720p. This should trigger a "real" encoder initialization.
   webrtc::test::FrameForwarder frame_forwarder;
@@ -969,12 +980,14 @@
   std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
       call_.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
 
   const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel->AddSendStream(
       cricket::CreateSimStreamParams("cname", ssrcs)));
 
   // Send a frame of 720p. This should trigger a "real" encoder initialization.
@@ -1092,19 +1105,21 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetRecvParamsWithSupportedCodecs(parameters.codecs));
+  auto receive_channel =
+      std::make_unique<VideoMediaReceiveChannel>(channel.get());
 
-  EXPECT_TRUE(channel->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
   // Decoders are not created until they are used.
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
   EXPECT_EQ(0u, decoder_factory_->decoders().size());
 
   // Setting codecs of the same type should not reallocate the decoder.
-  EXPECT_TRUE(channel->SetRecvParameters(parameters));
+  EXPECT_TRUE(receive_channel->SetRecvParameters(parameters));
   EXPECT_EQ(0, decoder_factory_->GetNumCreatedDecoders());
 
   // Remove stream previously added to free the external decoder instance.
-  EXPECT_TRUE(channel->AsReceiveChannel()->RemoveRecvStream(kSsrc));
+  EXPECT_TRUE(receive_channel->RemoveRecvStream(kSsrc));
   EXPECT_EQ(0u, decoder_factory_->decoders().size());
 }
 
@@ -1120,8 +1135,10 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetRecvParamsWithSupportedCodecs(codecs));
+  auto receive_channel =
+      std::make_unique<VideoMediaReceiveChannel>(channel.get());
 
-  EXPECT_TRUE(channel->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
   // Decoders are not created until they are used.
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
@@ -1137,8 +1154,10 @@
   parameters.codecs.push_back(GetEngineCodec("VP8"));
   std::unique_ptr<VideoMediaChannel> channel(
       SetRecvParamsWithSupportedCodecs(parameters.codecs));
+  auto receive_channel =
+      std::make_unique<VideoMediaReceiveChannel>(channel.get());
 
-  EXPECT_TRUE(channel->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
 
   // Call GetSources with |kSsrc + 1| which doesn't exist.
@@ -1262,12 +1281,15 @@
   std::unique_ptr<VideoMediaChannel> send_channel(engine.CreateMediaChannel(
       call.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       rate_allocator_factory.get()));
+  auto send_send_channel =
+      std::make_unique<VideoMediaSendChannel>(send_channel.get());
+
   cricket::VideoSendParameters send_parameters;
   send_parameters.codecs.push_back(engine_codecs.at(0));
   EXPECT_TRUE(send_channel->SetSendParameters(send_parameters));
-  send_channel->AsSendChannel()->OnReadyToSend(true);
-  EXPECT_TRUE(send_channel->AsSendChannel()->AddSendStream(
-      StreamParams::CreateLegacy(send_ssrc)));
+  send_send_channel->OnReadyToSend(true);
+  EXPECT_TRUE(
+      send_send_channel->AddSendStream(StreamParams::CreateLegacy(send_ssrc)));
   EXPECT_TRUE(send_channel->SetSend(true));
 
   // Set capturer.
@@ -1284,18 +1306,21 @@
   std::unique_ptr<VideoMediaChannel> recv_channel(engine.CreateMediaChannel(
       call.get(), GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
       rate_allocator_factory.get()));
+  auto receive_channel =
+      std::make_unique<VideoMediaReceiveChannel>(recv_channel.get());
+
   cricket::VideoRecvParameters recv_parameters;
   recv_parameters.codecs.push_back(engine_codecs.at(0));
-  EXPECT_TRUE(recv_channel->SetRecvParameters(recv_parameters));
-  EXPECT_TRUE(recv_channel->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel->SetRecvParameters(recv_parameters));
+  EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(recv_ssrc)));
 
   // Remove streams previously added to free the encoder and decoder instance.
   EXPECT_CALL(*encoder_factory, Die());
   EXPECT_CALL(*decoder_factory, Die());
   EXPECT_CALL(*rate_allocator_factory, Die());
-  EXPECT_TRUE(send_channel->AsSendChannel()->RemoveSendStream(send_ssrc));
-  EXPECT_TRUE(recv_channel->AsReceiveChannel()->RemoveRecvStream(recv_ssrc));
+  EXPECT_TRUE(send_send_channel->RemoveSendStream(send_ssrc));
+  EXPECT_TRUE(receive_channel->RemoveRecvStream(recv_ssrc));
 }
 
 TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) {
@@ -1303,12 +1328,14 @@
   std::unique_ptr<FakeCall> fake_call(new FakeCall());
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  ASSERT_TRUE(channel->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrc)));
+  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+
+  ASSERT_TRUE(
+      send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
   cricket::VideoCodec codec = GetEngineCodec("VP8");
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(codec);
-  channel->AsSendChannel()->OnReadyToSend(true);
+  send_channel->OnReadyToSend(true);
   channel->SetSend(true);
   ASSERT_TRUE(channel->SetSendParameters(parameters));
 
@@ -1354,7 +1381,7 @@
             encoder_factory_->encoders().back()->GetCodecSettings().mode);
 
   // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel->RemoveSendStream(kSsrc));
   EXPECT_EQ(0u, encoder_factory_->encoders().size());
 }
 
@@ -1408,6 +1435,10 @@
                 cricket::VideoOptions(),
                 webrtc::CryptoOptions(),
                 video_bitrate_allocator_factory_.get())))) {
+    send_channel_ = std::make_unique<VideoMediaSendChannel>(channel_.get());
+    receive_channel_ =
+        std::make_unique<VideoMediaReceiveChannel>(channel_.get());
+
     network_interface_.SetDestination(channel_.get());
     channel_->SetInterface(&network_interface_);
     cricket::VideoRecvParameters parameters;
@@ -1455,6 +1486,8 @@
       video_bitrate_allocator_factory_;
   WebRtcVideoEngine engine_;
   std::unique_ptr<WebRtcVideoChannel> channel_;
+  std::unique_ptr<VideoMediaSendChannel> send_channel_;
+  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
   cricket::FakeNetworkInterface network_interface_;
   cricket::FakeVideoRenderer renderer_;
 };
@@ -1474,7 +1507,7 @@
   EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
   DeliverKeyFrame(kSsrc);
   EXPECT_EQ_WAIT(1, renderer_.num_rendered_frames(), kTimeout);
-  channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc);
+  receive_channel_->RemoveRecvStream(kSsrc);
 }
 
 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest,
@@ -1487,7 +1520,7 @@
   channel_->SetRecordableEncodedFrameCallback(kSsrc, callback.AsStdFunction());
   DeliverKeyFrame(kSsrc);
   EXPECT_EQ_WAIT(1, renderer_.num_rendered_frames(), kTimeout);
-  channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc);
+  receive_channel_->RemoveRecvStream(kSsrc);
 }
 
 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest,
@@ -1500,7 +1533,7 @@
   channel_->SetRecordableEncodedFrameCallback(kSsrc, callback.AsStdFunction());
   DeliverKeyFrame(kSsrc);
   EXPECT_EQ_WAIT(1, renderer_.num_rendered_frames(), kTimeout);
-  channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc);
+  receive_channel_->RemoveRecvStream(kSsrc);
 }
 
 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest,
@@ -1515,7 +1548,7 @@
   channel_->SetRecordableEncodedFrameCallback(kSsrc, callback.AsStdFunction());
   DeliverKeyFrame(kSsrc);  // Expected to not cause function to fire.
   DeliverKeyFrameAndWait(kSsrc + 1);
-  channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc + 1);
+  receive_channel_->RemoveRecvStream(kSsrc + 1);
 }
 
 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest,
@@ -1530,7 +1563,7 @@
   channel_->SetRecordableEncodedFrameCallback(kSsrc, callback.AsStdFunction());
   DeliverKeyFrame(kSsrc);  // Expected to not cause function to fire.
   DeliverKeyFrameAndWait(kSsrc + 1);
-  channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc + 1);
+  receive_channel_->RemoveRecvStream(kSsrc + 1);
 }
 
 class WebRtcVideoChannelBaseTest : public ::testing::Test {
@@ -1561,15 +1594,17 @@
         static_cast<cricket::WebRtcVideoChannel*>(engine_.CreateMediaChannel(
             call_.get(), media_config, cricket::VideoOptions(),
             webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get())));
-    channel_->AsSendChannel()->OnReadyToSend(true);
+    send_channel_ = std::make_unique<VideoMediaSendChannel>(channel_.get());
+    receive_channel_ =
+        std::make_unique<VideoMediaReceiveChannel>(channel_.get());
+    send_channel_->OnReadyToSend(true);
     EXPECT_TRUE(channel_.get() != NULL);
     network_interface_.SetDestination(channel_.get());
     channel_->SetInterface(&network_interface_);
     cricket::VideoRecvParameters parameters;
     parameters.codecs = engine_.send_codecs();
     channel_->SetRecvParameters(parameters);
-    EXPECT_TRUE(
-        channel_->AsSendChannel()->AddSendStream(DefaultSendStreamParams()));
+    EXPECT_TRUE(send_channel_->AddSendStream(DefaultSendStreamParams()));
     frame_forwarder_ = std::make_unique<webrtc::test::FrameForwarder>();
     frame_source_ = std::make_unique<cricket::FakeFrameSource>(
         640, 480, rtc::kNumMicrosecsPerSec / kFramerate);
@@ -1581,7 +1616,7 @@
   void SetUpSecondStream() {
     SetUpSecondStreamWithNoRecv();
     // Setup recv for second stream.
-    EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+    EXPECT_TRUE(receive_channel_->AddRecvStream(
         cricket::StreamParams::CreateLegacy(kSsrc + 2)));
     // Make the second renderer available for use by a new stream.
     EXPECT_TRUE(channel_->SetSink(kSsrc + 2, &renderer2_));
@@ -1591,12 +1626,12 @@
   // This is required if you want to test unsignalled recv of video rtp packets.
   void SetUpSecondStreamWithNoRecv() {
     // SetUp() already added kSsrc make sure duplicate SSRCs cant be added.
-    EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+    EXPECT_TRUE(receive_channel_->AddRecvStream(
         cricket::StreamParams::CreateLegacy(kSsrc)));
     EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
-    EXPECT_FALSE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_FALSE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrc)));
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrc + 2)));
     // We dont add recv for the second stream.
 
@@ -1747,6 +1782,8 @@
   std::unique_ptr<webrtc::test::FrameForwarder> frame_forwarder_2_;
 
   std::unique_ptr<WebRtcVideoChannel> channel_;
+  std::unique_ptr<VideoMediaSendChannel> send_channel_;
+  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
   cricket::FakeNetworkInterface network_interface_;
   cricket::FakeVideoRenderer renderer_;
 
@@ -1849,10 +1886,10 @@
   parameters.conference_mode = true;
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
   EXPECT_TRUE(SetSend(true));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(1)));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(2)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
   EXPECT_TRUE(channel_->SetSink(1, &renderer1));
   EXPECT_TRUE(channel_->SetSink(2, &renderer2));
   EXPECT_EQ(0, renderer1.num_rendered_frames());
@@ -1901,7 +1938,7 @@
   parameters.codecs.push_back(DefaultCodec());
   parameters.conference_mode = true;
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel_->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
   EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
   EXPECT_TRUE(SetSend(true));
@@ -1916,10 +1953,10 @@
   const int kTestHeight = 120;
   cricket::FakeFrameSource frame_source(kTestWidth, kTestHeight,
                                         rtc::kNumMicrosecsPerSec / 5);
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(5678)));
+  EXPECT_TRUE(
+      send_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(5678)));
   EXPECT_TRUE(channel_->SetVideoSend(5678, nullptr, &frame_forwarder));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel_->AddRecvStream(
       cricket::StreamParams::CreateLegacy(5678)));
   EXPECT_TRUE(channel_->SetSink(5678, &renderer2));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -1988,10 +2025,10 @@
 // Test that we can set the SSRC even after codecs are set.
 TEST_F(WebRtcVideoChannelBaseTest, SetSendSsrcAfterSetCodecs) {
   // Remove stream added in Setup.
-  EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc));
   EXPECT_TRUE(SetDefaultCodec());
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(999)));
+  EXPECT_TRUE(
+      send_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(999)));
   EXPECT_TRUE(channel_->SetVideoSend(999u, nullptr, frame_forwarder_.get()));
   EXPECT_TRUE(SetSend(true));
   EXPECT_TRUE(WaitAndSendFrame(0));
@@ -2037,11 +2074,11 @@
   EXPECT_EQ(kSsrc, header.Ssrc());
 
   // Remove the send stream that was added during Setup.
-  EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc));
   int rtp_packets = NumRtpPackets();
 
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(789u)));
+  EXPECT_TRUE(
+      send_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(789u)));
   EXPECT_TRUE(channel_->SetVideoSend(789u, nullptr, frame_forwarder_.get()));
   EXPECT_EQ(rtp_packets, NumRtpPackets());
   // Wait 30ms to guarantee the engine does not drop the frame.
@@ -2062,10 +2099,10 @@
   parameters.conference_mode = true;
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
   EXPECT_TRUE(SetSend(true));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(1)));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(2)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
   EXPECT_TRUE(channel_->SetSink(1, &renderer1));
   EXPECT_TRUE(channel_->SetSink(2, &renderer2));
   EXPECT_EQ(0, renderer1.num_rendered_frames());
@@ -2085,8 +2122,8 @@
   EXPECT_EQ(kVideoHeight, renderer1.height());
   EXPECT_EQ(kVideoWidth, renderer2.width());
   EXPECT_EQ(kVideoHeight, renderer2.height());
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(2));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(1));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(2));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(1));
 }
 
 // Tests that we can add and remove capturers and frames are sent out properly
@@ -2184,7 +2221,7 @@
   // WebRTC implementation will drop frames if pushed to quickly. Wait the
   // interval time to avoid that.
   // Set up the stream associated with the engine.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel_->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
   EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
   cricket::VideoFormat capture_format(
@@ -2193,11 +2230,11 @@
   // Set up additional stream 1.
   cricket::FakeVideoRenderer renderer1;
   EXPECT_FALSE(channel_->SetSink(1, &renderer1));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(1)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
   EXPECT_TRUE(channel_->SetSink(1, &renderer1));
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(1)));
+  EXPECT_TRUE(
+      send_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(1)));
 
   webrtc::test::FrameForwarder frame_forwarder1;
   cricket::FakeFrameSource frame_source(kVideoWidth, kVideoHeight,
@@ -2206,11 +2243,11 @@
   // Set up additional stream 2.
   cricket::FakeVideoRenderer renderer2;
   EXPECT_FALSE(channel_->SetSink(2, &renderer2));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(2)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
   EXPECT_TRUE(channel_->SetSink(2, &renderer2));
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(2)));
+  EXPECT_TRUE(
+      send_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
   webrtc::test::FrameForwarder frame_forwarder2;
 
   // State for all the streams.
@@ -2246,31 +2283,29 @@
 // Tests empty StreamParams is rejected.
 TEST_F(WebRtcVideoChannelBaseTest, RejectEmptyStreamParams) {
   // Remove the send stream that was added during Setup.
-  EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc));
 
   cricket::StreamParams empty;
-  EXPECT_FALSE(channel_->AsSendChannel()->AddSendStream(empty));
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
-      cricket::StreamParams::CreateLegacy(789u)));
+  EXPECT_FALSE(send_channel_->AddSendStream(empty));
+  EXPECT_TRUE(
+      send_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(789u)));
 }
 
 // Test that multiple send streams can be created and deleted properly.
 TEST_F(WebRtcVideoChannelBaseTest, MultipleSendStreams) {
   // Remove stream added in Setup. I.e. remove stream corresponding to default
   // channel.
-  EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSsrc));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc));
   const unsigned int kSsrcsSize = sizeof(kSsrcs4) / sizeof(kSsrcs4[0]);
   for (unsigned int i = 0; i < kSsrcsSize; ++i) {
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
   }
   // Delete one of the non default channel streams, let the destructor delete
   // the remaining ones.
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->RemoveSendStream(kSsrcs4[kSsrcsSize - 1]));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrcs4[kSsrcsSize - 1]));
   // Stream should already be deleted.
-  EXPECT_FALSE(
-      channel_->AsSendChannel()->RemoveSendStream(kSsrcs4[kSsrcsSize - 1]));
+  EXPECT_FALSE(send_channel_->RemoveSendStream(kSsrcs4[kSsrcsSize - 1]));
 }
 
 TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8Vga) {
@@ -2384,8 +2419,7 @@
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
   channel_->SetVideoCodecSwitchingEnabled(true);
 
-  auto send_codecs =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrc).codecs;
+  auto send_codecs = send_channel_->GetRtpSendParameters(kSsrc).codecs;
   ASSERT_EQ(send_codecs.size(), 2u);
   EXPECT_THAT("VP9", send_codecs[0].name);
 
@@ -2394,7 +2428,7 @@
   channel_->RequestEncoderFallback();
   rtc::Thread::Current()->ProcessMessages(30);
 
-  send_codecs = channel_->AsSendChannel()->GetRtpSendParameters(kSsrc).codecs;
+  send_codecs = send_channel_->GetRtpSendParameters(kSsrc).codecs;
   ASSERT_EQ(send_codecs.size(), 2u);
   EXPECT_THAT("VP8", send_codecs[0].name);
 }
@@ -2419,7 +2453,11 @@
     channel_.reset(engine_.CreateMediaChannel(
         fake_call_.get(), GetMediaConfig(), VideoOptions(),
         webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
-    channel_->AsSendChannel()->OnReadyToSend(true);
+    send_channel_ =
+        std::make_unique<cricket::VideoMediaSendChannel>(channel_.get());
+    receive_channel_ =
+        std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+    send_channel_->OnReadyToSend(true);
     last_ssrc_ = 123;
     send_parameters_.codecs = engine_.send_codecs();
     recv_parameters_.codecs = engine_.recv_codecs();
@@ -2453,7 +2491,7 @@
   // the unsignalled receive stream cooldown is no longer in effect.
   void ReceivePacketAndAdvanceTime(rtc::CopyOnWriteBuffer packet,
                                    int64_t packet_time_us) {
-    channel_->AsReceiveChannel()->OnPacketReceived(packet, packet_time_us);
+    receive_channel_->OnPacketReceived(packet, packet_time_us);
     rtc::Thread::Current()->ProcessMessages(0);
     time_controller_.AdvanceTime(
         webrtc::TimeDelta::Millis(kUnsignalledReceiveStreamCooldownMs));
@@ -2466,7 +2504,7 @@
 
   FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
     size_t num_streams = fake_call_->GetVideoSendStreams().size();
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
+    EXPECT_TRUE(send_channel_->AddSendStream(sp));
     std::vector<FakeVideoSendStream*> streams =
         fake_call_->GetVideoSendStreams();
     EXPECT_EQ(num_streams + 1, streams.size());
@@ -2483,7 +2521,7 @@
 
   FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
     size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
-    EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+    EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
     std::vector<FakeVideoReceiveStream*> streams =
         fake_call_->GetVideoReceiveStreams();
     EXPECT_EQ(num_streams + 1, streams.size());
@@ -2528,7 +2566,7 @@
   void TestExtmapAllowMixedCaller(bool extmap_allow_mixed) {
     // For a caller, the answer will be applied in set remote description
     // where SetSendParameters() is called.
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrc)));
     send_parameters_.extmap_allow_mixed = extmap_allow_mixed;
     EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
@@ -2540,8 +2578,8 @@
   void TestExtmapAllowMixedCallee(bool extmap_allow_mixed) {
     // For a callee, the answer will be applied in set local description
     // where SetExtmapAllowMixed() and AddSendStream() are called.
-    channel_->AsSendChannel()->SetExtmapAllowMixed(extmap_allow_mixed);
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    send_channel_->SetExtmapAllowMixed(extmap_allow_mixed);
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrc)));
     const webrtc::VideoSendStream::Config& config =
         fake_call_->GetVideoSendStreams()[0]->GetConfig();
@@ -2721,14 +2759,13 @@
     limited_send_params.max_bandwidth_bps = global_max;
     EXPECT_TRUE(channel_->SetSendParameters(limited_send_params));
     webrtc::RtpParameters parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+        send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, parameters.encodings.size());
     parameters.encodings[0].max_bitrate_bps = stream_max;
-    EXPECT_TRUE(channel_->AsSendChannel()
-                    ->SetRtpSendParameters(last_ssrc_, parameters)
-                    .ok());
+    EXPECT_TRUE(
+        send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
     // Read back the parameteres and verify they have the correct value
-    parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, parameters.encodings.size());
     EXPECT_EQ(stream_max, parameters.encodings[0].max_bitrate_bps);
     // Verify that the new value propagated down to the encoder
@@ -2753,6 +2790,8 @@
   cricket::FakeFrameSource frame_source_;
   std::unique_ptr<FakeCall> fake_call_;
   std::unique_ptr<VideoMediaChannel> channel_;
+  std::unique_ptr<VideoMediaSendChannel> send_channel_;
+  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
   cricket::VideoSendParameters send_parameters_;
   cricket::VideoRecvParameters recv_parameters_;
   uint32_t last_ssrc_;
@@ -2764,7 +2803,7 @@
 
   cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kVideoSsrc);
   sp.set_stream_ids({kSyncLabel});
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
 
   EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
   EXPECT_EQ(kSyncLabel,
@@ -3058,8 +3097,8 @@
 }
 
 TEST_F(WebRtcVideoChannelTest, AddRecvStreamOnlyUsesOneReceiveStream) {
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(1)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
   EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
 }
 
@@ -3340,7 +3379,8 @@
   channel_.reset(engine_.CreateMediaChannel(
       fake_call_.get(), media_config, VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
+  send_channel_->OnReadyToSend(true);
 
   channel_->SetSendParameters(send_parameters_);
 
@@ -3351,7 +3391,8 @@
   channel_.reset(engine_.CreateMediaChannel(
       fake_call_.get(), media_config, VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
+  send_channel_->OnReadyToSend(true);
 
   channel_->SetSendParameters(send_parameters_);
 
@@ -3520,15 +3561,14 @@
   EXPECT_TRUE(vp9_settings.automaticResizeOn);
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_THAT(
       rtp_parameters.encodings,
       ElementsAre(Field(&webrtc::RtpEncodingParameters::scalability_mode,
                         absl::nullopt)));
   rtp_parameters.encodings[0].scalability_mode = "L2T1";
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, rtp_parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok());
 
   ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
   EXPECT_TRUE(vp9_settings.denoisingOn);
@@ -3536,14 +3576,13 @@
   EXPECT_FALSE(vp9_settings.automaticResizeOn)
       << "Automatic resize off for multiple spatial layers.";
 
-  rtp_parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_THAT(rtp_parameters.encodings,
               ElementsAre(Field(
                   &webrtc::RtpEncodingParameters::scalability_mode, "L2T1")));
   rtp_parameters.encodings[0].scalability_mode = "L1T1";
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, rtp_parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok());
 
   ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
   EXPECT_TRUE(vp9_settings.denoisingOn);
@@ -3646,16 +3685,14 @@
       AddSendStream(CreateSimStreamParams("cname", ssrcs));
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(ssrcs[0]);
+      send_channel_->GetRtpSendParameters(ssrcs[0]);
   ASSERT_EQ(kNumSpatialLayers, parameters.encodings.size());
   ASSERT_TRUE(parameters.encodings[0].active);
   ASSERT_TRUE(parameters.encodings[1].active);
   ASSERT_TRUE(parameters.encodings[2].active);
   // Invert value to verify copying.
   parameters.encodings[1].active = false;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(ssrcs[0], parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(ssrcs[0], parameters).ok());
 
   webrtc::VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy();
 
@@ -3888,7 +3925,9 @@
   channel_.reset(engine_.CreateMediaChannel(
       fake_call_.get(), media_config, VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
+
+  send_channel_->OnReadyToSend(true);
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
 
   AddSendStream();
@@ -3938,7 +3977,8 @@
   channel_.reset(engine_.CreateMediaChannel(
       fake_call_.get(), media_config, VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
+  send_channel_->OnReadyToSend(true);
 
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
 
@@ -3971,7 +4011,8 @@
   channel_.reset(engine_.CreateMediaChannel(
       fake_call_.get(), media_config, VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
+  send_channel_->OnReadyToSend(true);
 
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
 
@@ -4703,12 +4744,10 @@
 
   // The RtpParameter max bitrate overrides the codec's.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(1u, parameters.encodings.size());
   parameters.encodings[0].max_bitrate_bps = 500000;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size());
   EXPECT_EQ(parameters.encodings[0].max_bitrate_bps,
             video_send_stream->GetVideoStreams()[0].max_bitrate_bps);
@@ -4726,20 +4765,16 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1u, parameters.encodings.size());
 
   parameters.encodings[0].max_bitrate_bps = 99999 - 1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_EQ(parameters.encodings[0].max_bitrate_bps,
             stream->GetVideoStreams()[0].max_bitrate_bps);
 
   parameters.encodings[0].max_bitrate_bps = 99999 + 1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_EQ(send_parameters_.max_bandwidth_bps,
             stream->GetVideoStreams()[0].max_bitrate_bps);
 }
@@ -5303,12 +5338,15 @@
       new cricket::FakeNetworkInterface);
   MediaConfig config;
   std::unique_ptr<cricket::WebRtcVideoChannel> channel;
+  std::unique_ptr<cricket::VideoMediaSendChannel> send_channel;
   webrtc::RtpParameters parameters;
 
   channel.reset(
       static_cast<cricket::WebRtcVideoChannel*>(engine_.CreateMediaChannel(
           call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
           video_bitrate_allocator_factory_.get())));
+  send_channel.reset(new VideoMediaSendChannel(channel_.get()));
+
   channel->SetInterface(network_interface.get());
   // Default value when DSCP is disabled should be DSCP_DEFAULT.
   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
@@ -5321,25 +5359,23 @@
       static_cast<cricket::WebRtcVideoChannel*>(engine_.CreateMediaChannel(
           call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
           video_bitrate_allocator_factory_.get())));
+  send_channel.reset(new VideoMediaSendChannel(channel.get()));
   channel->SetInterface(network_interface.get());
   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
 
   // Create a send stream to configure
-  EXPECT_TRUE(channel->AsSendChannel()->AddSendStream(
-      StreamParams::CreateLegacy(kSsrc)));
-  parameters = channel->AsSendChannel()->GetRtpSendParameters(kSsrc);
+  EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
+  parameters = send_channel->GetRtpSendParameters(kSsrc);
   ASSERT_FALSE(parameters.encodings.empty());
 
   // Various priorities map to various dscp values.
   parameters.encodings[0].network_priority = webrtc::Priority::kHigh;
-  ASSERT_TRUE(channel->AsSendChannel()
-                  ->SetRtpSendParameters(kSsrc, parameters, nullptr)
-                  .ok());
+  ASSERT_TRUE(
+      send_channel->SetRtpSendParameters(kSsrc, parameters, nullptr).ok());
   EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
   parameters.encodings[0].network_priority = webrtc::Priority::kVeryLow;
-  ASSERT_TRUE(channel->AsSendChannel()
-                  ->SetRtpSendParameters(kSsrc, parameters, nullptr)
-                  .ok());
+  ASSERT_TRUE(
+      send_channel->SetRtpSendParameters(kSsrc, parameters, nullptr).ok());
   EXPECT_EQ(rtc::DSCP_CS1, network_interface->dscp());
 
   // Packets should also self-identify their dscp in PacketOptions.
@@ -5368,7 +5404,7 @@
   FakeVideoSendStream* stream1 = AddSendStream();
   EXPECT_EQ(webrtc::RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode);
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_FALSE(rtp_parameters.rtcp.reduced_size);
 
   // Now enable reduced size mode.
@@ -5376,7 +5412,7 @@
   EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
   stream1 = fake_call_->GetVideoSendStreams()[0];
   EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode);
-  rtp_parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_TRUE(rtp_parameters.rtcp.reduced_size);
 
   // Create a new stream and ensure it picks up the reduced size mode.
@@ -5410,13 +5446,13 @@
   EXPECT_EQ(webrtc::kNetworkUp,
             fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
 
-  channel_->AsSendChannel()->OnReadyToSend(false);
+  send_channel_->OnReadyToSend(false);
   EXPECT_EQ(webrtc::kNetworkDown,
             fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
   EXPECT_EQ(webrtc::kNetworkUp,
             fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
 
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_->OnReadyToSend(true);
   EXPECT_EQ(webrtc::kNetworkUp,
             fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
   EXPECT_EQ(webrtc::kNetworkUp,
@@ -5877,11 +5913,11 @@
       AddSendStream(cricket::CreateSimStreamParams("cname", {kSsrc1, kSsrc2}));
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrc1);
+      send_channel_->GetRtpSendParameters(kSsrc1);
   ASSERT_EQ(2u, parameters.encodings.size());
   parameters.encodings[0].active = false;
   parameters.encodings[1].active = true;
-  channel_->AsSendChannel()->SetRtpSendParameters(kSsrc1, parameters);
+  send_channel_->SetRtpSendParameters(kSsrc1, parameters);
 
   // Fill in dummy stats.
   auto stats = GetInitialisedStats();
@@ -5920,12 +5956,12 @@
   EXPECT_EQ(vp9_settings.numberOfSpatialLayers, 3u);
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrc1);
+      send_channel_->GetRtpSendParameters(kSsrc1);
   ASSERT_EQ(3u, parameters.encodings.size());
   parameters.encodings[0].active = false;
   parameters.encodings[1].active = true;
   parameters.encodings[2].active = false;
-  channel_->AsSendChannel()->SetRtpSendParameters(kSsrc1, parameters);
+  send_channel_->SetRtpSendParameters(kSsrc1, parameters);
 
   // Fill in dummy stats.
   auto stats = GetInitialisedStats();
@@ -5940,12 +5976,12 @@
   ASSERT_TRUE(video_media_info.senders[0].active.has_value());
   EXPECT_TRUE(video_media_info.senders[0].active.value());
 
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(kSsrc1);
+  parameters = send_channel_->GetRtpSendParameters(kSsrc1);
   ASSERT_EQ(3u, parameters.encodings.size());
   parameters.encodings[0].active = false;
   parameters.encodings[1].active = false;
   parameters.encodings[2].active = false;
-  channel_->AsSendChannel()->SetRtpSendParameters(kSsrc1, parameters);
+  send_channel_->SetRtpSendParameters(kSsrc1, parameters);
   ASSERT_TRUE(channel_->GetStats(&video_media_info));
   ASSERT_EQ(video_media_info.senders.size(), 1u);
   // No layer is active.
@@ -6436,7 +6472,7 @@
   EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx_ssrc)
       << "Default receive stream should not have configured RTX";
 
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel_->AddRecvStream(
       cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)));
   ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
       << "AddRecvStream should have reconfigured, not added a new receiver.";
@@ -6461,8 +6497,8 @@
       cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
   sp.ssrcs = ssrcs;  // Without RTXs, this is the important part.
 
-  EXPECT_FALSE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_FALSE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_FALSE(send_channel_->AddSendStream(sp));
+  EXPECT_FALSE(receive_channel_->AddRecvStream(sp));
 }
 
 TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithOverlappingRtxSsrcs) {
@@ -6474,20 +6510,20 @@
   StreamParams sp =
       cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
 
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(send_channel_->AddSendStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
 
   // The RTX SSRC is already used in previous streams, using it should fail.
   sp = cricket::StreamParams::CreateLegacy(rtx_ssrcs[0]);
-  EXPECT_FALSE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_FALSE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_FALSE(send_channel_->AddSendStream(sp));
+  EXPECT_FALSE(receive_channel_->AddRecvStream(sp));
 
   // After removing the original stream this should be fine to add (makes sure
   // that RTX ssrcs are not forever taken).
-  EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(ssrcs[0]));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(ssrcs[0]));
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(ssrcs[0]));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(ssrcs[0]));
+  EXPECT_TRUE(send_channel_->AddSendStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
 }
 
 TEST_F(WebRtcVideoChannelTest,
@@ -6499,23 +6535,21 @@
   StreamParams sp =
       cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kFirstStreamSsrcs));
 
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(send_channel_->AddSendStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
 
   // One of the SSRCs is already used in previous streams, using it should fail.
   sp = cricket::CreateSimStreamParams("cname",
                                       MAKE_VECTOR(kOverlappingStreamSsrcs));
-  EXPECT_FALSE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_FALSE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_FALSE(send_channel_->AddSendStream(sp));
+  EXPECT_FALSE(receive_channel_->AddRecvStream(sp));
 
   // After removing the original stream this should be fine to add (makes sure
   // that RTX ssrcs are not forever taken).
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->RemoveSendStream(kFirstStreamSsrcs[0]));
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->RemoveRecvStream(kFirstStreamSsrcs[0]));
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(send_channel_->RemoveSendStream(kFirstStreamSsrcs[0]));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kFirstStreamSsrcs[0]));
+  EXPECT_TRUE(send_channel_->AddSendStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
 }
 
 TEST_F(WebRtcVideoChannelTest, ReportsSsrcGroupsInStats) {
@@ -6527,14 +6561,14 @@
   StreamParams sender_sp = cricket::CreateSimWithRtxStreamParams(
       "cname", MAKE_VECTOR(kSenderSsrcs), MAKE_VECTOR(kSenderRtxSsrcs));
 
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sender_sp));
+  EXPECT_TRUE(send_channel_->AddSendStream(sender_sp));
 
   static const uint32_t kReceiverSsrcs[] = {3};
   static const uint32_t kReceiverRtxSsrcs[] = {2};
 
   StreamParams receiver_sp = cricket::CreateSimWithRtxStreamParams(
       "cname", MAKE_VECTOR(kReceiverSsrcs), MAKE_VECTOR(kReceiverRtxSsrcs));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(receiver_sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(receiver_sp));
 
   cricket::VideoMediaInfo info;
   ASSERT_TRUE(channel_->GetStats(&info));
@@ -6577,9 +6611,9 @@
   const char kSyncLabel[] = "sync_label";
   cricket::StreamParams unsignaled_stream;
   unsignaled_stream.set_stream_ids({kSyncLabel});
-  ASSERT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(unsignaled_stream));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  ASSERT_TRUE(receive_channel_->AddRecvStream(unsignaled_stream));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
   // The stream shouldn't have been created at this point because it doesn't
   // have any SSRCs.
@@ -6597,8 +6631,8 @@
 
   // Reset the unsignaled stream to clear the cache. This deletes the receive
   // stream.
-  channel_->AsReceiveChannel()->ResetUnsignaledRecvStream();
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
+  receive_channel_->ResetUnsignaledRecvStream();
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
   EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
 
   // Until the demuxer criteria has been updated, we ignore in-flight ssrcs of
@@ -6609,7 +6643,7 @@
   // After the demuxer criteria has been updated, we should proceed to create
   // unsignalled receive streams. This time when a default video receive stream
   // is created it won't have a sync_group.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
   EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
   EXPECT_TRUE(
@@ -6633,9 +6667,9 @@
             kIncomingUnsignalledSsrc);
 
   // Stream with another SSRC gets signaled.
-  channel_->AsReceiveChannel()->ResetUnsignaledRecvStream();
+  receive_channel_->ResetUnsignaledRecvStream();
   constexpr uint32_t kIncomingSignalledSsrc = kIncomingUnsignalledSsrc + 1;
-  ASSERT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+  ASSERT_TRUE(receive_channel_->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kIncomingSignalledSsrc)));
 
   // New receiver is for the signaled stream.
@@ -6650,10 +6684,10 @@
   const uint32_t kSsrc2 = 2;
 
   // Starting point: receiving kSsrc1.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      StreamParams::CreateLegacy(kSsrc1)));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc1)));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
   EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u);
 
@@ -6664,7 +6698,7 @@
 
   // Emulate a second m= section being created by updating the demuxer criteria
   // without adding any streams.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
 
   // Emulate there being in-flight packets for kSsrc1 and kSsrc2 arriving before
   // the demuxer is updated.
@@ -6690,7 +6724,7 @@
   // Signal that the demuxer update is complete. Because there are no more
   // pending demuxer updates, receiving unknown ssrcs (kSsrc2) should again
   // result in unsignalled receive streams being created.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
 
   // Receive packets for kSsrc1 and kSsrc2 again.
@@ -6720,12 +6754,12 @@
   const uint32_t kSsrc2 = 2;
 
   // Starting point: receiving kSsrc1 and kSsrc2.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      StreamParams::CreateLegacy(kSsrc1)));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      StreamParams::CreateLegacy(kSsrc2)));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc1)));
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc2)));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
   EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u);
   EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 0u);
@@ -6733,8 +6767,8 @@
 
   // Remove kSsrc1, signal that a demuxer criteria update is pending, but not
   // completed yet.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc1));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc1));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
 
   // We only have a receiver for kSsrc2 now.
   EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u);
@@ -6762,7 +6796,7 @@
 
   // Signal that the demuxer update is complete. This means we should stop
   // ignorning kSsrc1.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
 
   // Receive packets for kSsrc1 and kSsrc2 again.
@@ -6790,22 +6824,22 @@
   const uint32_t kSsrc = 1;
 
   // Starting point: receiving kSsrc.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      StreamParams::CreateLegacy(kSsrc)));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
   ASSERT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u);
 
   // Remove kSsrc...
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
   EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u);
   // And then add it back again, before the demuxer knows about the new
   // criteria!
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
-      StreamParams::CreateLegacy(kSsrc)));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
+  EXPECT_TRUE(
+      receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
   EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u);
 
   // In-flight packets should arrive because the stream was recreated, even
@@ -6818,7 +6852,7 @@
   EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 1u);
 
   // Signal that the demuxer knows about the first update: the removal.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
 
   // This still should not prevent in-flight packets from arriving because we
@@ -6831,8 +6865,8 @@
   EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u);
 
   // Remove the kSsrc again while previous demuxer updates are still pending.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc));
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdatePending();
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc));
+  receive_channel_->OnDemuxerCriteriaUpdatePending();
   EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u);
 
   // Now the packet should be dropped and not create an unsignalled receive
@@ -6846,7 +6880,7 @@
   EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u);
 
   // Signal that the demuxer knows about the second update: adding it back.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
 
   // The packets should continue to be dropped because removal happened after
@@ -6860,7 +6894,7 @@
   EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u);
 
   // Signal that the demuxer knows about the last update: the second removal.
-  channel_->AsReceiveChannel()->OnDemuxerCriteriaUpdateComplete();
+  receive_channel_->OnDemuxerCriteriaUpdateComplete();
   rtc::Thread::Current()->ProcessMessages(0);
 
   // If packets still arrive after the demuxer knows about the latest removal we
@@ -6883,8 +6917,8 @@
     // Receive a packet for kSsrc1.
     RtpPacket packet;
     packet.SetSsrc(kSsrc1);
-    channel_->AsReceiveChannel()->OnPacketReceived(packet.Buffer(),
-                                                   /* packet_time_us */ -1);
+    receive_channel_->OnPacketReceived(packet.Buffer(),
+                                       /* packet_time_us */ -1);
   }
   rtc::Thread::Current()->ProcessMessages(0);
   time_controller_.AdvanceTime(
@@ -6899,8 +6933,8 @@
     // Receive a packet for kSsrc2.
     RtpPacket packet;
     packet.SetSsrc(kSsrc2);
-    channel_->AsReceiveChannel()->OnPacketReceived(packet.Buffer(),
-                                                   /* packet_time_us */ -1);
+    receive_channel_->OnPacketReceived(packet.Buffer(),
+                                       /* packet_time_us */ -1);
   }
   rtc::Thread::Current()->ProcessMessages(0);
 
@@ -6917,8 +6951,8 @@
     // Receive a packet for kSsrc2.
     RtpPacket packet;
     packet.SetSsrc(kSsrc2);
-    channel_->AsReceiveChannel()->OnPacketReceived(packet.Buffer(),
-                                                   /* packet_time_us */ -1);
+    receive_channel_->OnPacketReceived(packet.Buffer(),
+                                       /* packet_time_us */ -1);
   }
   rtc::Thread::Current()->ProcessMessages(0);
 
@@ -6933,23 +6967,19 @@
 // Test BaseMinimumPlayoutDelayMs on receive streams.
 TEST_F(WebRtcVideoChannelTest, BaseMinimumPlayoutDelayMs) {
   // Test that set won't work for non-existing receive streams.
-  EXPECT_FALSE(channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(
-      kSsrc + 2, 200));
+  EXPECT_FALSE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrc + 2, 200));
   // Test that get won't work for non-existing receive streams.
-  EXPECT_FALSE(
-      channel_->AsReceiveChannel()->GetBaseMinimumPlayoutDelayMs(kSsrc + 2));
+  EXPECT_FALSE(receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc + 2));
 
   EXPECT_TRUE(AddRecvStream());
   // Test that set works for the existing receive stream.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(
-      last_ssrc_, 200));
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(last_ssrc_, 200));
   auto* recv_stream = fake_call_->GetVideoReceiveStream(last_ssrc_);
   EXPECT_TRUE(recv_stream);
   EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 200);
-  EXPECT_EQ(channel_->AsReceiveChannel()
-                ->GetBaseMinimumPlayoutDelayMs(last_ssrc_)
-                .value_or(0),
-            200);
+  EXPECT_EQ(
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(last_ssrc_).value_or(0),
+      200);
 }
 
 // Test BaseMinimumPlayoutDelayMs on unsignaled receive streams.
@@ -6958,12 +6988,8 @@
   const FakeVideoReceiveStream* recv_stream;
 
   // Set default stream with SSRC 0
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(0, 200));
-  EXPECT_EQ(
-      200,
-      channel_->AsReceiveChannel()->GetBaseMinimumPlayoutDelayMs(0).value_or(
-          0));
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(0, 200));
+  EXPECT_EQ(200, receive_channel_->GetBaseMinimumPlayoutDelayMs(0).value_or(0));
 
   // Spawn an unsignaled stream by sending a packet, it should inherit
   // default delay 200.
@@ -6973,20 +6999,16 @@
 
   recv_stream = fake_call_->GetVideoReceiveStream(kIncomingUnsignalledSsrc);
   EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 200);
-  delay_ms = channel_->AsReceiveChannel()->GetBaseMinimumPlayoutDelayMs(
-      kIncomingUnsignalledSsrc);
+  delay_ms =
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(kIncomingUnsignalledSsrc);
   EXPECT_EQ(200, delay_ms.value_or(0));
 
   // Check that now if we change delay for SSRC 0 it will change delay for the
   // default receiving stream as well.
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(0, 300));
-  EXPECT_EQ(
-      300,
-      channel_->AsReceiveChannel()->GetBaseMinimumPlayoutDelayMs(0).value_or(
-          0));
-  delay_ms = channel_->AsReceiveChannel()->GetBaseMinimumPlayoutDelayMs(
-      kIncomingUnsignalledSsrc);
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(0, 300));
+  EXPECT_EQ(300, receive_channel_->GetBaseMinimumPlayoutDelayMs(0).value_or(0));
+  delay_ms =
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(kIncomingUnsignalledSsrc);
   EXPECT_EQ(300, delay_ms.value_or(0));
   recv_stream = fake_call_->GetVideoReceiveStream(kIncomingUnsignalledSsrc);
   EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 300);
@@ -7208,7 +7230,7 @@
   EXPECT_EQ(kSsrcs3[0], recv_stream0->GetConfig().rtp.remote_ssrc);
 
   // Signal the SSRC.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+  EXPECT_TRUE(receive_channel_->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrcs3[0])));
   ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
   recv_stream0 = fake_call_->GetVideoReceiveStreams()[0];
@@ -7254,13 +7276,13 @@
 
 TEST_F(WebRtcVideoChannelTest, CannotSetMaxBitrateForNonexistentStream) {
   webrtc::RtpParameters nonexistent_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(0u, nonexistent_parameters.encodings.size());
 
   nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, nonexistent_parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, nonexistent_parameters)
+          .ok());
 }
 
 TEST_F(WebRtcVideoChannelTest,
@@ -7268,12 +7290,10 @@
   FakeVideoSendStream* stream = AddSendStream();
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   EXPECT_FALSE(parameters.encodings[0].max_bitrate_bps.has_value());
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Note that this is testing the behavior of the FakeVideoSendStream, which
   // also calls to CreateEncoderStreams to get the VideoStreams, so essentially
@@ -7285,12 +7305,10 @@
 
   // Set a low max bitrate & check that VideoStream.min_bitrate_bps is limited
   // by this amount.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   int low_max_bitrate_bps = webrtc::kDefaultMinVideoBitrateBps - 1000;
   parameters.encodings[0].max_bitrate_bps = low_max_bitrate_bps;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   ASSERT_EQ(1UL, stream->GetVideoStreams().size());
   EXPECT_EQ(low_max_bitrate_bps, stream->GetVideoStreams()[0].min_bitrate_bps);
@@ -7310,12 +7328,10 @@
 
   // Set a high min bitrate and check that max_bitrate_bps is adjusted up.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   parameters.encodings[0].min_bitrate_bps = high_min_bitrate_bps;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   ASSERT_EQ(1UL, stream->GetVideoStreams().size());
   EXPECT_EQ(high_min_bitrate_bps, stream->GetVideoStreams()[0].min_bitrate_bps);
@@ -7337,12 +7353,10 @@
   // Set min bitrate above global max bitrate and check that min_bitrate_bps is
   // adjusted down.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   parameters.encodings[0].min_bitrate_bps = 99999 + 1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   ASSERT_EQ(1UL, stream->GetVideoStreams().size());
   EXPECT_EQ(send_parameters_.max_bandwidth_bps,
             stream->GetVideoStreams()[0].min_bitrate_bps);
@@ -7354,12 +7368,10 @@
   FakeVideoSendStream* stream = AddSendStream();
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   EXPECT_FALSE(parameters.encodings[0].max_framerate.has_value());
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Note that this is testing the behavior of the FakeVideoSendStream, which
   // also calls to CreateEncoderStreams to get the VideoStreams, so essentially
@@ -7371,11 +7383,9 @@
 
   // Set max framerate and check that VideoStream.max_framerate is set.
   const int kNewMaxFramerate = kDefaultVideoMaxFramerate - 1;
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   parameters.encodings[0].max_framerate = kNewMaxFramerate;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   ASSERT_EQ(1UL, stream->GetVideoStreams().size());
   EXPECT_EQ(kNewMaxFramerate, stream->GetVideoStreams()[0].max_framerate);
@@ -7385,12 +7395,10 @@
   FakeVideoSendStream* stream = AddSendStream();
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   EXPECT_FALSE(parameters.encodings[0].num_temporal_layers.has_value());
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Note that this is testing the behavior of the FakeVideoSendStream, which
   // also calls to CreateEncoderStreams to get the VideoStreams, so essentially
@@ -7400,11 +7408,9 @@
   EXPECT_FALSE(stream->GetVideoStreams()[0].num_temporal_layers.has_value());
 
   // Set temporal layers and check that VideoStream.num_temporal_layers is set.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   parameters.encodings[0].num_temporal_layers = 2;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   ASSERT_EQ(1UL, stream->GetVideoStreams().size());
   EXPECT_EQ(2UL, stream->GetVideoStreams()[0].num_temporal_layers);
@@ -7414,17 +7420,15 @@
        CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
   AddSendStream();
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   // Two or more encodings should result in failure.
   parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   // Zero encodings should also fail.
   parameters.encodings.clear();
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 }
 
 TEST_F(WebRtcVideoChannelTest,
@@ -7434,29 +7438,26 @@
   AddSendStream(sp);
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
 
   // Additional encodings should result in failure.
   parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   // Zero encodings should also fail.
   parameters.encodings.clear();
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 }
 
 // Changing the SSRC through RtpParameters is not allowed.
 TEST_F(WebRtcVideoChannelTest, CannotSetSsrcInRtpSendParameters) {
   AddSendStream();
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   parameters.encodings[0].ssrc = 0xdeadbeef;
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 }
 
 // Tests that when RTCRtpEncodingParameters.bitrate_priority gets set to
@@ -7464,19 +7465,17 @@
 TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersInvalidBitratePriority) {
   AddSendStream();
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   EXPECT_EQ(webrtc::kDefaultBitratePriority,
             parameters.encodings[0].bitrate_priority);
 
   parameters.encodings[0].bitrate_priority = 0;
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   parameters.encodings[0].bitrate_priority = -2;
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(last_ssrc_, parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 }
 
 // Tests when the the RTCRtpEncodingParameters.bitrate_priority gets set
@@ -7484,7 +7483,7 @@
 TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersPriorityOneStream) {
   AddSendStream();
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   EXPECT_EQ(webrtc::kDefaultBitratePriority,
             parameters.encodings[0].bitrate_priority);
@@ -7492,13 +7491,11 @@
   // Change the value and set it on the VideoChannel.
   double new_bitrate_priority = 2.0;
   parameters.encodings[0].bitrate_priority = new_bitrate_priority;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the encoding parameters bitrate_priority is set for the
   // VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1UL, parameters.encodings.size());
   EXPECT_EQ(new_bitrate_priority, parameters.encodings[0].bitrate_priority);
 
@@ -7542,19 +7539,18 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(primary_ssrc);
+      send_channel_->GetRtpSendParameters(primary_ssrc);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_EQ(webrtc::kDefaultBitratePriority,
             parameters.encodings[0].bitrate_priority);
   // Change the value and set it on the VideoChannel.
   double new_bitrate_priority = 2.0;
   parameters.encodings[0].bitrate_priority = new_bitrate_priority;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(primary_ssrc, parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(primary_ssrc, parameters).ok());
 
   // Verify that the encoding parameters priority is set on the VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(primary_ssrc);
+  parameters = send_channel_->GetRtpSendParameters(primary_ssrc);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_EQ(new_bitrate_priority, parameters.encodings[0].bitrate_priority);
 
@@ -7600,14 +7596,13 @@
 
   // Try layers in natural order (smallest to largest).
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 4.0;
     rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
     rtp_parameters.encodings[2].scale_resolution_down_by = 1.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7624,14 +7619,13 @@
 
   // Try layers in reverse natural order (largest to smallest).
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 1.0;
     rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
     rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7648,14 +7642,13 @@
 
   // Try layers in mixed order.
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 10.0;
     rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
     rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7672,14 +7665,13 @@
 
   // Try with a missing scale setting, defaults to 1.0 if any other is set.
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 1.0;
     rtp_parameters.encodings[1].scale_resolution_down_by.reset();
     rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7717,14 +7709,13 @@
   channel_->SetSend(true);
 
   // Set `scale_resolution_down_by`'s.
-  auto rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(rtp_parameters.encodings.size(), 3u);
   rtp_parameters.encodings[0].scale_resolution_down_by = 1.0;
   rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
   rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-  const auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-      last_ssrc_, rtp_parameters);
+  const auto result =
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
   ASSERT_TRUE(result.ok());
 
   // Use a capture resolution whose width and height are not divisible by 2^3.
@@ -7765,14 +7756,13 @@
 
   // Try layers in natural order (smallest to largest).
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 4.0;
     rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
     rtp_parameters.encodings[2].scale_resolution_down_by = 1.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7789,14 +7779,13 @@
 
   // Try layers in reverse natural order (largest to smallest).
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 1.0;
     rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
     rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7813,14 +7802,13 @@
 
   // Try layers in mixed order.
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 10.0;
     rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
     rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7837,14 +7825,13 @@
 
   // Try with a missing scale setting, defaults to 1.0 if any other is set.
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     ASSERT_EQ(3u, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].scale_resolution_down_by = 1.0;
     rtp_parameters.encodings[1].scale_resolution_down_by.reset();
     rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-    auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-        last_ssrc_, rtp_parameters);
+    auto result =
+        send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
     ASSERT_TRUE(result.ok());
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -7882,14 +7869,13 @@
   channel_->SetSend(true);
 
   // Set `scale_resolution_down_by`'s.
-  auto rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(rtp_parameters.encodings.size(), 3u);
   rtp_parameters.encodings[0].scale_resolution_down_by = 1.0;
   rtp_parameters.encodings[1].scale_resolution_down_by = 2.0;
   rtp_parameters.encodings[2].scale_resolution_down_by = 4.0;
-  const auto result = channel_->AsSendChannel()->SetRtpSendParameters(
-      last_ssrc_, rtp_parameters);
+  const auto result =
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
   ASSERT_TRUE(result.ok());
 
   // Use a capture resolution whose width and height are not divisible by 2^3.
@@ -7919,7 +7905,7 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   for (const auto& encoding : parameters.encodings) {
     EXPECT_FALSE(encoding.max_framerate);
@@ -7929,12 +7915,10 @@
   parameters.encodings[0].max_framerate = 10;
   parameters.encodings[1].max_framerate = 20;
   parameters.encodings[2].max_framerate = 25;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the bitrates are set on the VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_EQ(10, parameters.encodings[0].max_framerate);
   EXPECT_EQ(20, parameters.encodings[1].max_framerate);
@@ -7948,20 +7932,16 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
 
   // Num temporal layers should be in the range [1, kMaxTemporalStreams].
   parameters.encodings[0].num_temporal_layers = 0;
   EXPECT_EQ(webrtc::RTCErrorType::INVALID_RANGE,
-            channel_->AsSendChannel()
-                ->SetRtpSendParameters(last_ssrc_, parameters)
-                .type());
+            send_channel_->SetRtpSendParameters(last_ssrc_, parameters).type());
   parameters.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
   EXPECT_EQ(webrtc::RTCErrorType::INVALID_RANGE,
-            channel_->AsSendChannel()
-                ->SetRtpSendParameters(last_ssrc_, parameters)
-                .type());
+            send_channel_->SetRtpSendParameters(last_ssrc_, parameters).type());
 }
 
 TEST_F(WebRtcVideoChannelTest, GetAndSetRtpSendParametersNumTemporalLayers) {
@@ -7970,7 +7950,7 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   for (const auto& encoding : parameters.encodings)
     EXPECT_FALSE(encoding.num_temporal_layers);
@@ -7979,12 +7959,10 @@
   parameters.encodings[0].num_temporal_layers = 3;
   parameters.encodings[1].num_temporal_layers = 3;
   parameters.encodings[2].num_temporal_layers = 3;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the number of temporal layers are set on the VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_EQ(3, parameters.encodings[0].num_temporal_layers);
   EXPECT_EQ(3, parameters.encodings[1].num_temporal_layers);
@@ -8005,14 +7983,12 @@
   // Get and set the rtp encoding parameters.
   // Change the value and set it on the VideoChannel.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   parameters.encodings[0].num_temporal_layers = 3;
   parameters.encodings[1].num_temporal_layers = 2;
   parameters.encodings[2].num_temporal_layers = 1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the new value is propagated down to the encoder.
   // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly.
@@ -8032,9 +8008,7 @@
   EXPECT_EQ(1UL, stream->GetVideoStreams()[2].num_temporal_layers);
 
   // No parameter changed, encoder should not be reconfigured.
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_EQ(2, stream->num_encoder_reconfigurations());
 
   EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, nullptr, nullptr));
@@ -8055,13 +8029,11 @@
 
   // Change rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   parameters.encodings[0].num_temporal_layers = 2;
   parameters.encodings[2].num_temporal_layers = 1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that no value is propagated down to the encoder.
   webrtc::VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy();
@@ -8098,13 +8070,11 @@
   // Get and set the rtp encoding parameters.
   // Change the value and set it on the VideoChannel.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   parameters.encodings[0].max_framerate = 15;
   parameters.encodings[2].max_framerate = 20;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the new value propagated down to the encoder.
   // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly.
@@ -8133,7 +8103,7 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   for (const auto& encoding : parameters.encodings) {
     EXPECT_FALSE(encoding.min_bitrate_bps);
@@ -8147,12 +8117,10 @@
   parameters.encodings[1].max_bitrate_bps = 400000;
   parameters.encodings[2].min_bitrate_bps = 500000;
   parameters.encodings[2].max_bitrate_bps = 600000;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the bitrates are set on the VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+  parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_EQ(100000, parameters.encodings[0].min_bitrate_bps);
   EXPECT_EQ(200000, parameters.encodings[0].max_bitrate_bps);
@@ -8168,16 +8136,14 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
 
   // Max bitrate lower than min bitrate should fail.
   parameters.encodings[2].min_bitrate_bps = 100000;
   parameters.encodings[2].max_bitrate_bps = 100000 - 1;
   EXPECT_EQ(webrtc::RTCErrorType::INVALID_RANGE,
-            channel_->AsSendChannel()
-                ->SetRtpSendParameters(last_ssrc_, parameters)
-                .type());
+            send_channel_->SetRtpSendParameters(last_ssrc_, parameters).type());
 }
 
 // Test that min and max bitrate values set via RtpParameters are correctly
@@ -8198,7 +8164,7 @@
   // Get and set the rtp encoding parameters.
   // Change the value and set it on the VideoChannel.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   parameters.encodings[0].min_bitrate_bps = 100000;
   parameters.encodings[0].max_bitrate_bps = 200000;
@@ -8206,9 +8172,7 @@
   parameters.encodings[1].max_bitrate_bps = 400000;
   parameters.encodings[2].min_bitrate_bps = 500000;
   parameters.encodings[2].max_bitrate_bps = 600000;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the new value propagated down to the encoder.
   // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly.
@@ -8240,9 +8204,7 @@
   EXPECT_EQ(600000, stream->GetVideoStreams()[2].max_bitrate_bps);
 
   // No parameter changed, encoder should not be reconfigured.
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_EQ(2, stream->num_encoder_reconfigurations());
 
   EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, nullptr, nullptr));
@@ -8265,7 +8227,7 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
 
   // Change the value and set it on the VideoChannel.
@@ -8275,9 +8237,7 @@
   // Layer 1: only configure max bitrate.
   const int kMaxBpsLayer1 = kDefault[1].max_bitrate_bps - 1;
   parameters.encodings[1].max_bitrate_bps = kMaxBpsLayer1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the new value propagated down to the encoder.
   // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly.
@@ -8337,7 +8297,7 @@
 
   // Get and set the rtp encoding parameters.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
 
   // Change the value and set it on the VideoChannel.
@@ -8347,9 +8307,7 @@
   // For layer 1, set the max bitrate below the default min.
   const int kMaxBpsLayer1 = kDefault[1].min_bitrate_bps - 1;
   parameters.encodings[1].max_bitrate_bps = kMaxBpsLayer1;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Verify that the new value propagated down to the encoder.
   // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of
@@ -8388,13 +8346,11 @@
 
   // Set max bitrate for all but the highest layer.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   parameters.encodings[0].max_bitrate_bps = kDefault[0].max_bitrate_bps;
   parameters.encodings[1].max_bitrate_bps = kDefault[1].max_bitrate_bps;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Set max bandwidth equal to total max bitrate.
   send_parameters_.max_bandwidth_bps =
@@ -8440,12 +8396,10 @@
 
   // Set max bitrate for the highest layer.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   parameters.encodings[2].max_bitrate_bps = kDefault[2].max_bitrate_bps;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Set max bandwidth above the total max bitrate.
   send_parameters_.max_bandwidth_bps =
@@ -8471,13 +8425,11 @@
 
   // Set min and max bitrate.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(1u, parameters.encodings.size());
   parameters.encodings[0].min_bitrate_bps = 80000;
   parameters.encodings[0].max_bitrate_bps = 150000;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
 
   // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly.
   webrtc::VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy();
@@ -8529,20 +8481,16 @@
 
   // Get current parameters and change "active" to false.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(1u, parameters.encodings.size());
   ASSERT_TRUE(parameters.encodings[0].active);
   parameters.encodings[0].active = false;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_FALSE(stream->IsSending());
 
   // Now change it back to active and verify we resume sending.
   parameters.encodings[0].active = true;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_TRUE(stream->IsSending());
 }
 
@@ -8570,7 +8518,7 @@
 
   // Check that all encodings are initially active.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(primary_ssrc);
+      send_channel_->GetRtpSendParameters(primary_ssrc);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_TRUE(parameters.encodings[0].active);
   EXPECT_TRUE(parameters.encodings[1].active);
@@ -8581,11 +8529,10 @@
   parameters.encodings[0].active = false;
   parameters.encodings[1].active = true;
   parameters.encodings[2].active = false;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(primary_ssrc, parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(primary_ssrc, parameters).ok());
   // Verify that the active fields are set on the VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(primary_ssrc);
+  parameters = send_channel_->GetRtpSendParameters(primary_ssrc);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_FALSE(parameters.encodings[0].active);
   EXPECT_TRUE(parameters.encodings[1].active);
@@ -8604,11 +8551,10 @@
   parameters.encodings[0].active = false;
   parameters.encodings[1].active = false;
   parameters.encodings[2].active = false;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(primary_ssrc, parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(primary_ssrc, parameters).ok());
   // Verify that the active fields are set on the VideoChannel.
-  parameters = channel_->AsSendChannel()->GetRtpSendParameters(primary_ssrc);
+  parameters = send_channel_->GetRtpSendParameters(primary_ssrc);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_FALSE(parameters.encodings[0].active);
   EXPECT_FALSE(parameters.encodings[1].active);
@@ -8648,7 +8594,7 @@
 
   // Check that all encodings are initially active.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(primary_ssrc);
+      send_channel_->GetRtpSendParameters(primary_ssrc);
   EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
   EXPECT_TRUE(parameters.encodings[0].active);
   EXPECT_TRUE(parameters.encodings[1].active);
@@ -8659,9 +8605,8 @@
   parameters.encodings[0].active = false;
   parameters.encodings[1].active = false;
   parameters.encodings[2].active = true;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(primary_ssrc, parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(primary_ssrc, parameters).ok());
 
   // Check that the VideoSendStream is updated appropriately. This means its
   // send state was updated and it was reconfigured.
@@ -8695,15 +8640,13 @@
 
   // Get current parameters and change "active" to false.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(1u, parameters.encodings.size());
   ASSERT_TRUE(parameters.encodings[0].active);
   parameters.encodings[0].active = false;
   EXPECT_EQ(1u, GetFakeSendStreams().size());
   EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
   EXPECT_FALSE(stream->IsSending());
 
   // Reorder the codec list, causing the stream to be reconfigured.
@@ -8731,7 +8674,7 @@
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(2u, rtp_parameters.codecs.size());
   EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(),
             rtp_parameters.codecs[0]);
@@ -8746,7 +8689,7 @@
   AddSendStream(params);
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrc);
+      send_channel_->GetRtpSendParameters(kSsrc);
   EXPECT_STREQ("rtcpcname", rtp_parameters.rtcp.cname.c_str());
 }
 
@@ -8756,7 +8699,7 @@
   AddSendStream();
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(1u, rtp_parameters.encodings.size());
   EXPECT_EQ(last_ssrc_, rtp_parameters.encodings[0].ssrc);
 }
@@ -8765,13 +8708,13 @@
   AddSendStream();
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   rtp_parameters.header_extensions.emplace_back();
 
   EXPECT_NE(0u, rtp_parameters.header_extensions.size());
 
-  webrtc::RTCError result = channel_->AsSendChannel()->SetRtpSendParameters(
-      last_ssrc_, rtp_parameters);
+  webrtc::RTCError result =
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
   EXPECT_EQ(webrtc::RTCErrorType::INVALID_MODIFICATION, result.type());
 }
 
@@ -8782,17 +8725,16 @@
   EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder));
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_FALSE(rtp_parameters.degradation_preference.has_value());
   rtp_parameters.degradation_preference =
       webrtc::DegradationPreference::MAINTAIN_FRAMERATE;
 
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, rtp_parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok());
 
   webrtc::RtpParameters updated_rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   EXPECT_EQ(updated_rtp_parameters.degradation_preference,
             webrtc::DegradationPreference::MAINTAIN_FRAMERATE);
 
@@ -8809,16 +8751,14 @@
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
 
   webrtc::RtpParameters initial_params =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
 
   // We should be able to set the params we just got.
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, initial_params)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, initial_params).ok());
 
   // ... And this shouldn't change the params returned by GetRtpSendParameters.
-  EXPECT_EQ(initial_params,
-            channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_));
+  EXPECT_EQ(initial_params, send_channel_->GetRtpSendParameters(last_ssrc_));
 }
 
 // Test that GetRtpReceiveParameters returns the currently configured codecs.
@@ -8957,7 +8897,7 @@
 
   cricket::StreamParams params = cricket::StreamParams::CreateLegacy(1);
   params.AddFidSsrc(1, 2);
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(params));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(params));
 }
 
 void WebRtcVideoChannelTest::TestReceiverLocalSsrcConfiguration(
@@ -8989,13 +8929,13 @@
   // Removing first sender should fall back to another (in this case the second)
   // local send stream's SSRC.
   AddSendStream(StreamParams::CreateLegacy(kSecondSenderSsrc));
-  ASSERT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSenderSsrc));
+  ASSERT_TRUE(send_channel_->RemoveSendStream(kSenderSsrc));
   receive_streams = fake_call_->GetVideoReceiveStreams();
   ASSERT_EQ(1u, receive_streams.size());
   EXPECT_EQ(kSecondSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc);
 
   // Removing the last sender should fall back to default local SSRC.
-  ASSERT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSecondSenderSsrc));
+  ASSERT_TRUE(send_channel_->RemoveSendStream(kSecondSenderSsrc));
   receive_streams = fake_call_->GetVideoReceiveStreams();
   ASSERT_EQ(1u, receive_streams.size());
   EXPECT_EQ(kExpectedDefaultReceiverSsrc,
@@ -9041,16 +8981,15 @@
   FakeVideoSendStream* stream = SetUpSimulcast(true, false);
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+      send_channel_->GetRtpSendParameters(last_ssrc_);
   ASSERT_EQ(3u, rtp_parameters.encodings.size());
   ASSERT_TRUE(rtp_parameters.encodings[0].active);
   ASSERT_TRUE(rtp_parameters.encodings[1].active);
   ASSERT_TRUE(rtp_parameters.encodings[2].active);
   rtp_parameters.encodings[0].active = false;
   rtp_parameters.encodings[1].active = false;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(last_ssrc_, rtp_parameters)
-                  .ok());
+  EXPECT_TRUE(
+      send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok());
   EXPECT_TRUE(stream->GetEncoderConfig().is_quality_scaling_allowed);
 }
 
@@ -9075,7 +9014,10 @@
     channel_.reset(engine_.CreateMediaChannel(
         &fake_call_, GetMediaConfig(), VideoOptions(), webrtc::CryptoOptions(),
         mock_rate_allocator_factory_.get()));
-    channel_->AsSendChannel()->OnReadyToSend(true);
+    send_channel_ = std::make_unique<VideoMediaSendChannel>(channel_.get());
+    receive_channel_ =
+        std::make_unique<VideoMediaReceiveChannel>(channel_.get());
+    send_channel_->OnReadyToSend(true);
     last_ssrc_ = 123;
   }
 
@@ -9114,8 +9056,7 @@
     channel_->SetSend(true);
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(kSsrcs3[0]);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(kSsrcs3[0]);
     EXPECT_EQ(num_configured_streams, rtp_parameters.encodings.size());
 
     std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
@@ -9191,7 +9132,7 @@
 
   FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
     size_t num_streams = fake_call_.GetVideoSendStreams().size();
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
+    EXPECT_TRUE(send_channel_->AddSendStream(sp));
     std::vector<FakeVideoSendStream*> streams =
         fake_call_.GetVideoSendStreams();
     EXPECT_EQ(num_streams + 1, streams.size());
@@ -9208,7 +9149,7 @@
 
   FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
     size_t num_streams = fake_call_.GetVideoReceiveStreams().size();
-    EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+    EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
     std::vector<FakeVideoReceiveStream*> streams =
         fake_call_.GetVideoReceiveStreams();
     EXPECT_EQ(num_streams + 1, streams.size());
@@ -9224,6 +9165,8 @@
       mock_rate_allocator_factory_;
   WebRtcVideoEngine engine_;
   std::unique_ptr<VideoMediaChannel> channel_;
+  std::unique_ptr<VideoMediaSendChannel> send_channel_;
+  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
   uint32_t last_ssrc_;
 };
 
@@ -9308,7 +9251,7 @@
   }
   sp.set_rids(rid_descriptions);
 
-  ASSERT_TRUE(channel_->AsSendChannel()->AddSendStream(sp));
+  ASSERT_TRUE(send_channel_->AddSendStream(sp));
   const auto& streams = fake_call_->GetVideoSendStreams();
   ASSERT_EQ(1u, streams.size());
   auto stream = streams[0];
@@ -9358,11 +9301,11 @@
 
   {  // TEST requested_resolution < frame size
     webrtc::RtpParameters rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+        send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 640,
                                                         .height = 360};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
@@ -9373,12 +9316,11 @@
   }
 
   {  // TEST requested_resolution == frame size
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 1280,
                                                         .height = 720};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
     auto streams = stream->GetVideoStreams();
@@ -9388,12 +9330,11 @@
   }
 
   {  // TEST requested_resolution > frame size
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 2 * 1280,
                                                         .height = 2 * 720};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
     auto streams = stream->GetVideoStreams();
@@ -9417,12 +9358,11 @@
   EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder));
 
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 720,
                                                         .height = 720};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
@@ -9433,12 +9373,11 @@
   }
 
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 1280,
                                                         .height = 1280};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
@@ -9449,12 +9388,11 @@
   }
 
   {
-    auto rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+    auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(1UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 650,
                                                         .height = 650};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     auto streams = stream->GetVideoStreams();
     ASSERT_EQ(streams.size(), 1u);
@@ -9478,7 +9416,7 @@
 
   {
     webrtc::RtpParameters rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+        send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(3UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 320,
                                                         .height = 180};
@@ -9486,7 +9424,7 @@
                                                         .height = 360};
     rtp_parameters.encodings[2].requested_resolution = {.width = 1280,
                                                         .height = 720};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
@@ -9500,7 +9438,7 @@
 
   {
     webrtc::RtpParameters rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+        send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(3UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 320,
                                                         .height = 180};
@@ -9508,7 +9446,7 @@
 
     rtp_parameters.encodings[2].requested_resolution = {.width = 1280,
                                                         .height = 720};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
@@ -9521,7 +9459,7 @@
 
   {
     webrtc::RtpParameters rtp_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(last_ssrc_);
+        send_channel_->GetRtpSendParameters(last_ssrc_);
     EXPECT_EQ(3UL, rtp_parameters.encodings.size());
     rtp_parameters.encodings[0].requested_resolution = {.width = 320,
                                                         .height = 180};
@@ -9530,7 +9468,7 @@
                                                         .height = 360};
     rtp_parameters.encodings[2].requested_resolution = {.width = 960,
                                                         .height = 540};
-    channel_->AsSendChannel()->SetRtpSendParameters(last_ssrc_, rtp_parameters);
+    send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters);
 
     frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
 
diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h
index daa964a..9ff6570 100644
--- a/media/engine/webrtc_voice_engine.h
+++ b/media/engine/webrtc_voice_engine.h
@@ -25,6 +25,7 @@
 #include "api/transport/rtp/rtp_source.h"
 #include "call/audio_state.h"
 #include "call/call.h"
+#include "media/base/media_channel_impl.h"
 #include "media/base/media_engine.h"
 #include "media/base/rtp_utils.h"
 #include "modules/async_audio_processing/async_audio_processing.h"
diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc
index 2c638be..b4fcbc6 100644
--- a/media/engine/webrtc_voice_engine_unittest.cc
+++ b/media/engine/webrtc_voice_engine_unittest.cc
@@ -229,6 +229,9 @@
     channel_ = engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
                                            cricket::AudioOptions(),
                                            webrtc::CryptoOptions());
+    send_channel_ = std::make_unique<cricket::VoiceMediaSendChannel>(channel_);
+    receive_channel_ =
+        std::make_unique<cricket::VoiceMediaReceiveChannel>(channel_);
     return (channel_ != nullptr);
   }
 
@@ -247,7 +250,7 @@
     if (!SetupChannel()) {
       return false;
     }
-    if (!channel_->AsSendChannel()->AddSendStream(sp)) {
+    if (!send_channel_->AddSendStream(sp)) {
       return false;
     }
     if (!use_null_apm_) {
@@ -258,7 +261,7 @@
 
   bool AddRecvStream(uint32_t ssrc) {
     EXPECT_TRUE(channel_);
-    return channel_->AsReceiveChannel()->AddRecvStream(
+    return receive_channel_->AddRecvStream(
         cricket::StreamParams::CreateLegacy(ssrc));
   }
 
@@ -266,15 +269,15 @@
     EXPECT_TRUE(SetupSendStream());
     // Remove stream added in Setup.
     EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
-    EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(kSsrcX));
+    EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrcX));
     // Verify the channel does not exist.
     EXPECT_FALSE(call_.GetAudioSendStream(kSsrcX));
   }
 
   void DeliverPacket(const void* data, int len) {
     rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
-    channel_->AsReceiveChannel()->OnPacketReceived(packet,
-                                                   /* packet_time_us */ -1);
+    receive_channel_->OnPacketReceived(packet,
+                                       /* packet_time_us */ -1);
     rtc::Thread::Current()->ProcessMessages(0);
   }
 
@@ -340,7 +343,7 @@
     if (caller) {
       // If this is a caller, local description will be applied and add the
       // send stream.
-      EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+      EXPECT_TRUE(send_channel_->AddSendStream(
           cricket::StreamParams::CreateLegacy(kSsrcX)));
     }
 
@@ -356,7 +359,7 @@
     if (!caller) {
       // If this is callee, there's no active send channel yet.
       EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
-      EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+      EXPECT_TRUE(send_channel_->AddSendStream(
           cricket::StreamParams::CreateLegacy(kSsrcX)));
     }
 
@@ -379,7 +382,7 @@
     // For a caller, the answer will be applied in set remote description
     // where SetSendParameters() is called.
     EXPECT_TRUE(SetupChannel());
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrcX)));
     send_parameters_.extmap_allow_mixed = extmap_allow_mixed;
     SetSendParameters(send_parameters_);
@@ -392,7 +395,7 @@
     // where SetExtmapAllowMixed() and AddSendStream() are called.
     EXPECT_TRUE(SetupChannel());
     channel_->SetExtmapAllowMixed(extmap_allow_mixed);
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrcX)));
 
     const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
@@ -422,13 +425,11 @@
   // Sets the per-stream maximum bitrate limit for the specified SSRC.
   bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
     webrtc::RtpParameters parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(ssrc);
+        send_channel_->GetRtpSendParameters(ssrc);
     EXPECT_EQ(1UL, parameters.encodings.size());
 
     parameters.encodings[0].max_bitrate_bps = bitrate;
-    return channel_->AsSendChannel()
-        ->SetRtpSendParameters(ssrc, parameters)
-        .ok();
+    return send_channel_->SetRtpSendParameters(ssrc, parameters).ok();
   }
 
   void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
@@ -474,7 +475,7 @@
     // Verify that reading back the parameters gives results
     // consistent with the Set() result.
     webrtc::RtpParameters resulting_parameters =
-        channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+        send_channel_->GetRtpSendParameters(kSsrcX);
     EXPECT_EQ(1UL, resulting_parameters.encodings.size());
     EXPECT_EQ(expected_result ? stream_max : -1,
               resulting_parameters.encodings[0].max_bitrate_bps);
@@ -535,7 +536,7 @@
     EXPECT_EQ(id, GetSendStreamConfig(kSsrcX).rtp.extensions[0].id);
 
     // Ensure extension is set properly on new stream.
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(kSsrcY)));
     EXPECT_NE(call_.GetAudioSendStream(kSsrcX),
               call_.GetAudioSendStream(kSsrcY));
@@ -803,6 +804,8 @@
   cricket::FakeCall call_;
   std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
   cricket::VoiceMediaChannel* channel_ = nullptr;
+  std::unique_ptr<cricket::VoiceMediaSendChannel> send_channel_;
+  std::unique_ptr<cricket::VoiceMediaReceiveChannel> receive_channel_;
   cricket::AudioSendParameters send_parameters_;
   cricket::AudioRecvParameters recv_parameters_;
   FakeAudioSource fake_source_;
@@ -821,7 +824,7 @@
 // Test that we can add a send stream and that it has the correct defaults.
 TEST_P(WebRtcVoiceEngineTestFake, CreateSendStream) {
   EXPECT_TRUE(SetupChannel());
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcX)));
   const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
   EXPECT_EQ(kSsrcX, config.rtp.ssrc);
@@ -1079,7 +1082,7 @@
   parameters.max_bandwidth_bps = kDesiredBitrate;
   SetSendParameters(parameters);
 
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcX)));
 
   EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrcX));
@@ -1131,13 +1134,12 @@
 TEST_P(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
   EXPECT_TRUE(SetupChannel());
   webrtc::RtpParameters nonexistent_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   EXPECT_EQ(0u, nonexistent_parameters.encodings.size());
 
   nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(kSsrcX, nonexistent_parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(kSsrcX, nonexistent_parameters).ok());
 }
 
 TEST_P(WebRtcVoiceEngineTestFake,
@@ -1149,25 +1151,22 @@
 
   EXPECT_TRUE(SetupSendStream());
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   // Two or more encodings should result in failure.
   parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_FALSE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
   // Zero encodings should also fail.
   parameters.encodings.clear();
-  EXPECT_FALSE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_FALSE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
 }
 
 // Changing the SSRC through RtpParameters is not allowed.
 TEST_P(WebRtcVoiceEngineTestFake, CannotSetSsrcInRtpSendParameters) {
   EXPECT_TRUE(SetupSendStream());
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   parameters.encodings[0].ssrc = 0xdeadbeef;
-  EXPECT_FALSE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_FALSE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
 }
 
 // Test that a stream will not be sending if its encoding is made
@@ -1178,20 +1177,18 @@
   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
   // Get current parameters and change "active" to false.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   ASSERT_EQ(1u, parameters.encodings.size());
   ASSERT_TRUE(parameters.encodings[0].active);
   parameters.encodings[0].active = false;
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
   EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
 
   // Now change it back to active and verify we resume sending.
   // This should occur even when other parameters are updated.
   parameters.encodings[0].active = true;
   parameters.encodings[0].max_bitrate_bps = absl::optional<int>(6000);
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
   EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
 }
 
@@ -1199,18 +1196,16 @@
   EXPECT_TRUE(SetupSendStream());
   // Get current parameters and change "adaptive_ptime" to true.
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   ASSERT_EQ(1u, parameters.encodings.size());
   ASSERT_FALSE(parameters.encodings[0].adaptive_ptime);
   parameters.encodings[0].adaptive_ptime = true;
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
   EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
   EXPECT_EQ(16000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
 
   parameters.encodings[0].adaptive_ptime = false;
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
   EXPECT_FALSE(GetAudioNetworkAdaptorConfig(kSsrcX));
   EXPECT_EQ(32000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
 }
@@ -1225,10 +1220,9 @@
             GetAudioNetworkAdaptorConfig(kSsrcX));
 
   webrtc::RtpParameters parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   parameters.encodings[0].adaptive_ptime = false;
-  EXPECT_TRUE(
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, parameters).ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
   EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
             GetAudioNetworkAdaptorConfig(kSsrcX));
 }
@@ -1246,7 +1240,7 @@
   SetupForMultiSendStream();
   // Create send streams.
   for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(ssrc)));
   }
   // Configure one stream to be limited by the stream config, another to be
@@ -1278,7 +1272,7 @@
   SetSendParameters(parameters);
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   ASSERT_EQ(2u, rtp_parameters.codecs.size());
   EXPECT_EQ(kOpusCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
   EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
@@ -1291,7 +1285,7 @@
   EXPECT_TRUE(SetupSendStream(params));
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   EXPECT_STREQ("rtcpcname", rtp_parameters.rtcp.cname.c_str());
 }
 
@@ -1300,13 +1294,13 @@
   EXPECT_TRUE(SetupSendStream());
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   rtp_parameters.header_extensions.emplace_back();
 
   EXPECT_NE(0u, rtp_parameters.header_extensions.size());
 
   webrtc::RTCError result =
-      channel_->AsSendChannel()->SetRtpSendParameters(kSsrcX, rtp_parameters);
+      send_channel_->SetRtpSendParameters(kSsrcX, rtp_parameters);
   EXPECT_EQ(webrtc::RTCErrorType::INVALID_MODIFICATION, result.type());
 }
 
@@ -1314,7 +1308,7 @@
 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
   EXPECT_TRUE(SetupSendStream());
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   ASSERT_EQ(1u, rtp_parameters.encodings.size());
   EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
 }
@@ -1328,18 +1322,15 @@
   SetSendParameters(parameters);
 
   webrtc::RtpParameters initial_params =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
 
   // We should be able to set the params we just got.
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(kSsrcX, initial_params)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, initial_params).ok());
 
   // ... And this shouldn't change the params returned by GetRtpSendParameters.
   webrtc::RtpParameters new_params =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
-  EXPECT_EQ(initial_params,
-            channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX));
+      send_channel_->GetRtpSendParameters(kSsrcX);
+  EXPECT_EQ(initial_params, send_channel_->GetRtpSendParameters(kSsrcX));
 }
 
 // Test that max_bitrate_bps in send stream config gets updated correctly when
@@ -1351,15 +1342,13 @@
   SetSendParameters(send_parameters);
 
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   // Expect empty on parameters.encodings[0].max_bitrate_bps;
   EXPECT_FALSE(rtp_parameters.encodings[0].max_bitrate_bps);
 
   constexpr int kMaxBitrateBps = 6000;
   rtp_parameters.encodings[0].max_bitrate_bps = kMaxBitrateBps;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(kSsrcX, rtp_parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
 
   const int max_bitrate = GetSendStreamConfig(kSsrcX).max_bitrate_bps;
   EXPECT_EQ(max_bitrate, kMaxBitrateBps);
@@ -1370,19 +1359,17 @@
 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterInvalidBitratePriority) {
   EXPECT_TRUE(SetupSendStream());
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
   EXPECT_EQ(1UL, rtp_parameters.encodings.size());
   EXPECT_EQ(webrtc::kDefaultBitratePriority,
             rtp_parameters.encodings[0].bitrate_priority);
 
   rtp_parameters.encodings[0].bitrate_priority = 0;
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(kSsrcX, rtp_parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
   rtp_parameters.encodings[0].bitrate_priority = -1.0;
-  EXPECT_FALSE(channel_->AsSendChannel()
-                   ->SetRtpSendParameters(kSsrcX, rtp_parameters)
-                   .ok());
+  EXPECT_FALSE(
+      send_channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
 }
 
 // Test that the bitrate_priority in the send stream config gets updated when
@@ -1390,21 +1377,18 @@
 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterUpdatesBitratePriority) {
   EXPECT_TRUE(SetupSendStream());
   webrtc::RtpParameters rtp_parameters =
-      channel_->AsSendChannel()->GetRtpSendParameters(kSsrcX);
+      send_channel_->GetRtpSendParameters(kSsrcX);
 
   EXPECT_EQ(1UL, rtp_parameters.encodings.size());
   EXPECT_EQ(webrtc::kDefaultBitratePriority,
             rtp_parameters.encodings[0].bitrate_priority);
   double new_bitrate_priority = 2.0;
   rtp_parameters.encodings[0].bitrate_priority = new_bitrate_priority;
-  EXPECT_TRUE(channel_->AsSendChannel()
-                  ->SetRtpSendParameters(kSsrcX, rtp_parameters)
-                  .ok());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
 
   // The priority should get set for both the audio channel's rtp parameters
   // and the audio send stream's audio config.
-  EXPECT_EQ(new_bitrate_priority, channel_->AsSendChannel()
-                                      ->GetRtpSendParameters(kSsrcX)
+  EXPECT_EQ(new_bitrate_priority, send_channel_->GetRtpSendParameters(kSsrcX)
                                       .encodings[0]
                                       .bitrate_priority);
   EXPECT_EQ(new_bitrate_priority, GetSendStreamConfig(kSsrcX).bitrate_priority);
@@ -1832,7 +1816,7 @@
   // NACK should be enabled even with no send stream.
   EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
 
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcX)));
 }
 
@@ -2078,7 +2062,7 @@
   parameters.codecs[2].id = 97;  // narrowband CN
   parameters.codecs[3].id = 98;  // DTMF
   SetSendParameters(parameters);
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcX)));
 
   const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
@@ -2252,7 +2236,7 @@
   SetSend(true);
 
   for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(ssrc)));
     SetAudioSend(ssrc, true, &fake_source_);
     // Verify that we are in a sending state for all the created streams.
@@ -2262,9 +2246,9 @@
 
   // Delete the send streams.
   for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AsSendChannel()->RemoveSendStream(ssrc));
+    EXPECT_TRUE(send_channel_->RemoveSendStream(ssrc));
     EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
-    EXPECT_FALSE(channel_->AsSendChannel()->RemoveSendStream(ssrc));
+    EXPECT_FALSE(send_channel_->RemoveSendStream(ssrc));
   }
   EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
 }
@@ -2275,7 +2259,7 @@
 
   // Create send streams.
   for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(ssrc)));
   }
 
@@ -2315,7 +2299,7 @@
 
   // Create the send channels and they should be a "not sending" date.
   for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(ssrc)));
     SetAudioSend(ssrc, true, &fake_source_);
     EXPECT_FALSE(GetSendStream(ssrc).IsSending());
@@ -2342,7 +2326,7 @@
 
   // Create send streams.
   for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+    EXPECT_TRUE(send_channel_->AddSendStream(
         cricket::StreamParams::CreateLegacy(ssrc)));
   }
 
@@ -2377,7 +2361,7 @@
   // Remove the kSsrcY stream. No receiver stats.
   {
     cricket::VoiceMediaInfo info;
-    EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrcY));
+    EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrcY));
     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
     EXPECT_EQ(true,
               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
@@ -2438,8 +2422,8 @@
   EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
 
   // Now remove the recv streams.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrcZ));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrcY));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrcZ));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrcY));
 }
 
 TEST_P(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
@@ -2529,7 +2513,7 @@
   // Remove the kSsrcY stream. No receiver stats.
   {
     cricket::VoiceMediaInfo info;
-    EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrcY));
+    EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrcY));
     EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
     EXPECT_EQ(true,
               channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
@@ -2567,7 +2551,7 @@
 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
   EXPECT_TRUE(SetupChannel());
   EXPECT_TRUE(AddRecvStream(kSsrcY));
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcX)));
   EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
@@ -2630,9 +2614,9 @@
   EXPECT_EQ(s3.received_packets(), 1);
   EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
 
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(ssrc3));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(ssrc2));
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(ssrc1));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(ssrc3));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(ssrc2));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(ssrc1));
 }
 
 // Test that receiving on an unsignaled stream works (a stream is created).
@@ -2655,7 +2639,7 @@
   EXPECT_TRUE(SetupChannel());
   cricket::StreamParams unsignaled_stream;
   unsignaled_stream.set_stream_ids({kSyncLabel});
-  ASSERT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(unsignaled_stream));
+  ASSERT_TRUE(receive_channel_->AddRecvStream(unsignaled_stream));
   // The stream shouldn't have been created at this point because it doesn't
   // have any SSRCs.
   EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
@@ -2669,8 +2653,8 @@
 
   // Remset the unsignaled stream to clear the cached parameters. If a new
   // default unsignaled receive stream is created it will not have a sync group.
-  channel_->AsReceiveChannel()->ResetUnsignaledRecvStream();
-  channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc1);
+  receive_channel_->ResetUnsignaledRecvStream();
+  receive_channel_->RemoveRecvStream(kSsrc1);
 
   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
 
@@ -2699,7 +2683,7 @@
   ASSERT_EQ(receivers1.size(), 2u);
 
   // Should remove all default streams.
-  channel_->AsReceiveChannel()->ResetUnsignaledRecvStream();
+  receive_channel_->ResetUnsignaledRecvStream();
   const auto& receivers2 = call_.GetAudioReceiveStreams();
   EXPECT_EQ(0u, receivers2.size());
 }
@@ -2828,7 +2812,7 @@
   stream_params.ssrcs.push_back(1);
   stream_params.set_stream_ids({new_stream_id});
 
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(stream_params));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(stream_params));
   EXPECT_EQ(1u, streams.size());
   // The audio receive stream should not have been recreated.
   EXPECT_EQ(audio_receive_stream_id, streams.front()->id());
@@ -3226,7 +3210,7 @@
   EXPECT_FALSE(channel_->SetOutputVolume(kSsrcY, 0.5));
   cricket::StreamParams stream;
   stream.ssrcs.push_back(kSsrcY);
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(stream));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(stream));
   EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrcY).gain());
   EXPECT_TRUE(channel_->SetOutputVolume(kSsrcY, 3));
   EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcY).gain());
@@ -3268,18 +3252,15 @@
 
 TEST_P(WebRtcVoiceEngineTestFake, BaseMinimumPlayoutDelayMs) {
   EXPECT_TRUE(SetupChannel());
+  EXPECT_FALSE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrcY, 200));
   EXPECT_FALSE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(kSsrcY, 200));
-  EXPECT_FALSE(channel_->AsReceiveChannel()
-                   ->GetBaseMinimumPlayoutDelayMs(kSsrcY)
-                   .has_value());
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
 
   cricket::StreamParams stream;
   stream.ssrcs.push_back(kSsrcY);
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(stream));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(stream));
   EXPECT_EQ(0, GetRecvStream(kSsrcY).base_mininum_playout_delay_ms());
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(kSsrcY, 300));
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrcY, 300));
   EXPECT_EQ(300, GetRecvStream(kSsrcY).base_mininum_playout_delay_ms());
 }
 
@@ -3290,70 +3271,57 @@
 
   // Spawn an unsignaled stream by sending a packet - delay should be 0.
   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  EXPECT_EQ(0, channel_->AsReceiveChannel()
-                   ->GetBaseMinimumPlayoutDelayMs(kSsrc1)
-                   .value_or(-1));
+  EXPECT_EQ(
+      0, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
   // Check that it doesn't provide default values for unknown ssrc.
-  EXPECT_FALSE(channel_->AsReceiveChannel()
-                   ->GetBaseMinimumPlayoutDelayMs(kSsrcY)
-                   .has_value());
+  EXPECT_FALSE(
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
 
   // Check that default value for unsignaled streams is 0.
-  EXPECT_EQ(0, channel_->AsReceiveChannel()
-                   ->GetBaseMinimumPlayoutDelayMs(kSsrc0)
-                   .value_or(-1));
+  EXPECT_EQ(
+      0, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
 
   // Should remember the delay 100 which will be set on new unsignaled streams,
   // and also set the delay to 100 on existing unsignaled streams.
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(kSsrc0, 100));
-  EXPECT_EQ(100, channel_->AsReceiveChannel()
-                     ->GetBaseMinimumPlayoutDelayMs(kSsrc0)
-                     .value_or(-1));
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrc0, 100));
+  EXPECT_EQ(
+      100, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
   // Check that it doesn't provide default values for unknown ssrc.
-  EXPECT_FALSE(channel_->AsReceiveChannel()
-                   ->GetBaseMinimumPlayoutDelayMs(kSsrcY)
-                   .has_value());
+  EXPECT_FALSE(
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
 
   // Spawn an unsignaled stream by sending a packet - delay should be 100.
   unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
   memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
   rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
   DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
-  EXPECT_EQ(100, channel_->AsReceiveChannel()
-                     ->GetBaseMinimumPlayoutDelayMs(kSsrcX)
-                     .value_or(-1));
+  EXPECT_EQ(
+      100, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
 
   // Setting delay with SSRC=0 should affect all unsignaled streams.
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(kSsrc0, 300));
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrc0, 300));
   if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_EQ(300, channel_->AsReceiveChannel()
-                       ->GetBaseMinimumPlayoutDelayMs(kSsrc1)
-                       .value_or(-1));
+    EXPECT_EQ(
+        300,
+        receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
   }
-  EXPECT_EQ(300, channel_->AsReceiveChannel()
-                     ->GetBaseMinimumPlayoutDelayMs(kSsrcX)
-                     .value_or(-1));
+  EXPECT_EQ(
+      300, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
 
   // Setting delay on an individual stream affects only that.
-  EXPECT_TRUE(
-      channel_->AsReceiveChannel()->SetBaseMinimumPlayoutDelayMs(kSsrcX, 400));
+  EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrcX, 400));
   if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_EQ(300, channel_->AsReceiveChannel()
-                       ->GetBaseMinimumPlayoutDelayMs(kSsrc1)
-                       .value_or(-1));
+    EXPECT_EQ(
+        300,
+        receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
   }
-  EXPECT_EQ(400, channel_->AsReceiveChannel()
-                     ->GetBaseMinimumPlayoutDelayMs(kSsrcX)
-                     .value_or(-1));
-  EXPECT_EQ(300, channel_->AsReceiveChannel()
-                     ->GetBaseMinimumPlayoutDelayMs(kSsrc0)
-                     .value_or(-1));
+  EXPECT_EQ(
+      400, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
+  EXPECT_EQ(
+      300, receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
   // Check that it doesn't provide default values for unknown ssrc.
-  EXPECT_FALSE(channel_->AsReceiveChannel()
-                   ->GetBaseMinimumPlayoutDelayMs(kSsrcY)
-                   .has_value());
+  EXPECT_FALSE(
+      receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
 }
 
 TEST_P(WebRtcVoiceEngineTestFake, SetsSyncGroupFromStreamId) {
@@ -3365,9 +3333,9 @@
   sp.set_stream_ids({kStreamId});
   // Creating two channels to make sure that sync label is set properly for both
   // the default voice channel and following ones.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
   sp.ssrcs[0] += 1;
-  EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(sp));
+  EXPECT_TRUE(receive_channel_->AddRecvStream(sp));
 
   ASSERT_EQ(2u, call_.GetAudioReceiveStreams().size());
   EXPECT_EQ(kStreamId,
@@ -3390,7 +3358,7 @@
   EXPECT_TRUE(SetupSendStream());
   SetSendParameters(send_parameters_);
   for (uint32_t ssrc : ssrcs) {
-    EXPECT_TRUE(channel_->AsReceiveChannel()->AddRecvStream(
+    EXPECT_TRUE(receive_channel_->AddRecvStream(
         cricket::StreamParams::CreateLegacy(ssrc)));
   }
 
@@ -3452,8 +3420,8 @@
   const cricket::FakeAudioReceiveStream* s =
       call_.GetAudioReceiveStream(kAudioSsrc);
   EXPECT_EQ(0, s->received_packets());
-  channel_->AsReceiveChannel()->OnPacketReceived(kPcmuPacket,
-                                                 /* packet_time_us */ -1);
+  receive_channel_->OnPacketReceived(kPcmuPacket,
+                                     /* packet_time_us */ -1);
   rtc::Thread::Current()->ProcessMessages(0);
 
   EXPECT_EQ(1, s->received_packets());
@@ -3465,7 +3433,7 @@
   EXPECT_TRUE(SetupSendStream());
   EXPECT_TRUE(AddRecvStream(kSsrcY));
   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcZ)));
   EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
   EXPECT_TRUE(AddRecvStream(kSsrcW));
@@ -3475,12 +3443,12 @@
 TEST_P(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
   EXPECT_TRUE(SetupRecvStream());
   EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcY)));
   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
   EXPECT_TRUE(AddRecvStream(kSsrcZ));
   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
-  EXPECT_TRUE(channel_->AsSendChannel()->AddSendStream(
+  EXPECT_TRUE(send_channel_->AddSendStream(
       cricket::StreamParams::CreateLegacy(kSsrcW)));
   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
   EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
@@ -3529,7 +3497,7 @@
   EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
 
   // If we remove and add a default stream, it should get the same sink.
-  EXPECT_TRUE(channel_->AsReceiveChannel()->RemoveRecvStream(kSsrc1));
+  EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc1));
   DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
   EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
 
@@ -3579,13 +3547,13 @@
   EXPECT_EQ(webrtc::kNetworkUp,
             call_.GetNetworkState(webrtc::MediaType::VIDEO));
 
-  channel_->AsSendChannel()->OnReadyToSend(false);
+  send_channel_->OnReadyToSend(false);
   EXPECT_EQ(webrtc::kNetworkDown,
             call_.GetNetworkState(webrtc::MediaType::AUDIO));
   EXPECT_EQ(webrtc::kNetworkUp,
             call_.GetNetworkState(webrtc::MediaType::VIDEO));
 
-  channel_->AsSendChannel()->OnReadyToSend(true);
+  send_channel_->OnReadyToSend(true);
   EXPECT_EQ(webrtc::kNetworkUp,
             call_.GetNetworkState(webrtc::MediaType::AUDIO));
   EXPECT_EQ(webrtc::kNetworkUp,