Remove CreateMediaChannel calls from webrtc_video_engine_unittest

Bug: webrtc:13931
Change-Id: I3d54741dffb337de9db80efa81b24396b96245f1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/309621
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40326}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 6a271da..dd698af 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -837,6 +837,7 @@
       defines = []
       deps = [
         ":codec",
+        ":media_channel",
         ":media_channel_shim",
         ":media_constants",
         ":rtc_audio_video",
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 568cc67..0fed092 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -55,6 +55,7 @@
 #include "media/base/fake_frame_source.h"
 #include "media/base/fake_network_interface.h"
 #include "media/base/fake_video_renderer.h"
+#include "media/base/media_channel.h"
 #include "media/base/media_constants.h"
 #include "media/base/rtp_utils.h"
 #include "media/base/test_utils.h"
@@ -382,10 +383,13 @@
   // present.
   cricket::VideoCodec GetEngineCodec(const std::string& name) const;
   void AddSupportedVideoCodecType(const std::string& name);
-  VideoMediaChannel* SetSendParamsWithAllSupportedCodecs();
+  std::unique_ptr<VideoMediaSendChannelInterface>
+  SetSendParamsWithAllSupportedCodecs();
 
-  VideoMediaChannel* SetRecvParamsWithSupportedCodecs(
-      const std::vector<VideoCodec>& codecs);
+  std::unique_ptr<VideoMediaReceiveChannelInterface>
+  SetRecvParamsWithAllSupportedCodecs();
+  std::unique_ptr<VideoMediaReceiveChannelInterface>
+  SetRecvParamsWithSupportedCodecs(const std::vector<VideoCodec>& codecs);
 
   void ExpectRtpCapabilitySupport(const char* uri, bool supported) const;
 
@@ -518,9 +522,7 @@
 
   AddSupportedVideoCodecType("VP8");
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
   // Add CVO extension.
@@ -556,9 +558,7 @@
 
   AddSupportedVideoCodecType("VP8");
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
   // Add CVO extension.
   const int id = 1;
   cricket::VideoSendParameters parameters;
@@ -572,7 +572,7 @@
   EXPECT_CALL(
       video_source,
       AddOrUpdateSink(_, Field(&rtc::VideoSinkWants::rotation_applied, false)));
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &video_source));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &video_source));
 }
 
 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) {
@@ -581,9 +581,7 @@
   AddSupportedVideoCodecType("VP8");
   AddSupportedVideoCodecType("VP9");
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
 
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
@@ -624,11 +622,10 @@
 TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) {
   AddSupportedVideoCodecType("VP8");
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get()));
-  auto send_channel = channel->AsVideoSendChannel();
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
 
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123)));
 
@@ -638,28 +635,29 @@
       << "Channel should be stoppable even without set codecs.";
 }
 
-TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) {
+TEST_F(WebRtcVideoEngineTest, GetStatsWithoutCodecsSetDoesNotCrash) {
   AddSupportedVideoCodecType("VP8");
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get()));
-  auto send_channel = channel->AsVideoSendChannel();
-
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123)));
   VideoMediaSendInfo send_info;
+  send_channel->GetStats(&send_info);
+
+  std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel =
+      engine_.CreateReceiveChannel(call_.get(), GetMediaConfig(),
+                                   VideoOptions(), webrtc::CryptoOptions());
+  EXPECT_TRUE(receive_channel->AddRecvStream(StreamParams::CreateLegacy(123)));
   VideoMediaReceiveInfo receive_info;
-  channel->GetSendStats(&send_info);
-  channel->GetReceiveStats(&receive_info);
+  receive_channel->GetStats(&receive_info);
 }
 
 TEST_F(WebRtcVideoEngineTest, UseFactoryForVp8WhenSupported) {
   AddSupportedVideoCodecType("VP8");
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
 
   send_channel->OnReadyToSend(true);
 
@@ -738,9 +736,7 @@
 TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) {
   AddSupportedVideoCodecType("VP9");
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto receive_channel = channel->AsVideoReceiveChannel();
+  auto receive_channel = SetRecvParamsWithAllSupportedCodecs();
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -751,9 +747,7 @@
   AddSupportedVideoCodecType("VP8");
   FakeCall* fake_call = new FakeCall();
   call_.reset(fake_call);
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
 
   EXPECT_TRUE(
       send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -762,7 +756,7 @@
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 60);
   EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
-  channel->SetSend(true);
+  send_channel->SetSend(true);
 
   FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
 
@@ -866,12 +860,12 @@
   decoder_factory_->AddSupportedVideoCodecType(name);
 }
 
