Reland of Don't hardcode MediaType::ANY in FakeNetworkPipe. (patchset #1 id:1 of https://codereview.webrtc.org/2784543002/ )

Reason for revert:
Intend to fix perf failures and reland.

Original issue's description:
> Revert of Don't hardcode MediaType::ANY in FakeNetworkPipe. (patchset #4 id:60001 of https://codereview.webrtc.org/2774463003/ )
>
> Reason for revert:
> Reverting since this seems to break multiple WebRTC Perf buildbots
>
> Original issue's description:
> > Don't hardcode MediaType::ANY in FakeNetworkPipe.
> >
> > Instead let each test set the appropriate media type. This simplifies
> > demuxing in Call and later in RtpTransportController.
> >
> > BUG=webrtc:7135
> >
> > Review-Url: https://codereview.webrtc.org/2774463003
> > Cr-Commit-Position: refs/heads/master@{#17418}
> > Committed: https://chromium.googlesource.com/external/webrtc/+/9c47b00e24da2941eb095df5a4459c6d98a8a88d
>
> TBR=stefan@webrtc.org,deadbeef@webrtc.org,solenberg@webrtc.org,pbos@webrtc.org,sprang@webrtc.org,nisse@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:7135
>
> Review-Url: https://codereview.webrtc.org/2784543002
> Cr-Commit-Position: refs/heads/master@{#17427}
> Committed: https://chromium.googlesource.com/external/webrtc/+/3a3bd5061089da5327fc549337a8430054d66057

TBR=stefan@webrtc.org,deadbeef@webrtc.org,solenberg@webrtc.org,pbos@webrtc.org,sprang@webrtc.org,lliuu@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:7135

Review-Url: https://codereview.webrtc.org/2783853002
Cr-Commit-Position: refs/heads/master@{#17459}
diff --git a/webrtc/audio/test/low_bandwidth_audio_test.cc b/webrtc/audio/test/low_bandwidth_audio_test.cc
index c1b1a02..50d7e67 100644
--- a/webrtc/audio/test/low_bandwidth_audio_test.cc
+++ b/webrtc/audio/test/low_bandwidth_audio_test.cc
@@ -80,12 +80,14 @@
     Call* sender_call) {
   return new test::PacketTransport(
       sender_call, this, test::PacketTransport::kSender,
+      MediaType::AUDIO,
       GetNetworkPipeConfig());
 }
 
 test::PacketTransport* AudioQualityTest::CreateReceiveTransport() {
   return new test::PacketTransport(nullptr, this,
-      test::PacketTransport::kReceiver, GetNetworkPipeConfig());
+      test::PacketTransport::kReceiver, MediaType::AUDIO,
+      GetNetworkPipeConfig());
 }
 
 void AudioQualityTest::ModifyAudioConfigs(
diff --git a/webrtc/call/bitrate_estimator_tests.cc b/webrtc/call/bitrate_estimator_tests.cc
index bb4960f..00a3b9e 100644
--- a/webrtc/call/bitrate_estimator_tests.cc
+++ b/webrtc/call/bitrate_estimator_tests.cc
@@ -108,9 +108,11 @@
     receiver_call_.reset(Call::Create(config));
     sender_call_.reset(Call::Create(config));
 
-    send_transport_.reset(new test::DirectTransport(sender_call_.get()));
+    send_transport_.reset(
+        new test::DirectTransport(sender_call_.get(), MediaType::VIDEO));
     send_transport_->SetReceiver(receiver_call_->Receiver());
-    receive_transport_.reset(new test::DirectTransport(receiver_call_.get()));
+    receive_transport_.reset(
+        new test::DirectTransport(receiver_call_.get(), MediaType::VIDEO));
     receive_transport_->SetReceiver(sender_call_->Receiver());
 
     video_send_config_ = VideoSendStream::Config(send_transport_.get());
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc
index 94acc9f..396d3c9 100644
--- a/webrtc/call/call.cc
+++ b/webrtc/call/call.cc
@@ -1221,6 +1221,8 @@
                                                 const PacketTime& packet_time) {
   TRACE_EVENT0("webrtc", "Call::DeliverRtp");
 
+  RTC_DCHECK(media_type == MediaType::AUDIO || media_type == MediaType::VIDEO);
+
   ReadLockScoped read_lock(*receive_crit_);
   // TODO(nisse): We should parse the RTP header only here, and pass
   // on parsed_packet to the receive streams.
@@ -1234,7 +1236,7 @@
 
   uint32_t ssrc = parsed_packet->Ssrc();
 
-  if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) {
+  if (media_type == MediaType::AUDIO) {
     auto it = audio_receive_ssrcs_.find(ssrc);
     if (it != audio_receive_ssrcs_.end()) {
       received_bytes_per_second_counter_.Add(static_cast<int>(length));
@@ -1244,7 +1246,7 @@
       return DELIVERY_OK;
     }
   }
-  if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
+  if (media_type == MediaType::VIDEO) {
     auto it = video_receive_ssrcs_.find(ssrc);
     if (it != video_receive_ssrcs_.end()) {
       received_bytes_per_second_counter_.Add(static_cast<int>(length));
@@ -1260,7 +1262,7 @@
       return DELIVERY_OK;
     }
   }
-  if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
+  if (media_type == MediaType::VIDEO) {
     received_bytes_per_second_counter_.Add(static_cast<int>(length));
     // TODO(brandtr): Update here when FlexFEC supports protecting audio.
     received_video_bytes_per_second_counter_.Add(static_cast<int>(length));
@@ -1320,10 +1322,7 @@
     return;
   }
   // For audio, we only support send side BWE.
-  // TODO(nisse): Tests passes MediaType::ANY, see
-  // FakeNetworkPipe::Process. We need to treat that as video. Tests
-  // should be fixed to use the same MediaType as the production code.
-  if (media_type != MediaType::AUDIO ||
+  if (media_type == MediaType::VIDEO ||
       (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) {
     receive_side_cc_.OnReceivedPacket(
         packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(),
diff --git a/webrtc/call/call_perf_tests.cc b/webrtc/call/call_perf_tests.cc
index bd5ab0f..d62bec1 100644
--- a/webrtc/call/call_perf_tests.cc
+++ b/webrtc/call/call_perf_tests.cc
@@ -193,6 +193,7 @@
   audio_net_config.loss_percent = 5;
   test::PacketTransport audio_send_transport(sender_call_.get(), &observer,
                                              test::PacketTransport::kSender,
+                                             MediaType::AUDIO,
                                              audio_net_config);
   MediaTypePacketReceiver audio_receiver(receiver_call_->Receiver(),
                                          MediaType::AUDIO);
@@ -200,6 +201,7 @@
 
   test::PacketTransport video_send_transport(sender_call_.get(), &observer,
                                              test::PacketTransport::kSender,
+                                             MediaType::VIDEO,
                                              FakeNetworkPipe::Config());
   MediaTypePacketReceiver video_receiver(receiver_call_->Receiver(),
                                          MediaType::VIDEO);
@@ -207,6 +209,7 @@
 
   test::PacketTransport receive_transport(
       receiver_call_.get(), &observer, test::PacketTransport::kReceiver,
+      MediaType::VIDEO,
       FakeNetworkPipe::Config());
   receive_transport.SetReceiver(sender_call_->Receiver());
 
@@ -343,12 +346,14 @@
    private:
     test::PacketTransport* CreateSendTransport(Call* sender_call) override {
       return new test::PacketTransport(
-          sender_call, this, test::PacketTransport::kSender, net_config_);
+          sender_call, this, test::PacketTransport::kSender, MediaType::VIDEO,
+          net_config_);
     }
 
     test::PacketTransport* CreateReceiveTransport() override {
       return new test::PacketTransport(
-          nullptr, this, test::PacketTransport::kReceiver, net_config_);
+          nullptr, this, test::PacketTransport::kReceiver, MediaType::VIDEO,
+          net_config_);
     }
 
     void OnFrame(const VideoFrame& video_frame) override {
diff --git a/webrtc/call/rampup_tests.cc b/webrtc/call/rampup_tests.cc
index 292edc6..0a2a738 100644
--- a/webrtc/call/rampup_tests.cc
+++ b/webrtc/call/rampup_tests.cc
@@ -89,13 +89,34 @@
   send_stream_ = send_stream;
 }
 
+MediaType RampUpTester::SelectMediaType() {
+  if (num_video_streams_ > 0) {
+    if (num_audio_streams_ > 0) {
+      // Rely on call to set media type from payload type.
+      return MediaType::ANY;
+    } else {
+      return MediaType::VIDEO;
+    }
+  } else {
+    return MediaType::AUDIO;
+  }
+}
+
 test::PacketTransport* RampUpTester::CreateSendTransport(Call* sender_call) {
   send_transport_ = new test::PacketTransport(sender_call, this,
                                               test::PacketTransport::kSender,
+                                              SelectMediaType(),
                                               forward_transport_config_);
   return send_transport_;
 }
 
+test::PacketTransport* RampUpTester::CreateReceiveTransport() {
+  return new test::PacketTransport(nullptr, this,
+                                   test::PacketTransport::kReceiver,
+                                   SelectMediaType(),
+                                   FakeNetworkPipe::Config());
+}
+
 size_t RampUpTester::GetNumVideoStreams() const {
   return num_video_streams_;
 }
diff --git a/webrtc/call/rampup_tests.h b/webrtc/call/rampup_tests.h
index 6710dd1..5b24536 100644
--- a/webrtc/call/rampup_tests.h
+++ b/webrtc/call/rampup_tests.h
@@ -84,7 +84,9 @@
   void OnVideoStreamsCreated(
       VideoSendStream* send_stream,
       const std::vector<VideoReceiveStream*>& receive_streams) override;
+  MediaType SelectMediaType();
   test::PacketTransport* CreateSendTransport(Call* sender_call) override;
+  test::PacketTransport* CreateReceiveTransport() override;
   void ModifyVideoConfigs(
       VideoSendStream::Config* send_config,
       std::vector<VideoReceiveStream::Config>* receive_configs,
diff --git a/webrtc/media/engine/fakewebrtccall.cc b/webrtc/media/engine/fakewebrtccall.cc
index 9a05ae6..f442a3c 100644
--- a/webrtc/media/engine/fakewebrtccall.cc
+++ b/webrtc/media/engine/fakewebrtccall.cc
@@ -520,19 +520,20 @@
     size_t length,
     const webrtc::PacketTime& packet_time) {
   EXPECT_GE(length, 12u);
+  RTC_DCHECK(media_type == webrtc::MediaType::AUDIO ||
+             media_type == webrtc::MediaType::VIDEO);
+
   uint32_t ssrc;
   if (!GetRtpSsrc(packet, length, &ssrc))
     return DELIVERY_PACKET_ERROR;
 
-  if (media_type == webrtc::MediaType::ANY ||
-      media_type == webrtc::MediaType::VIDEO) {
+  if (media_type == webrtc::MediaType::VIDEO) {
     for (auto receiver : video_receive_streams_) {
       if (receiver->GetConfig().rtp.remote_ssrc == ssrc)
         return DELIVERY_OK;
     }
   }
-  if (media_type == webrtc::MediaType::ANY ||
-      media_type == webrtc::MediaType::AUDIO) {
+  if (media_type == webrtc::MediaType::AUDIO) {
     for (auto receiver : audio_receive_streams_) {
       if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
         receiver->DeliverRtp(packet, length, packet_time);
diff --git a/webrtc/test/call_test.cc b/webrtc/test/call_test.cc
index 3a13eee..75595ab 100644
--- a/webrtc/test/call_test.cc
+++ b/webrtc/test/call_test.cc
@@ -26,6 +26,29 @@
 const int kVideoRotationRtpExtensionId = 4;
 }
 
+void CallTest::PayloadDemuxer::SetReceiver(PacketReceiver* receiver) {
+  receiver_ = receiver;
+}
+
+PacketReceiver::DeliveryStatus CallTest::PayloadDemuxer::DeliverPacket(
+    MediaType media_type,
+    const uint8_t* packet,
+    size_t length,
+    const PacketTime& packet_time) {
+  if (media_type == MediaType::ANY) {
+    // This simplistic demux logic will not make much sense for RTCP
+    // packets, but it seems that doesn't matter.
+    RTC_CHECK_GE(length, 2);
+    uint8_t pt = packet[1] & 0x7f;
+    if (pt == kFakeVideoSendPayloadType || pt == kFlexfecPayloadType) {
+      media_type = MediaType::VIDEO;
+    } else {
+      media_type = MediaType::AUDIO;
+    }
+  }
+  return receiver_->DeliverPacket(media_type, packet, length, packet_time);
+}
+
 CallTest::CallTest()
     : clock_(Clock::GetRealTimeClock()),
       video_send_config_(nullptr),
@@ -75,8 +98,20 @@
   send_transport_.reset(test->CreateSendTransport(sender_call_.get()));
 
   if (test->ShouldCreateReceivers()) {
-    send_transport_->SetReceiver(receiver_call_->Receiver());
-    receive_transport_->SetReceiver(sender_call_->Receiver());
+    // For tests using only video or only audio, we rely on each test
+    // configuring the underlying FakeNetworkPipe with the right media
+    // type. But for tests sending both video and audio over the same
+    // FakeNetworkPipe, we need to "demux", i.e., setting the
+    // MediaType based on RTP payload type.
+    if (num_video_streams_ > 0 && num_audio_streams_ > 0) {
+      receive_demuxer_.SetReceiver(receiver_call_->Receiver());
+      send_transport_->SetReceiver(&receive_demuxer_);
+      send_demuxer_.SetReceiver(sender_call_->Receiver());
+      receive_transport_->SetReceiver(&send_demuxer_);
+    } else {
+      send_transport_->SetReceiver(receiver_call_->Receiver());
+      receive_transport_->SetReceiver(sender_call_->Receiver());
+    }
     if (num_video_streams_ > 0)
       receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
     if (num_audio_streams_ > 0)
@@ -459,11 +494,13 @@
 
 test::PacketTransport* BaseTest::CreateSendTransport(Call* sender_call) {
   return new PacketTransport(sender_call, this, test::PacketTransport::kSender,
+                             MediaType::VIDEO,
                              FakeNetworkPipe::Config());
 }
 
 test::PacketTransport* BaseTest::CreateReceiveTransport() {
   return new PacketTransport(nullptr, this, test::PacketTransport::kReceiver,
+                             MediaType::VIDEO,
                              FakeNetworkPipe::Config());
 }
 
diff --git a/webrtc/test/call_test.h b/webrtc/test/call_test.h
index 78fbbfb..b4f6658 100644
--- a/webrtc/test/call_test.h
+++ b/webrtc/test/call_test.h
@@ -59,6 +59,23 @@
   static const int kNackRtpHistoryMs;
 
  protected:
+  // Needed for tests sending both audio and video on the same
+  // FakeNetworkPipe. We then need to set correct MediaType based on
+  // packet payload type, before passing the packet on to Call.
+  class PayloadDemuxer : public PacketReceiver {
+   public:
+    PayloadDemuxer() = default;
+
+    void SetReceiver(PacketReceiver* receiver);
+    DeliveryStatus DeliverPacket(MediaType media_type,
+                                 const uint8_t* packet,
+                                 size_t length,
+                                 const PacketTime& packet_time) override;
+
+   private:
+    PacketReceiver* receiver_ = nullptr;
+  };
+
   // RunBaseTest overwrites the audio_state and the voice_engine of the send and
   // receive Call configs to simplify test code and avoid having old VoiceEngine
   // APIs in the tests.
@@ -124,6 +141,9 @@
   rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
   test::FakeVideoRenderer fake_renderer_;
 
+  PayloadDemuxer receive_demuxer_;
+  PayloadDemuxer send_demuxer_;
+
  private:
   // TODO(holmer): Remove once VoiceEngine is fully refactored to the new API.
   // These methods are used to set up legacy voice engines and channels which is
@@ -172,6 +192,7 @@
   virtual Call::Config GetReceiverCallConfig();
   virtual void OnCallsCreated(Call* sender_call, Call* receiver_call);
 
+  // The default implementation creates MediaType::VIDEO transports.
   virtual test::PacketTransport* CreateSendTransport(Call* sender_call);
   virtual test::PacketTransport* CreateReceiveTransport();
 
diff --git a/webrtc/test/direct_transport.cc b/webrtc/test/direct_transport.cc
index 922874d..90531ea 100644
--- a/webrtc/test/direct_transport.cc
+++ b/webrtc/test/direct_transport.cc
@@ -15,17 +15,17 @@
 namespace webrtc {
 namespace test {
 
-DirectTransport::DirectTransport(Call* send_call)
-    : DirectTransport(FakeNetworkPipe::Config(), send_call) {}
+DirectTransport::DirectTransport(Call* send_call, MediaType media_type)
+    : DirectTransport(FakeNetworkPipe::Config(), send_call, media_type) {}
 
 DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
-                                 Call* send_call)
+                                 Call* send_call, MediaType media_type)
     : send_call_(send_call),
       packet_event_(false, false),
       thread_(NetworkProcess, this, "NetworkProcess"),
       clock_(Clock::GetRealTimeClock()),
       shutting_down_(false),
-      fake_network_(clock_, config) {
+      fake_network_(clock_, config, media_type) {
   thread_.Start();
   if (send_call_) {
     send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
diff --git a/webrtc/test/direct_transport.h b/webrtc/test/direct_transport.h
index eb552c5..20a6857 100644
--- a/webrtc/test/direct_transport.h
+++ b/webrtc/test/direct_transport.h
@@ -18,11 +18,11 @@
 #include "webrtc/base/criticalsection.h"
 #include "webrtc/base/event.h"
 #include "webrtc/base/platform_thread.h"
+#include "webrtc/call/call.h"
 #include "webrtc/test/fake_network_pipe.h"
 
 namespace webrtc {
 
-class Call;
 class Clock;
 class PacketReceiver;
 
@@ -30,8 +30,17 @@
 
 class DirectTransport : public Transport {
  public:
-  explicit DirectTransport(Call* send_call);
-  DirectTransport(const FakeNetworkPipe::Config& config, Call* send_call);
+  DirectTransport(Call* send_call, MediaType media_type);
+  DirectTransport(const FakeNetworkPipe::Config& config, Call* send_call,
+                  MediaType media_type);
+  // These deprecated variants always use MediaType::VIDEO.
+  RTC_DEPRECATED explicit DirectTransport(Call* send_call)
+      : DirectTransport(send_call, MediaType::VIDEO) {}
+
+  RTC_DEPRECATED DirectTransport(const FakeNetworkPipe::Config& config,
+                                 Call* send_call)
+      : DirectTransport(config, send_call, MediaType::VIDEO) {}
+
   ~DirectTransport();
 
   void SetConfig(const FakeNetworkPipe::Config& config);
diff --git a/webrtc/test/fake_network_pipe.cc b/webrtc/test/fake_network_pipe.cc
index 8f2fee6..1034167 100644
--- a/webrtc/test/fake_network_pipe.cc
+++ b/webrtc/test/fake_network_pipe.cc
@@ -28,13 +28,16 @@
 }
 
 FakeNetworkPipe::FakeNetworkPipe(Clock* clock,
-                                 const FakeNetworkPipe::Config& config)
-    : FakeNetworkPipe(clock, config, 1) {}
+                                 const FakeNetworkPipe::Config& config,
+                                 MediaType media_type)
+    : FakeNetworkPipe(clock, config, media_type, 1) {}
 
 FakeNetworkPipe::FakeNetworkPipe(Clock* clock,
                                  const FakeNetworkPipe::Config& config,
+                                 MediaType media_type,
                                  uint64_t seed)
     : clock_(clock),
+      media_type_(media_type),
       packet_receiver_(NULL),
       random_(seed),
       config_(),
@@ -199,7 +202,7 @@
   while (!packets_to_deliver.empty()) {
     NetworkPacket* packet = packets_to_deliver.front();
     packets_to_deliver.pop();
-    packet_receiver_->DeliverPacket(MediaType::ANY, packet->data(),
+    packet_receiver_->DeliverPacket(media_type_, packet->data(),
                                     packet->data_length(), PacketTime());
     delete packet;
   }
diff --git a/webrtc/test/fake_network_pipe.h b/webrtc/test/fake_network_pipe.h
index 0c73e85..adf76c3 100644
--- a/webrtc/test/fake_network_pipe.h
+++ b/webrtc/test/fake_network_pipe.h
@@ -25,6 +25,7 @@
 
 class Clock;
 class PacketReceiver;
+enum class MediaType;
 
 class NetworkPacket {
  public:
@@ -82,9 +83,10 @@
     int avg_burst_loss_length = -1;
   };
 
-  FakeNetworkPipe(Clock* clock, const FakeNetworkPipe::Config& config);
+  FakeNetworkPipe(Clock* clock, const FakeNetworkPipe::Config& config,
+                  MediaType media_type);
   FakeNetworkPipe(Clock* clock,
-                  const FakeNetworkPipe::Config& config,
+                  const FakeNetworkPipe::Config& config, MediaType media_type,
                   uint64_t seed);
   ~FakeNetworkPipe();
 
@@ -110,6 +112,7 @@
 
  private:
   Clock* const clock_;
+  const MediaType media_type_;
   rtc::CriticalSection lock_;
   PacketReceiver* packet_receiver_;
   std::queue<NetworkPacket*> capacity_link_;
diff --git a/webrtc/test/fake_network_pipe_unittest.cc b/webrtc/test/fake_network_pipe_unittest.cc
index aa27399..c19b001 100644
--- a/webrtc/test/fake_network_pipe_unittest.cc
+++ b/webrtc/test/fake_network_pipe_unittest.cc
@@ -96,7 +96,7 @@
   config.queue_length_packets = 20;
   config.link_capacity_kbps = 80;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO));
   pipe->SetReceiver(receiver_.get());
 
   // Add 10 packets of 1000 bytes, = 80 kb, and verify it takes one second to
@@ -110,22 +110,22 @@
                                          kPacketSize);
 
   // Time haven't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0);
   pipe->Process();
 
   // Advance enough time to release one packet.
   fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1);
   pipe->Process();
 
   // Release all but one packet
   fake_clock_.AdvanceTimeMilliseconds(9 * kPacketTimeMs - 1);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(8);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(8);
   pipe->Process();
 
   // And the last one.
   fake_clock_.AdvanceTimeMilliseconds(1);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1);
   pipe->Process();
 }
 
@@ -136,7 +136,7 @@
   config.queue_delay_ms = 100;
   config.link_capacity_kbps = 80;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::AUDIO));
   pipe->SetReceiver(receiver_.get());
 
   const int kNumPackets = 2;
@@ -149,17 +149,17 @@
 
   // Increase more than kPacketTimeMs, but not more than the extra delay.
   fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(0);
   pipe->Process();
 
   // Advance the network delay to get the first packet.
   fake_clock_.AdvanceTimeMilliseconds(config.queue_delay_ms);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1);
   pipe->Process();
 
   // Advance one more kPacketTimeMs to get the last packet.
   fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1);
   pipe->Process();
 }
 
@@ -170,7 +170,7 @@
   config.queue_length_packets = 2;
   config.link_capacity_kbps = 80;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO));
   pipe->SetReceiver(receiver_.get());
 
   const int kPacketSize = 1000;
