Change RtpTransport and DsctTransport to receives packets through ReceivedPacketCallback

Instead of using PacketTransportInternal::SignalReadPacket.

Bug: webrtc:15368
Change-Id: Icdc2d7f85df6db944f0ba0232891e6c5a8986a66
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/340440
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41823}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index e4cb4f2..4a3b018 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -622,6 +622,7 @@
       "../rtc_base:stringutils",
       "../rtc_base:threading",
       "../rtc_base/containers:flat_map",
+      "../rtc_base/network:received_packet",
       "../rtc_base/third_party/sigslot:sigslot",
       "../system_wrappers",
     ]
diff --git a/media/base/rtp_utils.cc b/media/base/rtp_utils.cc
index c630cbc..9546ed6 100644
--- a/media/base/rtp_utils.cc
+++ b/media/base/rtp_utils.cc
@@ -12,6 +12,7 @@
 
 #include <string.h>
 
+#include <cstdint>
 #include <vector>
 
 // PacketTimeUpdateParams is defined in asyncpacketsocket.h.
@@ -172,12 +173,11 @@
   RTC_CHECK_NOTREACHED();
 }
 
-RtpPacketType InferRtpPacketType(rtc::ArrayView<const char> packet) {
-  if (webrtc::IsRtcpPacket(
-          rtc::reinterpret_array_view<const uint8_t>(packet))) {
+RtpPacketType InferRtpPacketType(rtc::ArrayView<const uint8_t> packet) {
+  if (webrtc::IsRtcpPacket(packet)) {
     return RtpPacketType::kRtcp;
   }
-  if (webrtc::IsRtpPacket(rtc::reinterpret_array_view<const uint8_t>(packet))) {
+  if (webrtc::IsRtpPacket(packet)) {
     return RtpPacketType::kRtp;
   }
   return RtpPacketType::kUnknown;
diff --git a/media/base/rtp_utils.h b/media/base/rtp_utils.h
index a501fd7..8ed3212 100644
--- a/media/base/rtp_utils.h
+++ b/media/base/rtp_utils.h
@@ -11,6 +11,8 @@
 #ifndef MEDIA_BASE_RTP_UTILS_H_
 #define MEDIA_BASE_RTP_UTILS_H_
 
+#include <cstdint>
+
 #include "absl/strings/string_view.h"
 #include "api/array_view.h"
 #include "rtc_base/byte_order.h"
@@ -46,7 +48,7 @@
 bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
 
 // Checks the packet header to determine if it can be an RTP or RTCP packet.
-RtpPacketType InferRtpPacketType(rtc::ArrayView<const char> packet);
+RtpPacketType InferRtpPacketType(rtc::ArrayView<const uint8_t> packet);
 // True if |payload type| is 0-127.
 bool IsValidRtpPayloadType(int payload_type);
 
diff --git a/media/base/rtp_utils_unittest.cc b/media/base/rtp_utils_unittest.cc
index a594f94..7d48e72 100644
--- a/media/base/rtp_utils_unittest.cc
+++ b/media/base/rtp_utils_unittest.cc
@@ -72,15 +72,12 @@
 // and in message `kRtpMsgWithTwoByteAbsSendTimeExtension`.
 static const int kAstIndexInTwoByteRtpMsg = 21;
 
-static const rtc::ArrayView<const char> kPcmuFrameArrayView =
-    rtc::MakeArrayView(reinterpret_cast<const char*>(kPcmuFrame),
-                       sizeof(kPcmuFrame));
-static const rtc::ArrayView<const char> kRtcpReportArrayView =
-    rtc::MakeArrayView(reinterpret_cast<const char*>(kRtcpReport),
-                       sizeof(kRtcpReport));
-static const rtc::ArrayView<const char> kInvalidPacketArrayView =
-    rtc::MakeArrayView(reinterpret_cast<const char*>(kInvalidPacket),
-                       sizeof(kInvalidPacket));
+static const rtc::ArrayView<const uint8_t> kPcmuFrameArrayView =
+    rtc::MakeArrayView(kPcmuFrame, sizeof(kPcmuFrame));
+static const rtc::ArrayView<const uint8_t> kRtcpReportArrayView =
+    rtc::MakeArrayView(kRtcpReport, sizeof(kRtcpReport));
+static const rtc::ArrayView<const uint8_t> kInvalidPacketArrayView =
+    rtc::MakeArrayView(kInvalidPacket, sizeof(kInvalidPacket));
 
 TEST(RtpUtilsTest, GetRtcp) {
   int pt;
diff --git a/media/sctp/dcsctp_transport.cc b/media/sctp/dcsctp_transport.cc
index 5250754..fa1d99d 100644
--- a/media/sctp/dcsctp_transport.cc
+++ b/media/sctp/dcsctp_transport.cc
@@ -27,6 +27,7 @@
 #include "p2p/base/packet_transport_internal.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
+#include "rtc_base/network/received_packet.h"
 #include "rtc_base/socket.h"
 #include "rtc_base/strings/string_builder.h"
 #include "rtc_base/thread.h"
@@ -605,8 +606,11 @@
   }
   transport_->SignalWritableState.connect(
       this, &DcSctpTransport::OnTransportWritableState);
-  transport_->SignalReadPacket.connect(this,
-                                       &DcSctpTransport::OnTransportReadPacket);
+  transport_->RegisterReceivedPacketCallback(
+      this, [&](rtc::PacketTransportInternal* transport,
+                const rtc::ReceivedPacket& packet) {
+        OnTransportReadPacket(transport, packet);
+      });
   transport_->SignalClosed.connect(this, &DcSctpTransport::OnTransportClosed);
 }
 
@@ -616,7 +620,7 @@
     return;
   }
   transport_->SignalWritableState.disconnect(this);
-  transport_->SignalReadPacket.disconnect(this);
+  transport_->DeregisterReceivedPacketCallback(this);
   transport_->SignalClosed.disconnect(this);
 }
 
@@ -632,21 +636,17 @@
 
 void DcSctpTransport::OnTransportReadPacket(
     rtc::PacketTransportInternal* transport,
-    const char* data,
-    size_t length,
-    const int64_t& /* packet_time_us */,
-    int flags) {
+    const rtc::ReceivedPacket& packet) {
   RTC_DCHECK_RUN_ON(network_thread_);
-  if (flags) {
+  if (packet.decryption_info() != rtc::ReceivedPacket::kDtlsDecrypted) {
     // We are only interested in SCTP packets.
     return;
   }
 
-  RTC_DLOG(LS_VERBOSE) << debug_name_
-                       << "->OnTransportReadPacket(), length=" << length;
+  RTC_DLOG(LS_VERBOSE) << debug_name_ << "->OnTransportReadPacket(), length="
+                       << packet.payload().size();
   if (socket_) {
-    socket_->ReceivePacket(rtc::ArrayView<const uint8_t>(
-        reinterpret_cast<const uint8_t*>(data), length));
+    socket_->ReceivePacket(packet.payload());
   }
 }
 
diff --git a/media/sctp/dcsctp_transport.h b/media/sctp/dcsctp_transport.h
index 7ae0d64..4dfcaeb 100644
--- a/media/sctp/dcsctp_transport.h
+++ b/media/sctp/dcsctp_transport.h
@@ -27,6 +27,7 @@
 #include "p2p/base/packet_transport_internal.h"
 #include "rtc_base/containers/flat_map.h"
 #include "rtc_base/copy_on_write_buffer.h"
+#include "rtc_base/network/received_packet.h"
 #include "rtc_base/random.h"
 #include "rtc_base/third_party/sigslot/sigslot.h"
 #include "rtc_base/thread.h"
@@ -94,10 +95,7 @@
   void DisconnectTransportSignals();
   void OnTransportWritableState(rtc::PacketTransportInternal* transport);
   void OnTransportReadPacket(rtc::PacketTransportInternal* transport,
-                             const char* data,
-                             size_t length,
-                             const int64_t& /* packet_time_us */,
-                             int flags);
+                             const rtc::ReceivedPacket& packet);
   void OnTransportClosed(rtc::PacketTransportInternal* transport);
 
   void MaybeConnectSocket();
diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn
index 9d25078..b5cd2c9 100644
--- a/p2p/BUILD.gn
+++ b/p2p/BUILD.gn
@@ -1100,6 +1100,7 @@
       "../rtc_base:socket_server",
       "../rtc_base:ssl",
       "../rtc_base:threading",
+      "../rtc_base/network:received_packet",
       "../rtc_base/third_party/sigslot",
       "../test:test_support",
     ]
