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;