Remove transitional shim classes

Bug: webrtc:13931
Change-Id: Iaeb0b892aca4b4d64d13a025adc7564e572e0f26
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/307940
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40232}
diff --git a/media/base/media_channel_impl.h b/media/base/media_channel_impl.h
index 5a76708..66c2f3e 100644
--- a/media/base/media_channel_impl.h
+++ b/media/base/media_channel_impl.h
@@ -388,455 +388,6 @@
   }
 };
 
-// The externally exposed objects that support the Send and Receive interfaces.
-// These dispatch their functions to the underlying MediaChannel objects.
-
-class VoiceMediaSendChannel : public VoiceMediaSendChannelInterface {
- public:
-  explicit VoiceMediaSendChannel(VoiceMediaChannel* impl) : impl_(impl) {}
-  virtual ~VoiceMediaSendChannel() {}
-  VoiceMediaSendChannelInterface* AsVoiceSendChannel() override { return this; }
-  VideoMediaSendChannelInterface* AsVideoSendChannel() override {
-    RTC_CHECK_NOTREACHED();
-    return nullptr;
-  }
-
-  // Implementation of MediaBaseChannelInterface
-  cricket::MediaType media_type() const override { return MEDIA_TYPE_AUDIO; }
-  void OnPacketSent(const rtc::SentPacket& sent_packet) override {
-    impl()->OnPacketSent(sent_packet);
-  }
-  void OnReadyToSend(bool ready) override { impl()->OnReadyToSend(ready); }
-  void OnNetworkRouteChanged(absl::string_view transport_name,
-                             const rtc::NetworkRoute& network_route) override {
-    impl()->OnNetworkRouteChanged(transport_name, network_route);
-  }
-  void SetExtmapAllowMixed(bool extmap_allow_mixed) override {
-    impl()->SetExtmapAllowMixed(extmap_allow_mixed);
-  }
-  bool ExtmapAllowMixed() const override { return impl()->ExtmapAllowMixed(); }
-  void SetInterface(MediaChannelNetworkInterface* iface) override {
-    return impl()->SetInterface(iface);
-  }
-  bool HasNetworkInterface() const override {
-    return impl()->HasNetworkInterface();
-  }
-  // Implementation of MediaSendChannelInterface
-  bool AddSendStream(const StreamParams& sp) override {
-    return impl()->AddSendStream(sp);
-  }
-  bool RemoveSendStream(uint32_t ssrc) override {
-    return impl()->RemoveSendStream(ssrc);
-  }
-  void SetFrameEncryptor(uint32_t ssrc,
-                         rtc::scoped_refptr<webrtc::FrameEncryptorInterface>
-                             frame_encryptor) override {
-    impl()->SetFrameEncryptor(ssrc, frame_encryptor);
-  }
-  webrtc::RTCError SetRtpSendParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters,
-      webrtc::SetParametersCallback callback = nullptr) override {
-    return impl()->SetRtpSendParameters(ssrc, parameters, std::move(callback));
-  }
-
-  void SetEncoderToPacketizerFrameTransformer(
-      uint32_t ssrc,
-      rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
-      override {
-    return impl()->SetEncoderToPacketizerFrameTransformer(ssrc,
-                                                          frame_transformer);
-  }
-  void SetEncoderSelector(uint32_t ssrc,
-                          webrtc::VideoEncoderFactory::EncoderSelectorInterface*
-                              encoder_selector) override {
-    impl()->SetEncoderSelector(ssrc, encoder_selector);
-  }
-  webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override {
-    return impl()->GetRtpSendParameters(ssrc);
-  }
-  void SetSsrcListChangedCallback(
-      absl::AnyInvocable<void(const std::set<uint32_t>&)> callback) override {
-    impl()->SetSsrcListChangedCallback(std::move(callback));
-  }
-  // Implementation of VoiceMediaSendChannel
-  bool SetSendParameters(const AudioSendParameters& params) override {
-    return impl()->SetSendParameters(params);
-  }
-  void SetSend(bool send) override { return impl()->SetSend(send); }
-  bool SetAudioSend(uint32_t ssrc,
-                    bool enable,
-                    const AudioOptions* options,
-                    AudioSource* source) override {
-    return impl()->SetAudioSend(ssrc, enable, options, source);
-  }
-  bool CanInsertDtmf() override { return impl()->CanInsertDtmf(); }
-  bool InsertDtmf(uint32_t ssrc, int event, int duration) override {
-    return impl()->InsertDtmf(ssrc, event, duration);
-  }
-  bool GetStats(VoiceMediaSendInfo* info) override {
-    return impl_->GetSendStats(info);
-  }
-  bool SenderNackEnabled() const override { return impl_->SenderNackEnabled(); }
-  bool SenderNonSenderRttEnabled() const override {
-    return impl_->SenderNonSenderRttEnabled();
-  }
-  bool SendCodecHasNack() const override { return impl()->SendCodecHasNack(); }
-  void SetSendCodecChangedCallback(
-      absl::AnyInvocable<void()> callback) override {
-    impl()->SetSendCodecChangedCallback(std::move(callback));
-  }
-  MediaChannel* ImplForTesting() override { return impl_; }
-
- private:
-  VoiceMediaSendChannelInterface* impl() { return impl_; }
-  const VoiceMediaSendChannelInterface* impl() const { return impl_; }
-  VoiceMediaChannel* impl_;
-};
-
-class VoiceMediaReceiveChannel : public VoiceMediaReceiveChannelInterface {
- public:
-  explicit VoiceMediaReceiveChannel(VoiceMediaChannel* impl) : impl_(impl) {}
-  virtual ~VoiceMediaReceiveChannel() {}
-
-  VoiceMediaReceiveChannelInterface* AsVoiceReceiveChannel() override {
-    return this;
-  }
-  VideoMediaReceiveChannelInterface* AsVideoReceiveChannel() override {
-    RTC_DCHECK_NOTREACHED();
-    return nullptr;
-  }
-  // Implementation of MediaBaseChannelInterface
-  cricket::MediaType media_type() const override { return MEDIA_TYPE_AUDIO; }
-  void OnPacketReceived(const webrtc::RtpPacketReceived& packet) override {
-    impl()->OnPacketReceived(packet);
-  }
-  void SetInterface(MediaChannelNetworkInterface* iface) override {
-    return impl()->SetInterface(iface);
-  }
-  // Implementation of Delayable
-  bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override {
-    return impl()->SetBaseMinimumPlayoutDelayMs(ssrc, delay_ms);
-  }
-  absl::optional<int> GetBaseMinimumPlayoutDelayMs(
-      uint32_t ssrc) const override {
-    return impl()->GetBaseMinimumPlayoutDelayMs(ssrc);
-  }
-  // Implementation of MediaReceiveChannelInterface
-  bool AddRecvStream(const StreamParams& sp) override {
-    return impl()->AddRecvStream(sp);
-  }
-  bool RemoveRecvStream(uint32_t ssrc) override {
-    return impl()->RemoveRecvStream(ssrc);
-  }
-  void ResetUnsignaledRecvStream() override {
-    return impl()->ResetUnsignaledRecvStream();
-  }
-  void ChooseReceiverReportSsrc(const std::set<uint32_t>& choices) override {
-    return impl()->ChooseReceiverReportSsrc(choices);
-  }
-  absl::optional<uint32_t> GetUnsignaledSsrc() const override {
-    return impl()->GetUnsignaledSsrc();
-  }
-  void OnDemuxerCriteriaUpdatePending() override {
-    impl()->OnDemuxerCriteriaUpdatePending();
-  }
-  void OnDemuxerCriteriaUpdateComplete() override {
-    impl()->OnDemuxerCriteriaUpdateComplete();
-  }
-  void SetFrameDecryptor(uint32_t ssrc,
-                         rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
-                             frame_decryptor) override {
-    impl()->SetFrameDecryptor(ssrc, frame_decryptor);
-  }
-  void SetDepacketizerToDecoderFrameTransformer(
-      uint32_t ssrc,
-      rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
-      override {
-    impl()->SetDepacketizerToDecoderFrameTransformer(ssrc, frame_transformer);
-  }
-  // Implementation of VoiceMediaReceiveChannelInterface
-  bool SetRecvParameters(const AudioRecvParameters& params) override {
-    return impl()->SetRecvParameters(params);
-  }
-  webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override {
-    return impl()->GetRtpReceiveParameters(ssrc);
-  }
-  std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override {
-    return impl()->GetSources(ssrc);
-  }
-  webrtc::RtpParameters GetDefaultRtpReceiveParameters() const override {
-    return impl()->GetDefaultRtpReceiveParameters();
-  }
-  void SetPlayout(bool playout) override { return impl()->SetPlayout(playout); }
-  bool SetOutputVolume(uint32_t ssrc, double volume) override {
-    return impl()->SetOutputVolume(ssrc, volume);
-  }
-  bool SetDefaultOutputVolume(double volume) override {
-    return impl()->SetDefaultOutputVolume(volume);
-  }
-  void SetRawAudioSink(
-      uint32_t ssrc,
-      std::unique_ptr<webrtc::AudioSinkInterface> sink) override {
-    return impl()->SetRawAudioSink(ssrc, std::move(sink));
-  }
-  void SetDefaultRawAudioSink(
-      std::unique_ptr<webrtc::AudioSinkInterface> sink) override {
-    return impl()->SetDefaultRawAudioSink(std::move(sink));
-  }
-  bool GetStats(VoiceMediaReceiveInfo* info, bool reset_legacy) override {
-    return impl_->GetReceiveStats(info, reset_legacy);
-  }
-  void SetReceiveNackEnabled(bool enabled) override {
-    impl_->SetReceiveNackEnabled(enabled);
-  }
-  void SetReceiveNonSenderRttEnabled(bool enabled) override {
-    impl_->SetReceiveNonSenderRttEnabled(enabled);
-  }
-  MediaChannel* ImplForTesting() override { return impl_; }
-
- private:
-  VoiceMediaReceiveChannelInterface* impl() { return impl_; }
-  const VoiceMediaReceiveChannelInterface* impl() const { return impl_; }
-  VoiceMediaChannel* impl_;
-};
-
-class VideoMediaSendChannel : public VideoMediaSendChannelInterface {
- public:
-  explicit VideoMediaSendChannel(VideoMediaChannel* impl) : impl_(impl) {}
-
-  VideoMediaSendChannelInterface* AsVideoSendChannel() override { return this; }
-  VoiceMediaSendChannelInterface* AsVoiceSendChannel() override {
-    RTC_CHECK_NOTREACHED();
-    return nullptr;
-  }
-
-  // Implementation of MediaBaseChannelInterface
-  cricket::MediaType media_type() const override { return MEDIA_TYPE_VIDEO; }
-  void OnPacketSent(const rtc::SentPacket& sent_packet) override {
-    impl()->OnPacketSent(sent_packet);
-  }
-  void OnReadyToSend(bool ready) override { impl()->OnReadyToSend(ready); }
-  void OnNetworkRouteChanged(absl::string_view transport_name,
-                             const rtc::NetworkRoute& network_route) override {
-    impl()->OnNetworkRouteChanged(transport_name, network_route);
-  }
-  void SetExtmapAllowMixed(bool extmap_allow_mixed) override {
-    impl()->SetExtmapAllowMixed(extmap_allow_mixed);
-  }
-  bool HasNetworkInterface() const override {
-    return impl()->HasNetworkInterface();
-  }
-  bool ExtmapAllowMixed() const override { return impl()->ExtmapAllowMixed(); }
-  void SetInterface(MediaChannelNetworkInterface* iface) override {
-    return impl()->SetInterface(iface);
-  }
-  // Implementation of MediaSendChannelInterface
-  bool AddSendStream(const StreamParams& sp) override {
-    return impl()->AddSendStream(sp);
-  }
-  bool RemoveSendStream(uint32_t ssrc) override {
-    return impl()->RemoveSendStream(ssrc);
-  }
-  void SetFrameEncryptor(uint32_t ssrc,
-                         rtc::scoped_refptr<webrtc::FrameEncryptorInterface>
-                             frame_encryptor) override {
-    impl()->SetFrameEncryptor(ssrc, frame_encryptor);
-  }
-  webrtc::RTCError SetRtpSendParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters,
-      webrtc::SetParametersCallback callback = nullptr) override {
-    return impl()->SetRtpSendParameters(ssrc, parameters, std::move(callback));
-  }
-
-  void SetEncoderToPacketizerFrameTransformer(
-      uint32_t ssrc,
-      rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
-      override {
-    return impl()->SetEncoderToPacketizerFrameTransformer(ssrc,
-                                                          frame_transformer);
-  }
-  void SetEncoderSelector(uint32_t ssrc,
-                          webrtc::VideoEncoderFactory::EncoderSelectorInterface*
-                              encoder_selector) override {
-    impl()->SetEncoderSelector(ssrc, encoder_selector);
-  }
-  webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override {
-    return impl()->GetRtpSendParameters(ssrc);
-  }
-  // Implementation of VideoMediaSendChannelInterface
-  bool SetSendParameters(const VideoSendParameters& params) override {
-    return impl()->SetSendParameters(params);
-  }
-  absl::optional<VideoCodec> GetSendCodec() override {
-    return impl()->GetSendCodec();
-  }
-  bool SetSend(bool send) override { return impl()->SetSend(send); }
-  bool SetVideoSend(
-      uint32_t ssrc,
-      const VideoOptions* options,
-      rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override {
-    return impl()->SetVideoSend(ssrc, options, source);
-  }
-  void GenerateSendKeyFrame(uint32_t ssrc,
-                            const std::vector<std::string>& rids) override {
-    return impl()->GenerateSendKeyFrame(ssrc, rids);
-  }
-  void SetVideoCodecSwitchingEnabled(bool enabled) override {
-    return impl()->SetVideoCodecSwitchingEnabled(enabled);
-  }
-  bool GetStats(VideoMediaSendInfo* info) override {
-    return impl_->GetSendStats(info);
-  }
-  void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override {
-    return impl_->FillBitrateInfo(bwe_info);
-  }
-  // Information queries to support SetReceiverFeedbackParameters
-  webrtc::RtcpMode SendCodecRtcpMode() const override {
-    return impl()->SendCodecRtcpMode();
-  }
-  bool SendCodecHasLntf() const override { return impl()->SendCodecHasLntf(); }
-  bool SendCodecHasNack() const override { return impl()->SendCodecHasNack(); }
-  absl::optional<int> SendCodecRtxTime() const override {
-    return impl()->SendCodecRtxTime();
-  }
-  void SetSsrcListChangedCallback(
-      absl::AnyInvocable<void(const std::set<uint32_t>&)> callback) override {
-    impl()->SetSsrcListChangedCallback(std::move(callback));
-  }
-  void SetSendCodecChangedCallback(
-      absl::AnyInvocable<void()> callback) override {
-    impl()->SetSendCodecChangedCallback(std::move(callback));
-  }
-
-  MediaChannel* ImplForTesting() override { return impl_; }
-
- private:
-  VideoMediaSendChannelInterface* impl() { return impl_; }
-  const VideoMediaSendChannelInterface* impl() const { return impl_; }
-  VideoMediaChannel* const impl_;
-};
-
-class VideoMediaReceiveChannel : public VideoMediaReceiveChannelInterface {
- public:
-  explicit VideoMediaReceiveChannel(VideoMediaChannel* impl) : impl_(impl) {}
-
-  VideoMediaReceiveChannelInterface* AsVideoReceiveChannel() override {
-    return this;
-  }
-  VoiceMediaReceiveChannelInterface* AsVoiceReceiveChannel() override {
-    RTC_DCHECK_NOTREACHED();
-    return nullptr;
-  }
-
-  // Implementation of MediaBaseChannelInterface
-  cricket::MediaType media_type() const override { return MEDIA_TYPE_VIDEO; }
-  void OnPacketReceived(const webrtc::RtpPacketReceived& packet) override {
-    impl()->OnPacketReceived(packet);
-  }
-  // Implementation of Delayable
-  bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override {
-    return impl()->SetBaseMinimumPlayoutDelayMs(ssrc, delay_ms);
-  }
-  absl::optional<int> GetBaseMinimumPlayoutDelayMs(
-      uint32_t ssrc) const override {
-    return impl()->GetBaseMinimumPlayoutDelayMs(ssrc);
-  }
-  // Implementation of MediaReceiveChannelInterface
-  void SetInterface(MediaChannelNetworkInterface* iface) override {
-    return impl()->SetInterface(iface);
-  }
-  bool AddRecvStream(const StreamParams& sp) override {
-    return impl()->AddRecvStream(sp);
-  }
-  bool RemoveRecvStream(uint32_t ssrc) override {
-    return impl()->RemoveRecvStream(ssrc);
-  }
-  void ResetUnsignaledRecvStream() override {
-    return impl()->ResetUnsignaledRecvStream();
-  }
-  absl::optional<uint32_t> GetUnsignaledSsrc() const override {
-    return impl()->GetUnsignaledSsrc();
-  }
-  void ChooseReceiverReportSsrc(const std::set<uint32_t>& choices) override {
-    return impl()->ChooseReceiverReportSsrc(choices);
-  }
-  void OnDemuxerCriteriaUpdatePending() override {
-    impl()->OnDemuxerCriteriaUpdatePending();
-  }
-  void OnDemuxerCriteriaUpdateComplete() override {
-    impl()->OnDemuxerCriteriaUpdateComplete();
-  }
-  void SetFrameDecryptor(uint32_t ssrc,
-                         rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
-                             frame_decryptor) override {
-    impl()->SetFrameDecryptor(ssrc, frame_decryptor);
-  }
-  void SetDepacketizerToDecoderFrameTransformer(
-      uint32_t ssrc,
-      rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
-      override {
-    impl()->SetDepacketizerToDecoderFrameTransformer(ssrc, frame_transformer);
-  }
-  // Implementation of VideoMediaReceiveChannelInterface
-  bool SetRecvParameters(const VideoRecvParameters& params) override {
-    return impl()->SetRecvParameters(params);
-  }
-  webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override {
-    return impl()->GetRtpReceiveParameters(ssrc);
-  }
-  webrtc::RtpParameters GetDefaultRtpReceiveParameters() const override {
-    return impl()->GetDefaultRtpReceiveParameters();
-  }
-  bool SetSink(uint32_t ssrc,
-               rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override {
-    return impl()->SetSink(ssrc, sink);
-  }
-  void SetDefaultSink(
-      rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override {
-    return impl()->SetDefaultSink(sink);
-  }
-  void RequestRecvKeyFrame(uint32_t ssrc) override {
-    return impl()->RequestRecvKeyFrame(ssrc);
-  }
-  std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override {
-    return impl()->GetSources(ssrc);
-  }
-  // Set recordable encoded frame callback for `ssrc`
-  void SetRecordableEncodedFrameCallback(
-      uint32_t ssrc,
-      std::function<void(const webrtc::RecordableEncodedFrame&)> callback)
-      override {
-    return impl()->SetRecordableEncodedFrameCallback(ssrc, std::move(callback));
-  }
-  // Clear recordable encoded frame callback for `ssrc`
-  void ClearRecordableEncodedFrameCallback(uint32_t ssrc) override {
-    impl()->ClearRecordableEncodedFrameCallback(ssrc);
-  }
-  bool GetStats(VideoMediaReceiveInfo* info) override {
-    return impl_->GetReceiveStats(info);
-  }
-  void SetReceiverFeedbackParameters(bool lntf_enabled,
-                                     bool nack_enabled,
-                                     webrtc::RtcpMode rtcp_mode,
-                                     absl::optional<int> rtx_time) override {
-    impl()->SetReceiverFeedbackParameters(lntf_enabled, nack_enabled, rtcp_mode,
-                                          rtx_time);
-  }
-  void SetReceive(bool receive) override { impl()->SetReceive(receive); }
-
-  MediaChannel* ImplForTesting() override { return impl_; }
-  bool AddDefaultRecvStreamForTesting(const StreamParams& sp) override {
-    return impl()->AddDefaultRecvStreamForTesting(sp);
-  }
-
- private:
-  VideoMediaReceiveChannelInterface* impl() { return impl_; }
-  const VideoMediaReceiveChannelInterface* impl() const { return impl_; }
-  VideoMediaChannel* const impl_;
-};
-
 }  // namespace cricket
 
 #endif  // MEDIA_BASE_MEDIA_CHANNEL_IMPL_H_
diff --git a/media/base/media_channel_shim.h b/media/base/media_channel_shim.h
index 4c5e9da..335fae2 100644
--- a/media/base/media_channel_shim.h
+++ b/media/base/media_channel_shim.h
@@ -90,7 +90,7 @@
   }
 
   // Implementation of MediaBaseChannelInterface
-  cricket::MediaType media_type() const override { return MEDIA_TYPE_VIDEO; }
+  cricket::MediaType media_type() const override { return MEDIA_TYPE_AUDIO; }
 
   // Implementation of MediaSendChannelInterface
   void OnPacketSent(const rtc::SentPacket& sent_packet) override {
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 97ed730..3f6cd25 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -520,7 +520,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
   // Add CVO extension.
@@ -558,7 +558,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
   // Add CVO extension.
   const int id = 1;
   cricket::VideoSendParameters parameters;
@@ -583,7 +583,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
@@ -628,7 +628,7 @@
       cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123)));
 
@@ -645,7 +645,7 @@
       cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123)));
   VideoMediaSendInfo send_info;