@@ -183,7 +183,7 @@
   // Increase time enough to deliver all three packets, verify only two are
   // delivered.
   fake_clock_.AdvanceTimeMilliseconds(3 * kPacketTimeMs);
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(2);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(2);
   pipe->Process();
 }
 
@@ -194,7 +194,7 @@
   config.queue_delay_ms = 20;
   config.link_capacity_kbps = 80;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO));
   pipe->SetReceiver(receiver_.get());
 
   const int kPacketSize = 1000;
@@ -206,7 +206,7 @@
   fake_clock_.AdvanceTimeMilliseconds(3 * kPacketTimeMs +
                                       config.queue_delay_ms);
 
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(2);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(2);
   pipe->Process();
 
   // Packet 1: kPacketTimeMs + config.queue_delay_ms,
@@ -224,7 +224,7 @@
   config.queue_length_packets = 20;
   config.link_capacity_kbps = 80;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO));
   pipe->SetReceiver(receiver_.get());
 
   // Add 10 packets of 1000 bytes, = 80 kb, and verify it takes one second to
@@ -237,13 +237,13 @@
   int packet_time_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
 
   // Time hasn't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0);
   pipe->Process();
 
   // Advance time in steps to release one packet at a time.
   for (int i = 0; i < kNumPackets; ++i) {
     fake_clock_.AdvanceTimeMilliseconds(packet_time_ms);
-    EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+    EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1);
     pipe->Process();
   }
 