diff --git a/p2p/base/fake_dtls_transport.h b/p2p/base/fake_dtls_transport.h
index 5a3db48..a088030 100644
--- a/p2p/base/fake_dtls_transport.h
+++ b/p2p/base/fake_dtls_transport.h
@@ -22,6 +22,7 @@
 #include "p2p/base/dtls_transport_internal.h"
 #include "p2p/base/fake_ice_transport.h"
 #include "rtc_base/fake_ssl_identity.h"
+#include "rtc_base/network/received_packet.h"
 #include "rtc_base/rtc_certificate.h"
 
 namespace cricket {
@@ -37,8 +38,11 @@
         component_(ice_transport->component()),
         dtls_fingerprint_("", nullptr) {
     RTC_DCHECK(ice_transport_);
-    ice_transport_->SignalReadPacket.connect(
-        this, &FakeDtlsTransport::OnIceTransportReadPacket);
+    ice_transport_->RegisterReceivedPacketCallback(
+        this, [&](rtc::PacketTransportInternal* transport,
+                  const rtc::ReceivedPacket& packet) {
+          OnIceTransportReadPacket(transport, packet);
+        });
     ice_transport_->SignalNetworkRouteChanged.connect(
         this, &FakeDtlsTransport::OnNetworkRouteChanged);
   }
@@ -49,8 +53,11 @@
         component_(owned_ice_transport_->component()),
         dtls_fingerprint_("", rtc::ArrayView<const uint8_t>()) {
     ice_transport_ = owned_ice_transport_.get();
-    ice_transport_->SignalReadPacket.connect(
-        this, &FakeDtlsTransport::OnIceTransportReadPacket);
+    ice_transport_->RegisterReceivedPacketCallback(
+        this, [&](rtc::PacketTransportInternal* transport,
+                  const rtc::ReceivedPacket& packet) {
+          OnIceTransportReadPacket(transport, packet);
+        });
     ice_transport_->SignalNetworkRouteChanged.connect(
         this, &FakeDtlsTransport::OnNetworkRouteChanged);
   }
@@ -71,6 +78,7 @@
     if (dest_ && dest_->dest_ == this) {
       dest_->dest_ = nullptr;
     }
+    ice_transport_->DeregisterReceivedPacketCallback(this);
   }
 
   // Get inner fake ICE transport.
@@ -264,11 +272,8 @@
 
  private:
   void OnIceTransportReadPacket(PacketTransportInternal* ice_,
-                                const char* data,
-                                size_t len,
-                                const int64_t& packet_time_us,
-                                int flags) {
-    SignalReadPacket(this, data, len, packet_time_us, flags);
+                                const rtc::ReceivedPacket& packet) {
+    NotifyPacketReceived(packet);
   }
 
   void set_receiving(bool receiving) {
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 6f21d00..df011ee 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -2121,6 +2121,7 @@
       "../rtc_base:threading",
       "../rtc_base:unique_id_generator",
       "../rtc_base/containers:flat_set",
+      "../rtc_base/network:received_packet",
       "../rtc_base/third_party/sigslot",
       "../system_wrappers:metrics",
       "../test:explicit_key_value_config",
diff --git a/pc/channel_unittest.cc b/pc/channel_unittest.cc
index 98a61ea..21a147c 100644
--- a/pc/channel_unittest.cc
+++ b/pc/channel_unittest.cc
@@ -152,6 +152,19 @@
       SendTask(network_thread_, [this]() {
         network_thread_safety_->SetNotAlive();
         DeinitChannels();
+
+        // Transports must be created and destroyed on the network thread.
+        fake_rtp_dtls_transport1_ = nullptr;
+        fake_rtcp_dtls_transport1_ = nullptr;
+        fake_rtp_dtls_transport2_ = nullptr;
+        fake_rtcp_dtls_transport2_ = nullptr;
+        fake_rtp_packet_transport1_ = nullptr;
+        fake_rtcp_packet_transport1_ = nullptr;
+        fake_rtp_packet_transport2_ = nullptr;
+        fake_rtcp_packet_transport2_ = nullptr;
+        rtp_transport1_ = nullptr;
+        rtp_transport2_ = nullptr;
+        new_rtp_transport_ = nullptr;
       });
     }
   }
@@ -187,66 +200,70 @@
     // channels.
     RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
     rtc::Thread* worker_thread = rtc::Thread::Current();
-    // Based on flags, create fake DTLS or raw packet transports.
-    if (flags1 & RAW_PACKET_TRANSPORT) {
-      fake_rtp_packet_transport1_.reset(
-          new rtc::FakePacketTransport("channel1_rtp"));
-      if (!(flags1 & RTCP_MUX)) {
-        fake_rtcp_packet_transport1_.reset(
-            new rtc::FakePacketTransport("channel1_rtcp"));
-      }
-    } else {
-      // Confirmed to work with KT_RSA and KT_ECDSA.
-      fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
-          "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
-      if (!(flags1 & RTCP_MUX)) {
-        fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
-            "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
-            network_thread_));
-      }
-      if (flags1 & DTLS) {
-        auto cert1 = rtc::RTCCertificate::Create(
-            rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
-        fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
-        if (fake_rtcp_dtls_transport1_) {
-          fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
+
+    network_thread_->BlockingCall([&] {
+      // Based on flags, create fake DTLS or raw packet transports.
+
+      if (flags1 & RAW_PACKET_TRANSPORT) {
+        fake_rtp_packet_transport1_.reset(
+            new rtc::FakePacketTransport("channel1_rtp"));
+        if (!(flags1 & RTCP_MUX)) {
+          fake_rtcp_packet_transport1_.reset(
+              new rtc::FakePacketTransport("channel1_rtcp"));
+        }
+      } else {
+        // Confirmed to work with KT_RSA and KT_ECDSA.
+        fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
+            "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
+        if (!(flags1 & RTCP_MUX)) {
+          fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
+              "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
+              network_thread_));
+        }
+        if (flags1 & DTLS) {
+          auto cert1 = rtc::RTCCertificate::Create(
+              rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
+          fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
+          if (fake_rtcp_dtls_transport1_) {
+            fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
+          }
         }
       }
-    }
-    // Based on flags, create fake DTLS or raw packet transports.
-    if (flags2 & RAW_PACKET_TRANSPORT) {
-      fake_rtp_packet_transport2_.reset(
-          new rtc::FakePacketTransport("channel2_rtp"));
-      if (!(flags2 & RTCP_MUX)) {
-        fake_rtcp_packet_transport2_.reset(
-            new rtc::FakePacketTransport("channel2_rtcp"));
-      }
-    } else {
-      // Confirmed to work with KT_RSA and KT_ECDSA.
-      fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
-          "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
-      if (!(flags2 & RTCP_MUX)) {
-        fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
-            "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
-            network_thread_));
-      }
-      if (flags2 & DTLS) {
-        auto cert2 = rtc::RTCCertificate::Create(
-            rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
-        fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
-        if (fake_rtcp_dtls_transport2_) {
-          fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
+      // Based on flags, create fake DTLS or raw packet transports.
+      if (flags2 & RAW_PACKET_TRANSPORT) {
+        fake_rtp_packet_transport2_.reset(
+            new rtc::FakePacketTransport("channel2_rtp"));
+        if (!(flags2 & RTCP_MUX)) {
+          fake_rtcp_packet_transport2_.reset(
+              new rtc::FakePacketTransport("channel2_rtcp"));
+        }
+      } else {
+        // Confirmed to work with KT_RSA and KT_ECDSA.
+        fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
+            "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
+        if (!(flags2 & RTCP_MUX)) {
+          fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
+              "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
+              network_thread_));
+        }
+        if (flags2 & DTLS) {
+          auto cert2 = rtc::RTCCertificate::Create(
+              rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
+          fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
+          if (fake_rtcp_dtls_transport2_) {
+            fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
+          }
         }
       }
-    }
-    rtp_transport1_ = CreateRtpTransportBasedOnFlags(
-        fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
-        fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
-        flags1);
-    rtp_transport2_ = CreateRtpTransportBasedOnFlags(
-        fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
-        fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
-        flags2);
+      rtp_transport1_ = CreateRtpTransportBasedOnFlags(
+          fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
+          fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
+          flags1);
+      rtp_transport2_ = CreateRtpTransportBasedOnFlags(
+          fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
+          fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
+          flags2);
+    });
 
     channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1s),
                               std::move(ch1r), rtp_transport1_.get(), flags1);
@@ -1351,12 +1368,11 @@
 
     CreateChannels(DTLS, DTLS);
 
