diff --git a/pc/BUILD.gn b/pc/BUILD.gn index df011ee2fa..f23a27ebde 100644 --- a/pc/BUILD.gn +++ b/pc/BUILD.gn @@ -498,6 +498,7 @@ rtc_source_set("rtp_transport") { "../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 ab8f73a9bb..94427277a7 100644 --- a/pc/rtp_transport.cc +++ b/pc/rtp_transport.cc @@ -191,11 +191,9 @@ flat_set RtpTransport::GetSsrcsForSink(RtpPacketSinkInterface* sink) { } 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 @@ void RtpTransport::OnSentPacket(rtc::PacketTransportInternal* packet_transport, 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 @@ void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport, 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 5192543c3d..a79bbd66bb 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 @@ class RtpTransport : public RtpTransportInternal { 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 @@ class RtpTransport : public RtpTransportInternal { // Overridden by SrtpTransport. virtual void OnNetworkRouteChanged( absl::optional 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 c82839ca82..075b290d7a 100644 --- a/pc/srtp_transport.cc +++ b/pc/srtp_transport.cc @@ -118,44 +118,46 @@ bool SrtpTransport::SendRtcpPacket(rtc::CopyOnWriteBuffer* packet, 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(); - int len = rtc::checked_cast(packet.size()); + + rtc::CopyOnWriteBuffer payload(packet.payload()); + char* data = payload.MutableData(); + int len = rtc::checked_cast(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(); - int len = rtc::checked_cast(packet.size()); + rtc::CopyOnWriteBuffer payload(packet.payload()); + char* data = payload.MutableData(); + int len = rtc::checked_cast(payload.size()); if (!UnprotectRtcp(data, len, &len)) { int type = -1; cricket::GetRtcpType(data, len, &type); @@ -163,8 +165,9 @@ void SrtpTransport::OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet, << ", 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 bad4adc135..e435e4a97e 100644 --- a/pc/srtp_transport.h +++ b/pc/srtp_transport.h @@ -117,10 +117,8 @@ class SrtpTransport : public RtpTransport { 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 network_route) override;