@@ -259,20 +259,20 @@
   packet_time_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
 
   // Time hasn't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0);
   pipe->Process();
 
   // Advance time in steps to release one packet at a time.
   for (int i = 0; i < kNumPackets; ++i) {
     fake_clock_.AdvanceTimeMilliseconds(packet_time_ms);
-    EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+    EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1);
     pipe->Process();
   }
 
   // Check that all the packets were sent.
   EXPECT_EQ(static_cast<size_t>(2 * kNumPackets), pipe->sent_packets());
   fake_clock_.AdvanceTimeMilliseconds(pipe->TimeUntilNextProcess());
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0);
   pipe->Process();
 }
 
@@ -283,7 +283,7 @@
   config.queue_length_packets = 20;
   config.link_capacity_kbps = 80;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::AUDIO));
   pipe->SetReceiver(receiver_.get());
 
   // Add 10 packets of 1000 bytes, = 80 kb.
@@ -306,27 +306,27 @@
   int packet_time_2_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
 
   // Time hasn't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(0);
   pipe->Process();
 
   // Advance time in steps to release one packet at a time.
   for (int i = 0; i < kNumPackets; ++i) {
     fake_clock_.AdvanceTimeMilliseconds(packet_time_1_ms);
-    EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+    EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1);
     pipe->Process();
   }
 
   // Advance time in steps to release one packet at a time.
   for (int i = 0; i < kNumPackets; ++i) {
     fake_clock_.AdvanceTimeMilliseconds(packet_time_2_ms);
-    EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(1);
+    EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1);
     pipe->Process();
   }
 
   // Check that all the packets were sent.
   EXPECT_EQ(static_cast<size_t>(2 * kNumPackets), pipe->sent_packets());
   fake_clock_.AdvanceTimeMilliseconds(pipe->TimeUntilNextProcess());
