Propagate rtc::ReceivedPacket further in RtpTransport

Bug: webrtc:15368
Change-Id: I4c8989a7b9efacbcc29c0c3331d8f4d7350774c1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/341220
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41825}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index df011ee..f23a27e 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -498,6 +498,7 @@
     "../rtc_base:logging",
     "../rtc_base:network_route",
     "../rtc_base:socket",
+    "../rtc_base/network:received_packet",
     "../rtc_base/network:sent_packet",
   ]
   absl_deps = [
diff --git a/pc/rtp_transport.cc b/pc/rtp_transport.cc
index ab8f73a..9442727 100644
--- a/pc/rtp_transport.cc
+++ b/pc/rtp_transport.cc
@@ -191,11 +191,9 @@
 }
 
 void RtpTransport::DemuxPacket(rtc::CopyOnWriteBuffer packet,
-                               int64_t packet_time_us) {
-  RtpPacketReceived parsed_packet(&header_extension_map_,
-                                  packet_time_us == -1
-                                      ? Timestamp::MinusInfinity()
-                                      : Timestamp::Micros(packet_time_us));
+                               webrtc::Timestamp arrival_time) {
+  RtpPacketReceived parsed_packet(&header_extension_map_, arrival_time);
+
   if (!parsed_packet.Parse(std::move(packet))) {
     RTC_LOG(LS_ERROR)
         << "Failed to parse the incoming RTP packet before demuxing. Drop it.";
@@ -246,14 +244,21 @@
   processing_sent_packet_ = false;
 }
 
-void RtpTransport::OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                                       int64_t packet_time_us) {
-  DemuxPacket(packet, packet_time_us);
+void RtpTransport::OnRtpPacketReceived(
+    const rtc::ReceivedPacket& received_packet) {
+  rtc::CopyOnWriteBuffer payload(received_packet.payload());
+  DemuxPacket(payload, received_packet.arrival_time().value_or(
+                           Timestamp::MinusInfinity()));
 }
 
-void RtpTransport::OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                                        int64_t packet_time_us) {
-  SendRtcpPacketReceived(&packet, packet_time_us);
+void RtpTransport::OnRtcpPacketReceived(
+    const rtc::ReceivedPacket& received_packet) {
+  rtc::CopyOnWriteBuffer payload(received_packet.payload());
+  // TODO(bugs.webrtc.org/15368): Propagate timestamp and maybe received packet
+  // further.
+  SendRtcpPacketReceived(&payload, received_packet.arrival_time()
+                                       ? received_packet.arrival_time()->us()
+                                       : -1);
 }
 
 void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport,
@@ -279,16 +284,10 @@
     return;
   }
 
-  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);
+    OnRtcpPacketReceived(received_packet);
   } else {
-    OnRtpPacketReceived(std::move(packet), packet_time_us);
+    OnRtpPacketReceived(received_packet);
   }
 }
 
diff --git a/pc/rtp_transport.h b/pc/rtp_transport.h
index 5192543..a79bbd6 100644
--- a/pc/rtp_transport.h
+++ b/pc/rtp_transport.h
@@ -18,6 +18,7 @@
 
 #include "absl/types/optional.h"
 #include "api/task_queue/pending_task_safety_flag.h"
+#include "api/units/timestamp.h"
 #include "call/rtp_demuxer.h"
 #include "call/video_receive_stream.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
@@ -26,6 +27,7 @@
 #include "pc/session_description.h"
 #include "rtc_base/async_packet_socket.h"
 #include "rtc_base/copy_on_write_buffer.h"
+#include "rtc_base/network/received_packet.h"
 #include "rtc_base/network/sent_packet.h"
 #include "rtc_base/network_route.h"
 #include "rtc_base/socket.h"
@@ -90,7 +92,7 @@
 
  protected:
   // These methods will be used in the subclasses.
-  void DemuxPacket(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us);
+  void DemuxPacket(rtc::CopyOnWriteBuffer packet, Timestamp arrival_time);
 
   bool SendPacket(bool rtcp,
                   rtc::CopyOnWriteBuffer* packet,
@@ -101,10 +103,8 @@
   // Overridden by SrtpTransport.
   virtual void OnNetworkRouteChanged(
       absl::optional<rtc::NetworkRoute> network_route);
-  virtual void OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                                   int64_t packet_time_us);
-  virtual void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                                    int64_t packet_time_us);
+  virtual void OnRtpPacketReceived(const rtc::ReceivedPacket& packet);
+  virtual void OnRtcpPacketReceived(const rtc::ReceivedPacket& packet);
   // Overridden by SrtpTransport and DtlsSrtpTransport.
   virtual void OnWritableState(rtc::PacketTransportInternal* packet_transport);
 