-VideoMediaChannel*
+std::unique_ptr<VideoMediaSendChannelInterface>
 WebRtcVideoEngineTest::SetSendParamsWithAllSupportedCodecs() {
-  VideoMediaChannel* channel = engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get());
+  std::unique_ptr<VideoMediaSendChannelInterface> channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
   cricket::VideoSendParameters parameters;
   // We need to look up the codec in the engine to get the correct payload type.
   for (const webrtc::SdpVideoFormat& format :
@@ -887,12 +881,12 @@
   return channel;
 }
 
-VideoMediaChannel* WebRtcVideoEngineTest::SetRecvParamsWithSupportedCodecs(
+std::unique_ptr<VideoMediaReceiveChannelInterface>
+WebRtcVideoEngineTest::SetRecvParamsWithSupportedCodecs(
     const std::vector<VideoCodec>& codecs) {
-  VideoMediaChannel* channel = engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get());
+  std::unique_ptr<VideoMediaReceiveChannelInterface> channel =
+      engine_.CreateReceiveChannel(call_.get(), GetMediaConfig(),
+                                   VideoOptions(), webrtc::CryptoOptions());
   cricket::VideoRecvParameters parameters;
   parameters.codecs = codecs;
   EXPECT_TRUE(channel->SetRecvParameters(parameters));
@@ -900,6 +894,20 @@
   return channel;
 }
 
+std::unique_ptr<VideoMediaReceiveChannelInterface>
+WebRtcVideoEngineTest::SetRecvParamsWithAllSupportedCodecs() {
+  std::vector<VideoCodec> codecs;
+  for (const webrtc::SdpVideoFormat& format :
+       decoder_factory_->GetSupportedFormats()) {
+    cricket::VideoCodec engine_codec = GetEngineCodec(format.name);
+    if (!absl::c_linear_search(codecs, engine_codec)) {
+      codecs.push_back(engine_codec);
+    }
+  }
+
+  return SetRecvParamsWithSupportedCodecs(codecs);
+}
+
 void WebRtcVideoEngineTest::ExpectRtpCapabilitySupport(const char* uri,
                                                        bool supported) const {
   const std::vector<webrtc::RtpExtension> header_extensions =
@@ -927,18 +935,23 @@
             ASSERT_TRUE(rtcp_parser.Parse(packet->cdata(), packet->size()));
           }),
           Return(true)));
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(), VideoOptions(),
-      webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
+  std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel =
+      engine_.CreateReceiveChannel(call_.get(), GetMediaConfig(),
+                                   VideoOptions(), webrtc::CryptoOptions());
   cricket::VideoRecvParameters parameters;
   parameters.codecs = supported_codecs;
   const int kTransportSeqExtensionId = 1;
   parameters.extensions.push_back(RtpExtension(
       RtpExtension::kTransportSequenceNumberUri, kTransportSeqExtensionId));
-  ASSERT_TRUE(channel->SetRecvParameters(parameters));
-  channel->SetInterface(&network);
-  channel->AsVideoSendChannel()->OnReadyToSend(true);
-  channel->AsVideoReceiveChannel()->SetReceive(true);
+  ASSERT_TRUE(receive_channel->SetRecvParameters(parameters));
+  send_channel->SetInterface(&network);
+  receive_channel->SetInterface(&network);
+  send_channel->OnReadyToSend(true);
+  receive_channel->SetReceive(true);
 
   // Inject a RTX packet.
   webrtc::RtpHeaderExtensionMap extension_map(parameters.extensions);