-  EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0);
+  EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(0);
   pipe->Process();
 }
 
@@ -338,7 +338,7 @@
   config.queue_delay_ms = 100;
   config.delay_standard_deviation_ms = 10;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO));
   ReorderTestReceiver* receiver = new ReorderTestReceiver();
   receiver_.reset(receiver);
   pipe->SetReceiver(receiver_.get());
@@ -390,7 +390,7 @@
   config.loss_percent = kLossPercent;
   config.avg_burst_loss_length = kAvgBurstLength;
   std::unique_ptr<FakeNetworkPipe> pipe(
-      new FakeNetworkPipe(&fake_clock_, config));
+      new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO));
   ReorderTestReceiver* receiver = new ReorderTestReceiver();
   receiver_.reset(receiver);
   pipe->SetReceiver(receiver_.get());
diff --git a/webrtc/test/layer_filtering_transport.cc b/webrtc/test/layer_filtering_transport.cc
index 2680553..5ae06b7 100644
--- a/webrtc/test/layer_filtering_transport.cc
+++ b/webrtc/test/layer_filtering_transport.cc
@@ -27,7 +27,7 @@
     uint8_t vp9_video_payload_type,
     int selected_tl,
     int selected_sl)
-    : test::DirectTransport(config, send_call),
+    : test::DirectTransport(config, send_call, MediaType::VIDEO),
       vp8_video_payload_type_(vp8_video_payload_type),
       vp9_video_payload_type_(vp9_video_payload_type),
       selected_tl_(selected_tl),