-    new_rtp_transport_ = CreateDtlsSrtpTransport(
-        fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
-
     bool rcv_success, send_success;
     int rcv_buf, send_buf;
     SendTask(network_thread_, [&] {
+      new_rtp_transport_ = CreateDtlsSrtpTransport(
+          fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
       channel1_->SetOption(cricket::BaseChannel::ST_RTP,
                            rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
       channel2_->SetOption(cricket::BaseChannel::ST_RTP,
diff --git a/pc/jsep_transport_unittest.cc b/pc/jsep_transport_unittest.cc
index 18dd2d8..8112c97 100644
--- a/pc/jsep_transport_unittest.cc
+++ b/pc/jsep_transport_unittest.cc
@@ -31,6 +31,7 @@
 #include "rtc_base/helpers.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/net_helper.h"
+#include "rtc_base/network/received_packet.h"
 #include "rtc_base/socket_address.h"
 #include "rtc_base/ssl_certificate.h"
 #include "rtc_base/ssl_identity.h"
@@ -1039,42 +1040,44 @@
     auto fake_dtls2 =
         static_cast<FakeDtlsTransport*>(jsep_transport2_->rtp_dtls_transport());
 
-    fake_dtls1->fake_ice_transport()->SignalReadPacket.connect(
-        this, &JsepTransport2HeaderExtensionTest::OnReadPacket1);
-    fake_dtls2->fake_ice_transport()->SignalReadPacket.connect(
-        this, &JsepTransport2HeaderExtensionTest::OnReadPacket2);
+    fake_dtls1->fake_ice_transport()->RegisterReceivedPacketCallback(
+        this, [&](rtc::PacketTransportInternal* transport,
+                  const rtc::ReceivedPacket& packet) {
+          OnReadPacket1(transport, packet);
+        });
+    fake_dtls2->fake_ice_transport()->RegisterReceivedPacketCallback(
+        this, [&](rtc::PacketTransportInternal* transport,
+                  const rtc::ReceivedPacket& packet) {
+          OnReadPacket2(transport, packet);
+        });
 
-      auto cert1 = rtc::RTCCertificate::Create(
-          rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
-      jsep_transport1_->rtp_dtls_transport()->SetLocalCertificate(cert1);
-      auto cert2 = rtc::RTCCertificate::Create(
-          rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
-      jsep_transport2_->rtp_dtls_transport()->SetLocalCertificate(cert2);
+    auto cert1 = rtc::RTCCertificate::Create(
+        rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
+    jsep_transport1_->rtp_dtls_transport()->SetLocalCertificate(cert1);
+    auto cert2 = rtc::RTCCertificate::Create(
+        rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
+    jsep_transport2_->rtp_dtls_transport()->SetLocalCertificate(cert2);
   }
 
   void OnReadPacket1(rtc::PacketTransportInternal* transport,
-                     const char* data,
-                     size_t size,
-                     const int64_t& /* packet_time_us */,
-                     int flags) {
+                     const rtc::ReceivedPacket& packet) {
     RTC_LOG(LS_INFO) << "JsepTransport 1 Received a packet.";
     CompareHeaderExtensions(
         reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
-        sizeof(kPcmuFrameWithExtensions), data, size, recv_encrypted_headers1_,
-        false);
+        sizeof(kPcmuFrameWithExtensions),
+        reinterpret_cast<const char*>(packet.payload().data()),
+        packet.payload().size(), recv_encrypted_headers1_, false);
     received_packet_count_++;
   }
 
   void OnReadPacket2(rtc::PacketTransportInternal* transport,
-                     const char* data,
-                     size_t size,
-                     const int64_t& /* packet_time_us */,
-                     int flags) {
+                     const rtc::ReceivedPacket& packet) {
     RTC_LOG(LS_INFO) << "JsepTransport 2 Received a packet.";
     CompareHeaderExtensions(
         reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
-        sizeof(kPcmuFrameWithExtensions), data, size, recv_encrypted_headers2_,
-        false);
+        sizeof(kPcmuFrameWithExtensions),
+        reinterpret_cast<const char*>(packet.payload().data()),
+        packet.payload().size(), recv_encrypted_headers2_, false);
     received_packet_count_++;
   }
 
diff --git a/pc/rtp_transport.cc b/pc/rtp_transport.cc
index 7cf9fe0..ab8f73a 100644
--- a/pc/rtp_transport.cc
+++ b/pc/rtp_transport.cc
@@ -54,7 +54,7 @@
   }
   if (rtp_packet_transport_) {
     rtp_packet_transport_->SignalReadyToSend.disconnect(this);
-    rtp_packet_transport_->SignalReadPacket.disconnect(this);
+    rtp_packet_transport_->DeregisterReceivedPacketCallback(this);
     rtp_packet_transport_->SignalNetworkRouteChanged.disconnect(this);
     rtp_packet_transport_->SignalWritableState.disconnect(this);
     rtp_packet_transport_->SignalSentPacket.disconnect(this);
@@ -64,8 +64,11 @@
   if (new_packet_transport) {
     new_packet_transport->SignalReadyToSend.connect(
         this, &RtpTransport::OnReadyToSend);
-    new_packet_transport->SignalReadPacket.connect(this,
-                                                   &RtpTransport::OnReadPacket);
+    new_packet_transport->RegisterReceivedPacketCallback(
+        this, [&](rtc::PacketTransportInternal* transport,
+                  const rtc::ReceivedPacket& packet) {
+          OnReadPacket(transport, packet);
+        });
     new_packet_transport->SignalNetworkRouteChanged.connect(
         this, &RtpTransport::OnNetworkRouteChanged);
     new_packet_transport->SignalWritableState.connect(
@@ -90,7 +93,7 @@
   }
   if (rtcp_packet_transport_) {
     rtcp_packet_transport_->SignalReadyToSend.disconnect(this);
-    rtcp_packet_transport_->SignalReadPacket.disconnect(this);
+    rtcp_packet_transport_->DeregisterReceivedPacketCallback(this);
     rtcp_packet_transport_->SignalNetworkRouteChanged.disconnect(this);
     rtcp_packet_transport_->SignalWritableState.disconnect(this);
     rtcp_packet_transport_->SignalSentPacket.disconnect(this);
@@ -100,8 +103,11 @@
   if (new_packet_transport) {
     new_packet_transport->SignalReadyToSend.connect(
         this, &RtpTransport::OnReadyToSend);
-    new_packet_transport->SignalReadPacket.connect(this,
-                                                   &RtpTransport::OnReadPacket);
+    new_packet_transport->RegisterReceivedPacketCallback(
+        this, [&](rtc::PacketTransportInternal* transport,
+                  const rtc::ReceivedPacket& packet) {
+          OnReadPacket(transport, packet);
+        });
     new_packet_transport->SignalNetworkRouteChanged.connect(
         this, &RtpTransport::OnNetworkRouteChanged);
     new_packet_transport->SignalWritableState.connect(
@@ -251,30 +257,34 @@
 }
 
 void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport,
-                                const char* data,
-                                size_t len,
-                                const int64_t& packet_time_us,
-                                int flags) {
+                                const rtc::ReceivedPacket& received_packet) {
   TRACE_EVENT0("webrtc", "RtpTransport::OnReadPacket");
 
   // When using RTCP multiplexing we might get RTCP packets on the RTP
   // transport. We check the RTP payload type to determine if it is RTCP.
-  auto array_view = rtc::MakeArrayView(data, len);
-  cricket::RtpPacketType packet_type = cricket::InferRtpPacketType(array_view);
+  cricket::RtpPacketType packet_type =
+      cricket::InferRtpPacketType(received_packet.payload());
   // Filter out the packet that is neither RTP nor RTCP.
   if (packet_type == cricket::RtpPacketType::kUnknown) {
     return;
   }
 
   // Protect ourselves against crazy data.
-  if (!cricket::IsValidRtpPacketSize(packet_type, len)) {
+  if (!cricket::IsValidRtpPacketSize(packet_type,
+                                     received_packet.payload().size())) {
     RTC_LOG(LS_ERROR) << "Dropping incoming "
                       << cricket::RtpPacketTypeToString(packet_type)
-                      << " packet: wrong size=" << len;
+                      << " packet: wrong size="
+                      << received_packet.payload().size();
     return;
   }
 
-  rtc::CopyOnWriteBuffer packet(data, len);
+  rtc::CopyOnWriteBuffer packet(received_packet.payload());
+  int64_t packet_time_us = received_packet.arrival_time()
+                               ? received_packet.arrival_time()->us()
+                               : -1;
+  // TODO(bugs.webrtc.org/15368): Propagate timestamp and received packet
+  // metadata further.
   if (packet_type == cricket::RtpPacketType::kRtcp) {
     OnRtcpPacketReceived(std::move(packet), packet_time_us);
   } else {
diff --git a/pc/rtp_transport.h b/pc/rtp_transport.h
index 6d5d4bf..5192543 100644
--- a/pc/rtp_transport.h
+++ b/pc/rtp_transport.h
@@ -113,10 +113,7 @@
   void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
                     const rtc::SentPacket& sent_packet);
   void OnReadPacket(rtc::PacketTransportInternal* transport,
-                    const char* data,
-                    size_t len,
-                    const int64_t& packet_time_us,
-                    int flags);
+                    const rtc::ReceivedPacket& received_packet);
 
   // Updates "ready to send" for an individual channel and fires
   // SignalReadyToSend.