@@ -949,13 +962,14 @@
   packet.SetExtension<webrtc::TransportSequenceNumber>(7);
   uint8_t* buf_ptr = packet.AllocatePayload(11);
   memset(buf_ptr, 0, 11);  // Pass MSAN (don't care about bytes 1-9)
-  channel->AsVideoReceiveChannel()->OnPacketReceived(packet);
+  receive_channel->OnPacketReceived(packet);
 
   //  Expect that feedback is  sent after a while.
   time_controller_.AdvanceTime(webrtc::TimeDelta::Seconds(1));
   EXPECT_GT(rtcp_parser.transport_feedback()->num_packets(), 0);
 
-  channel->SetInterface(nullptr);
+  send_channel->SetInterface(nullptr);
+  receive_channel->SetInterface(nullptr);
 }
 
 TEST_F(WebRtcVideoEngineTest, UpdatesUnsignaledRtxSsrcAndRecoversPayload) {
@@ -967,20 +981,20 @@
   ASSERT_EQ(supported_codecs[1].name, "rtx");
   int rtx_payload_type = supported_codecs[1].id;
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(), VideoOptions(),
-      webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
+  std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel =
+      engine_.CreateReceiveChannel(call_.get(), GetMediaConfig(),
+                                   VideoOptions(), webrtc::CryptoOptions());
   cricket::VideoRecvParameters parameters;
   parameters.codecs = supported_codecs;
-  ASSERT_TRUE(channel->SetRecvParameters(parameters));
-  channel->AsVideoReceiveChannel()->SetReceive(true);
+  ASSERT_TRUE(receive_channel->SetRecvParameters(parameters));
+  receive_channel->SetReceive(true);
 
   // Receive a normal payload packet. It is not a complete frame since the
   // marker bit is not set.
   RtpPacketReceived packet_1 =
       BuildVp8KeyFrame(/*ssrc*/ 123, supported_codecs[0].id);
   packet_1.SetMarker(false);
-  channel->AsVideoReceiveChannel()->OnPacketReceived(packet_1);
+  receive_channel->OnPacketReceived(packet_1);
 
   time_controller_.AdvanceTime(webrtc::TimeDelta::Millis(100));
   // No complete frame received. No decoder created yet.
@@ -995,7 +1009,7 @@
   RtpPacketReceived rtx_packet =
       BuildRtxPacket(345, rtx_payload_type, packet_2);
 
-  channel->AsVideoReceiveChannel()->OnPacketReceived(rtx_packet);
+  receive_channel->OnPacketReceived(rtx_packet);
 
   time_controller_.AdvanceTime(webrtc::TimeDelta::Millis(0));
   ASSERT_THAT(decoder_factory_->decoders(), Not(IsEmpty()));
@@ -1005,20 +1019,19 @@
 TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) {
   AddSupportedVideoCodecType("VP8");
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
   EXPECT_TRUE(
       send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
-  EXPECT_TRUE(channel->SetSend(true));
+  EXPECT_TRUE(send_channel->SetSend(true));
 
   webrtc::test::FrameForwarder frame_forwarder;
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 60);
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder));
+  EXPECT_TRUE(
+      send_channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
   ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(2));
@@ -1035,9 +1048,9 @@
     prev_width = codec_settings.width;
   }
 
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), nullptr, nullptr));
+  EXPECT_TRUE(send_channel->SetVideoSend(ssrcs.front(), nullptr, nullptr));
 
-  channel.reset();
+  send_channel.reset();
   ASSERT_EQ(0u, encoder_factory_->encoders().size());
 }
 
@@ -1050,18 +1063,17 @@
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 30);
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get()));
-  auto send_channel = channel->AsVideoSendChannel();
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 
   EXPECT_TRUE(
       send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder));
   // Sending one frame will have allocate the encoder.
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
@@ -1070,7 +1082,7 @@
 
   cricket::VideoSendParameters new_parameters;
   new_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(new_parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(new_parameters));
 
   // Sending one frame will switch encoder.
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -1084,20 +1096,19 @@
   AddSupportedVideoCodecType("VP8");
   AddSupportedVideoCodecType("H264");
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get()));
-  auto send_channel = channel->AsVideoSendChannel();
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
   EXPECT_TRUE(
       send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
-  EXPECT_TRUE(channel->SetSend(true));
+  EXPECT_TRUE(send_channel->SetSend(true));
 
   // Send a fake frame, or else the media engine will configure the simulcast
   // encoder adapter at a low-enough size that it'll only create a single
@@ -1105,7 +1116,8 @@
   webrtc::test::FrameForwarder frame_forwarder;
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 30);
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder));
+  EXPECT_TRUE(
+      send_channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
 
@@ -1114,7 +1126,7 @@
   EXPECT_EQ(webrtc::kVideoCodecVP8,
             encoder_factory_->encoders()[0]->GetCodecSettings().codecType);
 
-  channel.reset();
+  send_channel.reset();
   // Make sure DestroyVideoEncoder was called on the factory.
   EXPECT_EQ(0u, encoder_factory_->encoders().size());
 }
@@ -1124,14 +1136,13 @@
   AddSupportedVideoCodecType("VP8");
   AddSupportedVideoCodecType("H264");
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get()));
-  auto send_channel = channel->AsVideoSendChannel();
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 
   EXPECT_TRUE(
       send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1140,7 +1151,7 @@
   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());
   ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1));
@@ -1149,7 +1160,7 @@
   EXPECT_EQ(webrtc::kVideoCodecH264,
             encoder_factory_->encoders()[0]->GetCodecSettings().codecType);
 
-  channel.reset();
+  send_channel.reset();
   // Make sure DestroyVideoEncoder was called on the factory.
   ASSERT_EQ(0u, encoder_factory_->encoders().size());
 }
@@ -1157,15 +1168,14 @@
 TEST_F(WebRtcVideoEngineTest, SimulcastEnabledForH264) {
   AddSupportedVideoCodecType("H264");
 
-  std::unique_ptr<VideoMediaChannel> channel(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(),
-      video_bitrate_allocator_factory_.get()));
-  auto send_channel = channel->AsVideoSendChannel();
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine_.CreateSendChannel(call_.get(), GetMediaConfig(), VideoOptions(),
+                                webrtc::CryptoOptions(),
+                                video_bitrate_allocator_factory_.get());
 
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
+  EXPECT_TRUE(send_channel->SetSendParameters(parameters));
 
   const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
   EXPECT_TRUE(send_channel->AddSendStream(
@@ -1175,7 +1185,7 @@
   webrtc::test::FrameForwarder frame_forwarder;
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 30);
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   time_controller_.AdvanceTime(webrtc::TimeDelta::Zero());
 
@@ -1185,7 +1195,7 @@
   ASSERT_TRUE(encoder_factory_->encoders()[0]->WaitForInitEncode());
   EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType);
   EXPECT_LT(1u, encoder->GetCodecSettings().numberOfSimulcastStreams);
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], nullptr, nullptr));
+  EXPECT_TRUE(send_channel->SetVideoSend(ssrcs[0], nullptr, nullptr));
 }
 
 // Test that FlexFEC is not supported as a send video codec by default.
@@ -1284,9 +1294,7 @@
   cricket::VideoRecvParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetRecvParamsWithSupportedCodecs(parameters.codecs));
-  auto receive_channel = channel->AsVideoReceiveChannel();
+  auto receive_channel = SetRecvParamsWithSupportedCodecs(parameters.codecs);
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1313,9 +1321,7 @@
   std::vector<cricket::VideoCodec> codecs;
   codecs.push_back(GetEngineCodec("H264"));
 
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetRecvParamsWithSupportedCodecs(codecs));
-  auto receive_channel = channel->AsVideoReceiveChannel();
+  auto receive_channel = SetRecvParamsWithSupportedCodecs(codecs);
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1331,15 +1337,14 @@
   AddSupportedVideoCodecType("VP8");
   cricket::VideoRecvParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetRecvParamsWithSupportedCodecs(parameters.codecs));
-  auto receive_channel = channel->AsVideoReceiveChannel();
+  auto receive_channel = SetRecvParamsWithSupportedCodecs(parameters.codecs);
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
 
   // Call GetSources with |kSsrc + 1| which doesn't exist.