diff --git a/webrtc/test/rtp_rtcp_observer.h b/webrtc/test/rtp_rtcp_observer.h
index 8e1375f..b268e4b 100644
--- a/webrtc/test/rtp_rtcp_observer.h
+++ b/webrtc/test/rtp_rtcp_observer.h
@@ -94,8 +94,9 @@
   PacketTransport(Call* send_call,
                   RtpRtcpObserver* observer,
                   TransportType transport_type,
+                  MediaType media_type,
                   const FakeNetworkPipe::Config& configuration)
-      : test::DirectTransport(configuration, send_call),
+      : test::DirectTransport(configuration, send_call, media_type),
         observer_(observer),
         transport_type_(transport_type) {}
 
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
index 6f030c3..12b0b52 100644
--- a/webrtc/video/end_to_end_tests.cc
+++ b/webrtc/video/end_to_end_tests.cc
@@ -210,8 +210,10 @@
 
   CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_));
 
-  test::DirectTransport sender_transport(sender_call_.get());
-  test::DirectTransport receiver_transport(receiver_call_.get());
+  test::DirectTransport sender_transport(
+      sender_call_.get(), MediaType::VIDEO);
+  test::DirectTransport receiver_transport(
+      receiver_call_.get(), MediaType::VIDEO);
   sender_transport.SetReceiver(receiver_call_->Receiver());
   receiver_transport.SetReceiver(sender_call_->Receiver());
 
