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}
This commit is contained in:
Per K 2024-02-27 09:25:11 +01:00 committed by WebRTC LUCI CQ
parent f7682f01bb
commit 9e0bf9b5c8
5 changed files with 43 additions and 42 deletions

View file

@ -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 = [

View file

@ -191,11 +191,9 @@ flat_set<uint32_t> 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);
}
}

View file

@ -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<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);

View file

@ -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<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 @@ 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(

View file

@ -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<rtc::NetworkRoute> network_route) override;