-  std::vector<webrtc::RtpSource> sources = channel->GetSources(kSsrc + 1);
+  std::vector<webrtc::RtpSource> sources =
+      receive_channel->GetSources(kSsrc + 1);
   EXPECT_EQ(0u, sources.size());
 }
 
@@ -1456,17 +1461,17 @@
 
   // Create send channel.
   const int send_ssrc = 123;
-  std::unique_ptr<VideoMediaChannel> send_channel(engine.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(), rate_allocator_factory.get()));
-  auto send_send_channel = send_channel->AsVideoSendChannel();
+  std::unique_ptr<VideoMediaSendChannelInterface> send_channel =
+      engine.CreateSendChannel(call.get(), GetMediaConfig(), VideoOptions(),
+                               webrtc::CryptoOptions(),
+                               rate_allocator_factory.get());
 
   cricket::VideoSendParameters send_parameters;
   send_parameters.codecs.push_back(engine_codecs.at(0));
   EXPECT_TRUE(send_channel->SetSendParameters(send_parameters));
-  send_send_channel->OnReadyToSend(true);
+  send_channel->OnReadyToSend(true);
   EXPECT_TRUE(
-      send_send_channel->AddSendStream(StreamParams::CreateLegacy(send_ssrc)));
+      send_channel->AddSendStream(StreamParams::CreateLegacy(send_ssrc)));
   EXPECT_TRUE(send_channel->SetSend(true));
 
   // Set capturer.
@@ -1480,10 +1485,9 @@
 
   // Create recv channel.
   const int recv_ssrc = 321;
-  std::unique_ptr<VideoMediaChannel> recv_channel(engine.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call.get(), GetMediaConfig(),
-      VideoOptions(), webrtc::CryptoOptions(), rate_allocator_factory.get()));
-  auto receive_channel = recv_channel->AsVideoReceiveChannel();
+  std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel =
+      engine.CreateReceiveChannel(call.get(), GetMediaConfig(), VideoOptions(),
+                                  webrtc::CryptoOptions());
 
   cricket::VideoRecvParameters recv_parameters;
   recv_parameters.codecs.push_back(engine_codecs.at(0));
@@ -1495,16 +1499,14 @@
   EXPECT_CALL(*encoder_factory, Die());
   EXPECT_CALL(*decoder_factory, Die());
   EXPECT_CALL(*rate_allocator_factory, Die());
-  EXPECT_TRUE(send_send_channel->RemoveSendStream(send_ssrc));
+  EXPECT_TRUE(send_channel->RemoveSendStream(send_ssrc));
   EXPECT_TRUE(receive_channel->RemoveRecvStream(recv_ssrc));
 }
 
 TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) {
   encoder_factory_->AddSupportedVideoCodecType("VP8");
   std::unique_ptr<FakeCall> fake_call(new FakeCall());
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = channel->AsVideoSendChannel();
+  auto send_channel = SetSendParamsWithAllSupportedCodecs();
 
   ASSERT_TRUE(
       send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1512,27 +1514,27 @@
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(codec);
   send_channel->OnReadyToSend(true);
-  channel->SetSend(true);
-  ASSERT_TRUE(channel->SetSendParameters(parameters));
+  send_channel->SetSend(true);
+  ASSERT_TRUE(send_channel->SetSendParameters(parameters));
 
   webrtc::test::FrameForwarder frame_forwarder;
   cricket::FakeFrameSource frame_source(1280, 720,
                                         rtc::kNumMicrosecsPerSec / 30);
   VideoOptions options;
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
 
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1));
   EXPECT_EQ(webrtc::VideoCodecMode::kRealtimeVideo,
             encoder_factory_->encoders().back()->GetCodecSettings().mode);
 
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   // No change in content type, keep current encoder.
   EXPECT_EQ(1, encoder_factory_->GetNumCreatedEncoders());
 
   options.is_screencast.emplace(true);
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   // Change to screen content, recreate encoder. For the simulcast encoder
   // adapter case, this will result in two calls since InitEncode triggers a