@@ -257,8 +259,10 @@
 
   CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_));
 
-  test::DirectTransport sender_transport(sender_call_.get());
-  test::DirectTransport receiver_transport(receiver_call_.get());
+  test::DirectTransport sender_transport(
+      sender_call_.get(), MediaType::VIDEO);
+  test::DirectTransport receiver_transport(
+      receiver_call_.get(), MediaType::VIDEO);
   sender_transport.SetReceiver(receiver_call_->Receiver());
   receiver_transport.SetReceiver(sender_call_->Receiver());
 
@@ -529,6 +533,7 @@
     test::PacketTransport* CreateReceiveTransport() override {
       test::PacketTransport* receive_transport = new test::PacketTransport(
           nullptr, this, test::PacketTransport::kReceiver,
+          MediaType::AUDIO,
           FakeNetworkPipe::Config());
       receive_transport_ = receive_transport;
       return receive_transport;
@@ -790,7 +795,8 @@
     FakeNetworkPipe::Config config;
     config.queue_delay_ms = kNetworkDelayMs;
     return new test::PacketTransport(sender_call, this,
-                                     test::PacketTransport::kSender, config);
+                                     test::PacketTransport::kSender,
+                                     MediaType::VIDEO, config);
   }
 
   void OnFrame(const VideoFrame& video_frame) override {
@@ -969,7 +975,8 @@
       FakeNetworkPipe::Config config;
       config.queue_delay_ms = kNetworkDelayMs;
       return new test::PacketTransport(sender_call, this,
-                                       test::PacketTransport::kSender, config);
+                                       test::PacketTransport::kSender,
+                                       MediaType::VIDEO, config);
     }
 
     // TODO(holmer): Investigate why we don't send FEC packets when the bitrate
@@ -1311,8 +1318,10 @@
 
   CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_));
 
-  test::DirectTransport send_transport(sender_call_.get());
-  test::DirectTransport receive_transport(receiver_call_.get());
+  test::DirectTransport send_transport(
+      sender_call_.get(), MediaType::VIDEO);
+  test::DirectTransport receive_transport(
+      receiver_call_.get(), MediaType::VIDEO);
   PacketInputObserver input_observer(receiver_call_->Receiver());
   send_transport.SetReceiver(&input_observer);
   receive_transport.SetReceiver(sender_call_->Receiver());
@@ -1539,10 +1548,10 @@
                                    VideoReceiveStream::Config* receive_config) {
   }
   virtual test::DirectTransport* CreateSendTransport(Call* sender_call) {
-    return new test::DirectTransport(sender_call);
+    return new test::DirectTransport(sender_call, MediaType::VIDEO);
   }
   virtual test::DirectTransport* CreateReceiveTransport(Call* receiver_call) {
-    return new test::DirectTransport(receiver_call);
+    return new test::DirectTransport(receiver_call, MediaType::VIDEO);
   }
 };
 
@@ -1621,7 +1630,7 @@
     RtpExtensionHeaderObserver(Call* sender_call,
                                const uint32_t& first_media_ssrc,
                                const std::map<uint32_t, uint32_t>& ssrc_map)
-        : DirectTransport(sender_call),
+        : DirectTransport(sender_call, MediaType::VIDEO),
           done_(false, false),
           parser_(RtpHeaderParser::Create()),
           first_media_ssrc_(first_media_ssrc),
@@ -1937,8 +1946,10 @@
 
   CreateCalls(Call::Config(&event_log_), Call::Config(&event_log_));
 
-  test::DirectTransport sender_transport(sender_call_.get());
-  test::DirectTransport receiver_transport(receiver_call_.get());
+  test::DirectTransport sender_transport(
+      sender_call_.get(), MediaType::VIDEO);
+  test::DirectTransport receiver_transport(
+      receiver_call_.get(), MediaType::VIDEO);
   sender_transport.SetReceiver(receiver_call_->Receiver());
   receiver_transport.SetReceiver(sender_call_->Receiver());
 
@@ -2102,6 +2113,7 @@
     test::PacketTransport* CreateReceiveTransport() override {
       receive_transport_ = new test::PacketTransport(
           nullptr, this, test::PacketTransport::kReceiver,
+          MediaType::VIDEO,
           FakeNetworkPipe::Config());
       return receive_transport_;
     }