diff --git a/pc/srtp_transport.cc b/pc/srtp_transport.cc
index c82839c..075b290 100644
--- a/pc/srtp_transport.cc
+++ b/pc/srtp_transport.cc
@@ -118,44 +118,46 @@
   return SendPacket(/*rtcp=*/true, packet, options, flags);
 }
 
-void SrtpTransport::OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                                        int64_t packet_time_us) {
+void SrtpTransport::OnRtpPacketReceived(const rtc::ReceivedPacket& packet) {
   TRACE_EVENT0("webrtc", "SrtpTransport::OnRtpPacketReceived");
   if (!IsSrtpActive()) {
     RTC_LOG(LS_WARNING)
         << "Inactive SRTP transport received an RTP packet. Drop it.";
     return;
   }
-  char* data = packet.MutableData<char>();
-  int len = rtc::checked_cast<int>(packet.size());
+
+  rtc::CopyOnWriteBuffer payload(packet.payload());
+  char* data = payload.MutableData<char>();
+  int len = rtc::checked_cast<int>(payload.size());
   if (!UnprotectRtp(data, len, &len)) {
     // Limit the error logging to avoid excessive logs when there are lots of
     // bad packets.
     const int kFailureLogThrottleCount = 100;
     if (decryption_failure_count_ % kFailureLogThrottleCount == 0) {
       RTC_LOG(LS_ERROR) << "Failed to unprotect RTP packet: size=" << len
-                        << ", seqnum=" << ParseRtpSequenceNumber(packet)
-                        << ", SSRC=" << ParseRtpSsrc(packet)
+                        << ", seqnum=" << ParseRtpSequenceNumber(payload)
+                        << ", SSRC=" << ParseRtpSsrc(payload)
                         << ", previous failure count: "
                         << decryption_failure_count_;
     }
     ++decryption_failure_count_;
     return;
   }
-  packet.SetSize(len);
-  DemuxPacket(std::move(packet), packet_time_us);
+  payload.SetSize(len);
+  DemuxPacket(std::move(payload),
+              packet.arrival_time().value_or(Timestamp::MinusInfinity()));
 }
 
-void SrtpTransport::OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                                         int64_t packet_time_us) {
+void SrtpTransport::OnRtcpPacketReceived(const rtc::ReceivedPacket& packet) {
   TRACE_EVENT0("webrtc", "SrtpTransport::OnRtcpPacketReceived");
   if (!IsSrtpActive()) {
     RTC_LOG(LS_WARNING)
         << "Inactive SRTP transport received an RTCP packet. Drop it.";
     return;
   }
-  char* data = packet.MutableData<char>();
-  int len = rtc::checked_cast<int>(packet.size());
+  rtc::CopyOnWriteBuffer payload(packet.payload());
+  char* data = payload.MutableData<char>();
+  int len = rtc::checked_cast<int>(payload.size());
   if (!UnprotectRtcp(data, len, &len)) {
     int type = -1;
     cricket::GetRtcpType(data, len, &type);
@@ -163,8 +165,9 @@
                       << ", type=" << type;
     return;
   }
-  packet.SetSize(len);
-  SendRtcpPacketReceived(&packet, packet_time_us);
+  payload.SetSize(len);
+  SendRtcpPacketReceived(
+      &payload, packet.arrival_time() ? packet.arrival_time()->us() : -1);
 }
 
 void SrtpTransport::OnNetworkRouteChanged(
diff --git a/pc/srtp_transport.h b/pc/srtp_transport.h
index bad4adc..e435e4a 100644
--- a/pc/srtp_transport.h
+++ b/pc/srtp_transport.h
@@ -117,10 +117,8 @@
   void ConnectToRtpTransport();
   void CreateSrtpSessions();
 
-  void OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                           int64_t packet_time_us) override;
-  void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
-                            int64_t packet_time_us) override;
+  void OnRtpPacketReceived(const rtc::ReceivedPacket& packet) override;
+  void OnRtcpPacketReceived(const rtc::ReceivedPacket& packet) override;
   void OnNetworkRouteChanged(
       absl::optional<rtc::NetworkRoute> network_route) override;