@@ -1541,14 +1543,14 @@
   EXPECT_EQ(webrtc::VideoCodecMode::kScreensharing,
             encoder_factory_->encoders().back()->GetCodecSettings().mode);
 
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
   // Still screen content, no need to update encoder.
   EXPECT_EQ(2, encoder_factory_->GetNumCreatedEncoders());
 
   options.is_screencast.emplace(false);
   options.video_noise_reduction.emplace(false);
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
+  EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder));
   // Change back to regular video content, update encoder. Also change
   // a non `is_screencast` option just to verify it doesn't affect recreation.
   frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame());
@@ -2708,11 +2710,10 @@
   }
 
   // Casts a shim channel to a webrtc::Transport. Used once.
-  webrtc::Transport* ChannelImplAsTransport(VideoMediaChannel* channel) {
+  webrtc::Transport* ChannelImplAsTransport(
+      cricket::VideoMediaSendChannelInterface* channel) {
     return static_cast<webrtc::Transport*>(
-        static_cast<cricket::WebRtcVideoSendChannel*>(
-            static_cast<VideoMediaShimChannel*>(channel)
-                ->SendImplForTesting()));
+        static_cast<cricket::WebRtcVideoSendChannel*>(channel));
   }
 
   cricket::VideoCodec GetEngineCodec(const std::string& name) {
@@ -5565,28 +5566,25 @@
   std::unique_ptr<cricket::FakeNetworkInterface> network_interface(
       new cricket::FakeNetworkInterface);
   MediaConfig config;
-  std::unique_ptr<cricket::VideoMediaChannel> channel;
-  cricket::VideoMediaSendChannelInterface* send_channel;
+  std::unique_ptr<cricket::VideoMediaSendChannelInterface> send_channel;
   webrtc::RtpParameters parameters;
 
-  channel.reset(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), config, VideoOptions(),
-      webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
-  send_channel = channel->AsVideoSendChannel();
+  send_channel = engine_.CreateSendChannel(
+      call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
+      video_bitrate_allocator_factory_.get());
 
-  channel->SetInterface(network_interface.get());
+  send_channel->SetInterface(network_interface.get());
   // Default value when DSCP is disabled should be DSCP_DEFAULT.
   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
-  channel->SetInterface(nullptr);
+  send_channel->SetInterface(nullptr);
 
   // Default value when DSCP is enabled is also DSCP_DEFAULT, until it is set
   // through rtp parameters.
   config.enable_dscp = true;
-  channel.reset(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), config, VideoOptions(),
-      webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
-  send_channel = channel->AsVideoSendChannel();
-  channel->SetInterface(network_interface.get());
+  send_channel = engine_.CreateSendChannel(
+      call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
+      video_bitrate_allocator_factory_.get());
+  send_channel->SetInterface(network_interface.get());
   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
 
   // Create a send stream to configure
@@ -5606,20 +5604,20 @@
 
   // Packets should also self-identify their dscp in PacketOptions.
   const uint8_t kData[10] = {0};
-  EXPECT_TRUE(
-      ChannelImplAsTransport(channel.get())->SendRtcp(kData, sizeof(kData)));
+  EXPECT_TRUE(ChannelImplAsTransport(send_channel.get())
+                  ->SendRtcp(kData, sizeof(kData)));
   EXPECT_EQ(rtc::DSCP_CS1, network_interface->options().dscp);
-  channel->SetInterface(nullptr);
+  send_channel->SetInterface(nullptr);
 
   // Verify that setting the option to false resets the
   // DiffServCodePoint.
   config.enable_dscp = false;
-  channel.reset(engine_.CreateMediaChannel(
-      cricket::MediaChannel::Role::kBoth, call_.get(), config, VideoOptions(),
-      webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
-  channel->SetInterface(network_interface.get());
+  send_channel = engine_.CreateSendChannel(
+      call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
+      video_bitrate_allocator_factory_.get());
+  send_channel->SetInterface(network_interface.get());
   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
-  channel->SetInterface(nullptr);
+  send_channel->SetInterface(nullptr);
 }
 
 // This test verifies that the RTCP reduced size mode is properly applied to