@@ -3065,7 +3077,8 @@
       FakeNetworkPipe::Config network_config;
       network_config.loss_percent = 5;
       return new test::PacketTransport(
-          sender_call, this, test::PacketTransport::kSender, network_config);
+          sender_call, this, test::PacketTransport::kSender, MediaType::VIDEO,
+          network_config);
     }
 
     Call::Config GetSenderCallConfig() override {
@@ -3619,9 +3632,11 @@
 
   test::PacketTransport send_transport(sender_call_.get(), &observer,
                                        test::PacketTransport::kSender,
+                                       MediaType::VIDEO,
                                        FakeNetworkPipe::Config());
   test::PacketTransport receive_transport(nullptr, &observer,
                                           test::PacketTransport::kReceiver,
+                                          MediaType::VIDEO,
                                           FakeNetworkPipe::Config());
   send_transport.SetReceiver(receiver_call_->Receiver());
   receive_transport.SetReceiver(sender_call_->Receiver());
@@ -3914,9 +3929,11 @@
 
   FakeNetworkPipe::Config config;
   config.queue_delay_ms = kSendDelayMs;
-  test::DirectTransport sender_transport(config, sender_call_.get());
+  test::DirectTransport sender_transport(
+      config, sender_call_.get(), MediaType::VIDEO);
   config.queue_delay_ms = kReceiveDelayMs;
-  test::DirectTransport receiver_transport(config, receiver_call_.get());
+  test::DirectTransport receiver_transport(
+      config, receiver_call_.get(), MediaType::VIDEO);
   sender_transport.SetReceiver(receiver_call_->Receiver());
   receiver_transport.SetReceiver(sender_call_->Receiver());
 
@@ -3978,7 +3995,7 @@
   CreateCalls(config, config);
   receiver_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp);
 
-  test::DirectTransport sender_transport(sender_call_.get());
+  test::DirectTransport sender_transport(sender_call_.get(), MediaType::VIDEO);
   sender_transport.SetReceiver(receiver_call_->Receiver());
   CreateSendConfig(1, 0, 0, &sender_transport);
   CreateMatchingReceiveConfigs(transport);
diff --git a/webrtc/video/replay.cc b/webrtc/video/replay.cc
index 2188d3e..6347dc9 100644
--- a/webrtc/video/replay.cc
+++ b/webrtc/video/replay.cc
@@ -283,8 +283,8 @@
     if (!rtp_reader->NextPacket(&packet))
       break;
     ++num_packets;
-    switch (call->Receiver()->DeliverPacket(webrtc::MediaType::ANY, packet.data,
-                                            packet.length, PacketTime())) {
+    switch (call->Receiver()->DeliverPacket(
+        webrtc::MediaType::VIDEO, packet.data, packet.length, PacketTime())) {
       case PacketReceiver::DELIVERY_OK:
         break;
       case PacketReceiver::DELIVERY_UNKNOWN_SSRC: {
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc
index 4c3c731..96a4882 100644
--- a/webrtc/video/video_quality_test.cc
+++ b/webrtc/video/video_quality_test.cc
@@ -1590,7 +1590,8 @@
   test::LayerFilteringTransport send_transport(
       params_.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9,
       params_.video.selected_tl, params_.ss.selected_sl);
-  test::DirectTransport recv_transport(params_.pipe, receiver_call_.get());
+  test::DirectTransport recv_transport(
+      params_.pipe, receiver_call_.get(), MediaType::VIDEO);
 
   std::string graph_title = params_.analyzer.graph_title;
   if (graph_title.empty())
diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
index cf09b3a..18bb9b8 100644
--- a/webrtc/video/video_send_stream_tests.cc
+++ b/webrtc/video/video_send_stream_tests.cc
@@ -439,7 +439,8 @@
     config.loss_percent = 5;
     config.queue_delay_ms = kNetworkDelayMs;
     return new test::PacketTransport(sender_call, this,
-                                     test::PacketTransport::kSender, config);
+                                     test::PacketTransport::kSender,
+                                     MediaType::VIDEO, config);
   }
 
   void ModifyVideoConfigs(
@@ -594,7 +595,8 @@
     config.loss_percent = 5;
     config.queue_delay_ms = kNetworkDelayMs;
     return new test::PacketTransport(sender_call, this,
-                                     test::PacketTransport::kSender, config);
+                                     test::PacketTransport::kSender,
+                                     MediaType::VIDEO, config);
   }
 
   void ModifyVideoConfigs(
@@ -1263,7 +1265,8 @@
       config.link_capacity_kbps = kCapacityKbps;
       config.queue_delay_ms = kNetworkDelayMs;
       return new test::PacketTransport(sender_call, this,
-                                       test::PacketTransport::kSender, config);
+                                       test::PacketTransport::kSender,
+                                       MediaType::VIDEO, config);
     }
 
     void ModifyVideoConfigs(