@@ -659,7 +659,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   send_channel->OnReadyToSend(true);
 
@@ -740,8 +740,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto receive_channel =
-      std::make_unique<VideoMediaReceiveChannel>(channel.get());
+  auto receive_channel = channel->AsVideoReceiveChannel();
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -754,7 +753,7 @@
   call_.reset(fake_call);
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   EXPECT_TRUE(
       send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1008,7 +1007,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
@@ -1055,7 +1054,7 @@
       cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
@@ -1089,7 +1088,7 @@
       cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
@@ -1129,7 +1128,7 @@
       cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
@@ -1162,7 +1161,7 @@
       cricket::MediaChannel::Role::kBoth, call_.get(), GetMediaConfig(),
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(GetEngineCodec("H264"));
@@ -1287,8 +1286,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetRecvParamsWithSupportedCodecs(parameters.codecs));
-  auto receive_channel =
-      std::make_unique<VideoMediaReceiveChannel>(channel.get());
+  auto receive_channel = channel->AsVideoReceiveChannel();
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1317,8 +1315,7 @@
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetRecvParamsWithSupportedCodecs(codecs));
-  auto receive_channel =
-      std::make_unique<VideoMediaReceiveChannel>(channel.get());
+  auto receive_channel = channel->AsVideoReceiveChannel();
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1336,8 +1333,7 @@
   parameters.codecs.push_back(GetEngineCodec("VP8"));
   std::unique_ptr<VideoMediaChannel> channel(
       SetRecvParamsWithSupportedCodecs(parameters.codecs));
-  auto receive_channel =
-      std::make_unique<VideoMediaReceiveChannel>(channel.get());
+  auto receive_channel = channel->AsVideoReceiveChannel();
 
   EXPECT_TRUE(receive_channel->AddRecvStream(
       cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1463,8 +1459,7 @@
   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 =
-      std::make_unique<VideoMediaSendChannel>(send_channel.get());
+  auto send_send_channel = send_channel->AsVideoSendChannel();
 
   cricket::VideoSendParameters send_parameters;
   send_parameters.codecs.push_back(engine_codecs.at(0));
@@ -1488,8 +1483,7 @@
   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 =
-      std::make_unique<VideoMediaReceiveChannel>(recv_channel.get());
+  auto receive_channel = recv_channel->AsVideoReceiveChannel();
 
   cricket::VideoRecvParameters recv_parameters;
   recv_parameters.codecs.push_back(engine_codecs.at(0));
@@ -1510,7 +1504,7 @@
   std::unique_ptr<FakeCall> fake_call(new FakeCall());
   std::unique_ptr<VideoMediaChannel> channel(
       SetSendParamsWithAllSupportedCodecs());
-  auto send_channel = std::make_unique<VideoMediaSendChannel>(channel.get());
+  auto send_channel = channel->AsVideoSendChannel();
 
   ASSERT_TRUE(
       send_channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -1621,9 +1615,8 @@
             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());
+    send_channel_ = channel_->AsVideoSendChannel();
+    receive_channel_ = channel_->AsVideoReceiveChannel();
 
     network_interface_.SetDestination(channel_.get());
     channel_->SetInterface(&network_interface_);
@@ -1658,8 +1651,8 @@
       video_bitrate_allocator_factory_;
   WebRtcVideoEngine engine_;
   std::unique_ptr<VideoMediaChannel> channel_;
-  std::unique_ptr<VideoMediaSendChannel> send_channel_;
-  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
+  VideoMediaSendChannelInterface* send_channel_;
+  VideoMediaReceiveChannelInterface* receive_channel_;
   cricket::FakeNetworkInterface network_interface_;
   cricket::FakeVideoRenderer renderer_;
 };
@@ -1802,9 +1795,8 @@
         cricket::MediaChannel::Role::kBoth, call_.get(), media_config,
         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());
+    send_channel_ = channel_->AsVideoSendChannel();
+    receive_channel_ = channel_->AsVideoReceiveChannel();
     send_channel_->OnReadyToSend(true);
     receive_channel_->SetReceive(true);
     EXPECT_TRUE(channel_.get() != NULL);
@@ -2002,8 +1994,8 @@
   std::unique_ptr<webrtc::test::FrameForwarder> frame_forwarder_2_;
 
   std::unique_ptr<VideoMediaChannel> channel_;
-  std::unique_ptr<VideoMediaSendChannel> send_channel_;
-  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
+  VideoMediaSendChannelInterface* send_channel_;
+  VideoMediaReceiveChannelInterface* receive_channel_;
   cricket::FakeNetworkInterface network_interface_;
   cricket::FakeVideoRenderer renderer_;
 
@@ -2667,10 +2659,8 @@
         cricket::MediaChannel::Role::kBoth, fake_call_.get(), GetMediaConfig(),
         VideoOptions(), webrtc::CryptoOptions(),
         video_bitrate_allocator_factory_.get()));
-    send_channel_ =
-        std::make_unique<cricket::VideoMediaSendChannel>(channel_.get());
-    receive_channel_ =
-        std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+    send_channel_ = channel_->AsVideoSendChannel();
+    receive_channel_ = channel_->AsVideoReceiveChannel();
     send_channel_->OnReadyToSend(true);
     receive_channel_->SetReceive(true);
     last_ssrc_ = 123;
@@ -3009,8 +2999,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_;
+  VideoMediaSendChannelInterface* send_channel_;
+  VideoMediaReceiveChannelInterface* receive_channel_;
   cricket::VideoSendParameters send_parameters_;
   cricket::VideoRecvParameters recv_parameters_;
   uint32_t last_ssrc_;
@@ -3564,9 +3554,8 @@
       cricket::MediaChannel::Role::kBoth, fake_call_.get(), media_config,
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
-  receive_channel_ =
-      std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+  send_channel_ = channel_->AsVideoSendChannel();
+  receive_channel_ = channel_->AsVideoReceiveChannel();
   send_channel_->OnReadyToSend(true);
 
   channel_->SetSendParameters(send_parameters_);
@@ -3579,9 +3568,8 @@
       cricket::MediaChannel::Role::kBoth, fake_call_.get(), media_config,
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
-  receive_channel_ =
-      std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+  send_channel_ = channel_->AsVideoSendChannel();
+  receive_channel_ = channel_->AsVideoReceiveChannel();
   send_channel_->OnReadyToSend(true);
 
   channel_->SetSendParameters(send_parameters_);
@@ -4124,9 +4112,8 @@
       cricket::MediaChannel::Role::kBoth, fake_call_.get(), media_config,
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
-  receive_channel_ =
-      std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+  send_channel_ = channel_->AsVideoSendChannel();
+  receive_channel_ = channel_->AsVideoReceiveChannel();
 
   send_channel_->OnReadyToSend(true);
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
@@ -4179,9 +4166,8 @@
       cricket::MediaChannel::Role::kBoth, fake_call_.get(), media_config,
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
-  receive_channel_ =
-      std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+  send_channel_ = channel_->AsVideoSendChannel();
+  receive_channel_ = channel_->AsVideoReceiveChannel();
   send_channel_->OnReadyToSend(true);
 
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
@@ -4216,9 +4202,8 @@
       cricket::MediaChannel::Role::kBoth, fake_call_.get(), media_config,
       VideoOptions(), webrtc::CryptoOptions(),
       video_bitrate_allocator_factory_.get()));
-  send_channel_.reset(new VideoMediaSendChannel(channel_.get()));
-  receive_channel_ =
-      std::make_unique<cricket::VideoMediaReceiveChannel>(channel_.get());
+  send_channel_ = channel_->AsVideoSendChannel();
+  receive_channel_ = channel_->AsVideoReceiveChannel();
   send_channel_->OnReadyToSend(true);
 
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
@@ -5549,13 +5534,13 @@
       new cricket::FakeNetworkInterface);
   MediaConfig config;
   std::unique_ptr<cricket::VideoMediaChannel> channel;
-  std::unique_ptr<cricket::VideoMediaSendChannel> send_channel;
+  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.reset(new VideoMediaSendChannel(channel_.get()));
+  send_channel = channel->AsVideoSendChannel();
 
   channel->SetInterface(network_interface.get());
   // Default value when DSCP is disabled should be DSCP_DEFAULT.
@@ -5568,7 +5553,7 @@
   channel.reset(engine_.CreateMediaChannel(
       cricket::MediaChannel::Role::kBoth, call_.get(), config, VideoOptions(),
       webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get()));
-  send_channel.reset(new VideoMediaSendChannel(channel.get()));
+  send_channel = channel->AsVideoSendChannel();
   channel->SetInterface(network_interface.get());
   EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
 
@@ -9511,9 +9496,8 @@
         cricket::MediaChannel::Role::kBoth, &fake_call_, GetMediaConfig(),
         VideoOptions(), webrtc::CryptoOptions(),
         mock_rate_allocator_factory_.get()));
-    send_channel_ = std::make_unique<VideoMediaSendChannel>(channel_.get());
-    receive_channel_ =
-        std::make_unique<VideoMediaReceiveChannel>(channel_.get());
+    send_channel_ = channel_->AsVideoSendChannel();
+    receive_channel_ = channel_->AsVideoReceiveChannel();
     send_channel_->OnReadyToSend(true);
     receive_channel_->SetReceive(true);
     last_ssrc_ = 123;
@@ -9663,8 +9647,8 @@
       mock_rate_allocator_factory_;
   WebRtcVideoEngine engine_;
   std::unique_ptr<VideoMediaChannel> channel_;
-  std::unique_ptr<VideoMediaSendChannel> send_channel_;
-  std::unique_ptr<VideoMediaReceiveChannel> receive_channel_;
+  VideoMediaSendChannelInterface* send_channel_;
+  VideoMediaReceiveChannelInterface* receive_channel_;
   uint32_t last_ssrc_;
 };
 
diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc
index ff6429d..bd19636 100644
--- a/media/engine/webrtc_voice_engine_unittest.cc
+++ b/media/engine/webrtc_voice_engine_unittest.cc
@@ -237,9 +237,8 @@
         cricket::MediaChannel::Role::kBoth, &call_, cricket::MediaConfig(),
         cricket::AudioOptions(), webrtc::CryptoOptions(),
         webrtc::AudioCodecPairId::Create());
-    send_channel_ = std::make_unique<cricket::VoiceMediaSendChannel>(channel_);
-    receive_channel_ =
-        std::make_unique<cricket::VoiceMediaReceiveChannel>(channel_);
+    send_channel_ = channel_->AsVoiceSendChannel();
+    receive_channel_ = channel_->AsVoiceReceiveChannel();
     return (channel_ != nullptr);
   }
 
@@ -832,8 +831,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::VoiceMediaSendChannelInterface* send_channel_;
+  cricket::VoiceMediaReceiveChannelInterface* receive_channel_;
   cricket::AudioSendParameters send_parameters_;
   cricket::AudioRecvParameters recv_parameters_;
   FakeAudioSource fake_source_;
diff --git a/pc/channel.cc b/pc/channel.cc
index f9ee3ff..ba1f175 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -114,14 +114,14 @@
     rtc::Thread* worker_thread,
     rtc::Thread* network_thread,
     rtc::Thread* signaling_thread,
-    std::unique_ptr<MediaChannel> send_media_channel_impl,
-    std::unique_ptr<MediaChannel> receive_media_channel_impl,
+    std::unique_ptr<MediaSendChannelInterface> send_media_channel_impl,
+    std::unique_ptr<MediaReceiveChannelInterface> receive_media_channel_impl,
     absl::string_view mid,
     bool srtp_required,
     webrtc::CryptoOptions crypto_options,
     UniqueRandomIdGenerator* ssrc_generator)
-    : media_send_channel_impl_(std::move(send_media_channel_impl)),
-      media_receive_channel_impl_(std::move(receive_media_channel_impl)),
+    : media_send_channel_(std::move(send_media_channel_impl)),
+      media_receive_channel_(std::move(receive_media_channel_impl)),
       worker_thread_(worker_thread),
       network_thread_(network_thread),
       signaling_thread_(signaling_thread),
@@ -134,8 +134,8 @@
       demuxer_criteria_(mid),
       ssrc_generator_(ssrc_generator) {
   RTC_DCHECK_RUN_ON(worker_thread_);
-  RTC_DCHECK(media_send_channel_impl_);
-  RTC_DCHECK(media_receive_channel_impl_);
+  RTC_DCHECK(media_send_channel_);
+  RTC_DCHECK(media_receive_channel_);
   RTC_DCHECK(ssrc_generator_);
   RTC_DLOG(LS_INFO) << "Created channel: " << ToString();
 }
@@ -143,12 +143,12 @@
 BaseChannel::BaseChannel(rtc::Thread* worker_thread,
                          rtc::Thread* network_thread,
                          rtc::Thread* signaling_thread,
-                         std::unique_ptr<MediaChannel> media_channel_impl,
+                         std::unique_ptr<MediaChannel> media_channel,
                          absl::string_view mid,
                          bool srtp_required,
                          webrtc::CryptoOptions crypto_options,
                          UniqueRandomIdGenerator* ssrc_generator)
-    : media_channel_impl_(std::move(media_channel_impl)),
+    : media_channel_(std::move(media_channel)),
       worker_thread_(worker_thread),
       network_thread_(network_thread),
       signaling_thread_(signaling_thread),
@@ -161,7 +161,7 @@
       demuxer_criteria_(mid),
       ssrc_generator_(ssrc_generator) {
   RTC_DCHECK_RUN_ON(worker_thread_);
-  RTC_DCHECK(media_channel_impl_);
+  RTC_DCHECK(media_channel_);
   RTC_DCHECK(ssrc_generator_);
   RTC_DLOG(LS_INFO) << "Created channel: " << ToString();
 }
@@ -178,14 +178,14 @@
 }
 
 std::string BaseChannel::ToString() const {
-  if (media_send_channel_impl_) {
+  if (media_send_channel_) {
     return StringFormat(
         "{mid: %s, media_type: %s}", mid().c_str(),
-        MediaTypeToString(media_send_channel_impl_->media_type()).c_str());
+        MediaTypeToString(media_send_channel_->media_type()).c_str());
   } else {
     return StringFormat(
         "{mid: %s, media_type: %s}", mid().c_str(),
-        MediaTypeToString(media_channel_impl_->media_type()).c_str());
+        MediaTypeToString(media_channel_->media_type()).c_str());
   }
 }
 
@@ -850,8 +850,8 @@
     rtc::Thread* worker_thread,
     rtc::Thread* network_thread,
     rtc::Thread* signaling_thread,
-    std::unique_ptr<VoiceMediaChannel> media_send_channel_impl,
-    std::unique_ptr<VoiceMediaChannel> media_receive_channel_impl,
+    std::unique_ptr<VoiceMediaSendChannelInterface> media_send_channel,
+    std::unique_ptr<VoiceMediaReceiveChannelInterface> media_receive_channel,
     absl::string_view mid,
     bool srtp_required,
     webrtc::CryptoOptions crypto_options,
@@ -859,14 +859,12 @@
     : BaseChannel(worker_thread,
                   network_thread,
                   signaling_thread,
-                  std::move(media_send_channel_impl),
-                  std::move(media_receive_channel_impl),
+                  std::move(media_send_channel),
+                  std::move(media_receive_channel),
                   mid,
                   srtp_required,
                   crypto_options,
-                  ssrc_generator),
-      send_channel_(media_send_channel_impl_->AsVoiceChannel()),
-      receive_channel_(media_receive_channel_impl_->AsVoiceChannel()) {}
+                  ssrc_generator) {}
 
 VoiceChannel::VoiceChannel(
     rtc::Thread* worker_thread,
@@ -884,9 +882,7 @@
                   mid,
                   srtp_required,
                   crypto_options,
-                  ssrc_generator),
-      send_channel_(media_channel_impl_->AsVoiceChannel()),
-      receive_channel_(media_channel_impl_->AsVoiceChannel()) {
+                  ssrc_generator) {
   InitCallback();
 }
 
@@ -900,12 +896,13 @@
   RTC_DCHECK_RUN_ON(worker_thread());
   // TODO(bugs.webrtc.org/13931): Remove when values are set
   // in a more sensible fashion
-  send_channel_.SetSendCodecChangedCallback([this]() {
+  send_channel()->SetSendCodecChangedCallback([this]() {
     RTC_DCHECK_RUN_ON(worker_thread());
     // Adjust receive streams based on send codec.
-    receive_channel_.SetReceiveNackEnabled(send_channel_.SendCodecHasNack());
-    receive_channel_.SetReceiveNonSenderRttEnabled(
-        send_channel_.SenderNonSenderRttEnabled());
+    receive_channel()->SetReceiveNackEnabled(
+        send_channel()->SendCodecHasNack());
+    receive_channel()->SetReceiveNonSenderRttEnabled(
+        send_channel()->SenderNonSenderRttEnabled());
   });
 }
 void VoiceChannel::UpdateMediaSendRecvState_w() {
@@ -1019,8 +1016,8 @@
     rtc::Thread* worker_thread,
     rtc::Thread* network_thread,
     rtc::Thread* signaling_thread,
-    std::unique_ptr<VideoMediaChannel> media_send_channel_impl,
-    std::unique_ptr<VideoMediaChannel> media_receive_channel_impl,
+    std::unique_ptr<VideoMediaSendChannelInterface> media_send_channel,
+    std::unique_ptr<VideoMediaReceiveChannelInterface> media_receive_channel,
     absl::string_view mid,
     bool srtp_required,
     webrtc::CryptoOptions crypto_options,
@@ -1028,25 +1025,21 @@
     : BaseChannel(worker_thread,
                   network_thread,
                   signaling_thread,
-                  std::move(media_send_channel_impl),
-                  std::move(media_receive_channel_impl),
+                  std::move(media_send_channel),
+                  std::move(media_receive_channel),
                   mid,
                   srtp_required,
                   crypto_options,
-                  ssrc_generator),
-      send_channel_(media_send_channel_impl_->AsVideoChannel()),
-      receive_channel_(media_receive_channel_impl_->AsVideoChannel()) {
+                  ssrc_generator) {
   // TODO(bugs.webrtc.org/13931): Remove when values are set
   // in a more sensible fashion
-  media_send_channel_impl_->AsVideoChannel()->SetSendCodecChangedCallback(
-      [this]() {
-        // Adjust receive streams based on send codec.
-        media_receive_channel()->SetReceiverFeedbackParameters(
-            media_send_channel()->SendCodecHasLntf(),
-            media_send_channel()->SendCodecHasNack(),
-            media_send_channel()->SendCodecRtcpMode(),
-            media_send_channel()->SendCodecRtxTime());
-      });
+  send_channel()->SetSendCodecChangedCallback([this]() {
+    // Adjust receive streams based on send codec.
+    receive_channel()->SetReceiverFeedbackParameters(
+        send_channel()->SendCodecHasLntf(), send_channel()->SendCodecHasNack(),
+        send_channel()->SendCodecRtcpMode(),
+        send_channel()->SendCodecRtxTime());
+  });
 }
 VideoChannel::VideoChannel(
     rtc::Thread* worker_thread,
@@ -1064,9 +1057,7 @@
                   mid,
                   srtp_required,
                   crypto_options,
-                  ssrc_generator),
-      send_channel_(media_channel_impl_->AsVideoChannel()),
-      receive_channel_(media_channel_impl_->AsVideoChannel()) {}
+                  ssrc_generator) {}
 
 VideoChannel::~VideoChannel() {
   TRACE_EVENT0("webrtc", "VideoChannel::~VideoChannel");
diff --git a/pc/channel.h b/pc/channel.h
index 89af890..e082c2d 100644
--- a/pc/channel.h
+++ b/pc/channel.h
@@ -84,15 +84,16 @@
   // which will make it easier to change the constructor.
 
   // Constructor for use when the MediaChannels are split
-  BaseChannel(rtc::Thread* worker_thread,
-              rtc::Thread* network_thread,
-              rtc::Thread* signaling_thread,
-              std::unique_ptr<MediaChannel> media_send_channel_impl,
-              std::unique_ptr<MediaChannel> media_receive_channel_impl,
-              absl::string_view mid,
-              bool srtp_required,
-              webrtc::CryptoOptions crypto_options,
-              rtc::UniqueRandomIdGenerator* ssrc_generator);
+  BaseChannel(
+      rtc::Thread* worker_thread,
+      rtc::Thread* network_thread,
+      rtc::Thread* signaling_thread,
+      std::unique_ptr<MediaSendChannelInterface> media_send_channel,
+      std::unique_ptr<MediaReceiveChannelInterface> media_receive_channel,
+      absl::string_view mid,
+      bool srtp_required,
+      webrtc::CryptoOptions crypto_options,
+      rtc::UniqueRandomIdGenerator* ssrc_generator);
   // Constructor for use when the MediaChannel is not split
   // TODO(bugs.webrtc.org/13931): Delete when split channel project is complete.
   BaseChannel(rtc::Thread* worker_thread,
@@ -315,16 +316,15 @@
   // Return description of media channel to facilitate logging
   std::string ToString() const;
 
-  // MediaChannel related members that should be accessed from the worker
-  // thread. These are used in initializing the subclasses and deleting
-  // the channels when exiting; they have no accessors.
-  // Either the media_channel_impl_ is set, or the media_send_channel_impl_
-  // and the media_receive_channel_impl_ is set.
-  // TODO(bugs.webrtc.org/13931): Delete when split channel project is complete.
-  const std::unique_ptr<MediaChannel> media_channel_impl_;
+  // MediaChannel implementation pointers.
+  // Either the `media_channel_` is set, or the `media_send_channel_`
+  // and the `media_receive_channel_` is set.
+  // TODO(bugs.webrtc.org/13931): Delete `media_channel_` when split channel
+  // project is complete.
+  const std::unique_ptr<MediaChannel> media_channel_;
 
-  const std::unique_ptr<MediaChannel> media_send_channel_impl_;
-  const std::unique_ptr<MediaChannel> media_receive_channel_impl_;
+  const std::unique_ptr<MediaSendChannelInterface> media_send_channel_;
+  const std::unique_ptr<MediaReceiveChannelInterface> media_receive_channel_;
 
  private:
   bool ConnectToRtpTransport_n() RTC_RUN_ON(network_thread());
@@ -386,15 +386,16 @@
 // and input/output level monitoring.
 class VoiceChannel : public BaseChannel {
  public:
-  VoiceChannel(rtc::Thread* worker_thread,
-               rtc::Thread* network_thread,
-               rtc::Thread* signaling_thread,
-               std::unique_ptr<VoiceMediaChannel> send_channel_impl,
-               std::unique_ptr<VoiceMediaChannel> receive_channel_impl,
-               absl::string_view mid,
-               bool srtp_required,
-               webrtc::CryptoOptions crypto_options,
-               rtc::UniqueRandomIdGenerator* ssrc_generator);
+  VoiceChannel(
+      rtc::Thread* worker_thread,
+      rtc::Thread* network_thread,
+      rtc::Thread* signaling_thread,
+      std::unique_ptr<VoiceMediaSendChannelInterface> send_channel_impl,
+      std::unique_ptr<VoiceMediaReceiveChannelInterface> receive_channel_impl,
+      absl::string_view mid,
+      bool srtp_required,
+      webrtc::CryptoOptions crypto_options,
+      rtc::UniqueRandomIdGenerator* ssrc_generator);
   // Constructor for use when the MediaChannel is not split
   // TODO(bugs.webrtc.org/13931): Delete when split channel project is complete.
   VoiceChannel(rtc::Thread* worker_thread,
@@ -414,20 +415,34 @@
   }
   VoiceChannel* AsVoiceChannel() override { return this; }
 
+  VoiceMediaSendChannelInterface* send_channel() {
+    if (media_send_channel_) {
+      return media_send_channel_->AsVoiceSendChannel();
+    }
+    return media_channel_->AsVoiceSendChannel();
+  }
+
+  VoiceMediaReceiveChannelInterface* receive_channel() {
+    if (media_receive_channel_) {
+      return media_receive_channel_->AsVoiceReceiveChannel();
+    }
+    return media_channel_->AsVoiceReceiveChannel();
+  }
+
   VoiceMediaSendChannelInterface* media_send_channel() override {
-    return &send_channel_;
+    return send_channel();
   }
 
   VoiceMediaSendChannelInterface* voice_media_send_channel() override {
-    return &send_channel_;
+    return send_channel();
   }
 
   VoiceMediaReceiveChannelInterface* media_receive_channel() override {
-    return &receive_channel_;
+    return receive_channel();
   }
 
   VoiceMediaReceiveChannelInterface* voice_media_receive_channel() override {
-    return &receive_channel_;
+    return receive_channel();
   }
 
   cricket::MediaType media_type() const override {
@@ -447,8 +462,6 @@
                           std::string& error_desc)
       RTC_RUN_ON(worker_thread()) override;
 
-  VoiceMediaSendChannel send_channel_ RTC_GUARDED_BY(worker_thread());
-  VoiceMediaReceiveChannel receive_channel_ RTC_GUARDED_BY(worker_thread());
   // Last AudioSendParameters sent down to the media_channel() via
   // SetSendParameters.
   AudioSendParameters last_send_params_ RTC_GUARDED_BY(worker_thread());
@@ -460,15 +473,16 @@
 // VideoChannel is a specialization for video.
 class VideoChannel : public BaseChannel {
  public:
-  VideoChannel(rtc::Thread* worker_thread,
-               rtc::Thread* network_thread,
-               rtc::Thread* signaling_thread,
-               std::unique_ptr<VideoMediaChannel> media_send_channel_impl,
-               std::unique_ptr<VideoMediaChannel> media_receive_channel_impl,
-               absl::string_view mid,
-               bool srtp_required,
-               webrtc::CryptoOptions crypto_options,
-               rtc::UniqueRandomIdGenerator* ssrc_generator);
+  VideoChannel(
+      rtc::Thread* worker_thread,
+      rtc::Thread* network_thread,
+      rtc::Thread* signaling_thread,
+      std::unique_ptr<VideoMediaSendChannelInterface> media_send_channel,
+      std::unique_ptr<VideoMediaReceiveChannelInterface> media_receive_channel,
+      absl::string_view mid,
+      bool srtp_required,
+      webrtc::CryptoOptions crypto_options,
+      rtc::UniqueRandomIdGenerator* ssrc_generator);
   // Constructor for use when the MediaChannel is not split
   // TODO(bugs.webrtc.org/13931): Delete when split channel project is complete.
   VideoChannel(rtc::Thread* worker_thread,
@@ -487,20 +501,34 @@
     return nullptr;
   }
 
+  VideoMediaSendChannelInterface* send_channel() {
+    if (media_send_channel_) {
+      return media_send_channel_->AsVideoSendChannel();
+    }
+    return media_channel_->AsVideoSendChannel();
+  }
+
+  VideoMediaReceiveChannelInterface* receive_channel() {
+    if (media_receive_channel_) {
+      return media_receive_channel_->AsVideoReceiveChannel();
+    }
+    return media_channel_->AsVideoReceiveChannel();
+  }
+
   VideoMediaSendChannelInterface* media_send_channel() override {
-    return &send_channel_;
+    return send_channel();
   }
 
   VideoMediaSendChannelInterface* video_media_send_channel() override {
-    return &send_channel_;
+    return send_channel();
   }
 
   VideoMediaReceiveChannelInterface* media_receive_channel() override {
-    return &receive_channel_;
+    return receive_channel();
   }
 
   VideoMediaReceiveChannelInterface* video_media_receive_channel() override {
-    return &receive_channel_;
+    return receive_channel();
   }
 
   cricket::MediaType media_type() const override {
@@ -519,8 +547,6 @@
                           std::string& error_desc)
       RTC_RUN_ON(worker_thread()) override;
 
-  VideoMediaSendChannel send_channel_ RTC_GUARDED_BY(worker_thread());
-  VideoMediaReceiveChannel receive_channel_ RTC_GUARDED_BY(worker_thread());
   // Last VideoSendParameters sent down to the media_channel() via
   // SetSendParameters.
   VideoSendParameters last_send_params_ RTC_GUARDED_BY(worker_thread());
diff --git a/pc/channel_unittest.cc b/pc/channel_unittest.cc
index 06da2f0..2867629 100644
--- a/pc/channel_unittest.cc
+++ b/pc/channel_unittest.cc
@@ -1476,29 +1476,28 @@
   // T::MediaChannel is either FakeVoiceMediaChannel or FakeVideoMediaChannel.
   typename T::MediaChannel* media_send_channel1_impl() {
     RTC_DCHECK(channel1_);
-    RTC_DCHECK(channel1_->media_send_channel());
     return static_cast<typename T::MediaChannel*>(
-        channel1_->media_send_channel()->ImplForTesting());
+        channel1_->media_send_channel());
   }
 
   typename T::MediaChannel* media_send_channel2_impl() {
     RTC_DCHECK(channel2_);
     RTC_DCHECK(channel2_->media_send_channel());
     return static_cast<typename T::MediaChannel*>(
-        channel2_->media_send_channel()->ImplForTesting());
+        channel2_->media_send_channel());
   }
   typename T::MediaChannel* media_receive_channel1_impl() {
     RTC_DCHECK(channel1_);
     RTC_DCHECK(channel1_->media_receive_channel());
     return static_cast<typename T::MediaChannel*>(
-        channel1_->media_receive_channel()->ImplForTesting());
+        channel1_->media_receive_channel());
   }
 
   typename T::MediaChannel* media_receive_channel2_impl() {
     RTC_DCHECK(channel2_);
     RTC_DCHECK(channel2_->media_receive_channel());
     return static_cast<typename T::MediaChannel*>(
-        channel2_->media_receive_channel()->ImplForTesting());
+        channel2_->media_receive_channel());
   }
 
   rtc::AutoThread main_thread_;
diff --git a/pc/rtp_sender_receiver_unittest.cc b/pc/rtp_sender_receiver_unittest.cc
index 2d8a1e8..1552982 100644
--- a/pc/rtp_sender_receiver_unittest.cc
+++ b/pc/rtp_sender_receiver_unittest.cc
@@ -149,10 +149,8 @@
     RTC_CHECK(voice_media_receive_channel());
     RTC_CHECK(video_media_receive_channel());
     // Create sender channel objects
-    voice_send_channel_ = std::make_unique<cricket::VoiceMediaSendChannel>(
-        voice_media_send_channel());
-    video_send_channel_ = std::make_unique<cricket::VideoMediaSendChannel>(
-        video_media_send_channel());
+    voice_send_channel_ = voice_media_send_channel()->AsVoiceSendChannel();
+    video_send_channel_ = video_media_send_channel()->AsVideoSendChannel();
 
     // Create streams for predefined SSRCs. Streams need to exist in order
     // for the senders and receievers to apply parameters to them.
@@ -227,7 +225,7 @@
     ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
     EXPECT_CALL(*set_streams_observer, OnSetStreams());
     audio_rtp_sender_->SetStreams({local_stream_->id()});
-    audio_rtp_sender_->SetMediaChannel(voice_send_channel_.get());
+    audio_rtp_sender_->SetMediaChannel(voice_send_channel_);
     audio_rtp_sender_->SetSsrc(kAudioSsrc);
     VerifyVoiceChannelInput();
   }
@@ -554,8 +552,8 @@
   std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_send_channel_;
   std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_receive_channel_;
   std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_receive_channel_;
-  std::unique_ptr<cricket::VoiceMediaSendChannel> voice_send_channel_;
-  std::unique_ptr<cricket::VideoMediaSendChannel> video_send_channel_;
+  cricket::VoiceMediaSendChannelInterface* voice_send_channel_;
+  cricket::VideoMediaSendChannelInterface* video_send_channel_;
   rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
   rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
   rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;