mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00
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:
parent
f7682f01bb
commit
9e0bf9b5c8
5 changed files with 43 additions and 42 deletions
|
@ -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 = [
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue