From ae1ad04077c819ca3c3fff4a3432d1e1b7f6ff6f Mon Sep 17 00:00:00 2001 From: Per K Date: Tue, 3 Dec 2024 15:54:58 +0000 Subject: [PATCH] Add support for receiving congestion control messages to rtcp transceiver Congestion control feedback messages follow RFC 8888. BUG: webrtc:42225697 Change-Id: If7e55249ac479636c0bab5cbcf96e70c1976a51d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/370161 Reviewed-by: Danil Chapovalov Commit-Queue: Per Kjellander Cr-Commit-Position: refs/heads/main@{#43486} --- .../rtp_rtcp/source/rtcp_transceiver_impl.cc | 18 +++++++++++++ .../rtp_rtcp/source/rtcp_transceiver_impl.h | 3 +++ .../source/rtcp_transceiver_impl_unittest.cc | 26 +++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc index f3f6d5142d..df6e625d41 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc @@ -23,6 +23,7 @@ #include "modules/rtp_rtcp/source/rtcp_packet.h" #include "modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h" +#include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h" #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" #include "modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "modules/rtp_rtcp/source/rtcp_packet/nack.h" @@ -464,6 +465,9 @@ void RtcpTransceiverImpl::HandleRtpFeedback( case rtcp::TransportFeedback::kFeedbackMessageType: HandleTransportFeedback(rtcp_packet_header, now); break; + case rtcp::CongestionControlFeedback::kFeedbackMessageType: + HandleCongestionControlFeedback(rtcp_packet_header, now); + break; } } @@ -493,6 +497,20 @@ void RtcpTransceiverImpl::HandleTransportFeedback( } } +void RtcpTransceiverImpl::HandleCongestionControlFeedback( + const rtcp::CommonHeader& rtcp_packet_header, + Timestamp now) { + RTC_DCHECK_EQ(rtcp_packet_header.fmt(), + rtcp::CongestionControlFeedback::kFeedbackMessageType); + if (config_.network_link_observer == nullptr) { + return; + } + rtcp::CongestionControlFeedback feedback; + if (feedback.Parse(rtcp_packet_header)) { + config_.network_link_observer->OnCongestionControlFeedback(now, feedback); + } +} + void RtcpTransceiverImpl::HandleExtendedReports( const rtcp::CommonHeader& rtcp_packet_header, Timestamp now) { diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.h b/modules/rtp_rtcp/source/rtcp_transceiver_impl.h index d4f12dc4ee..24710247de 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.h +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.h @@ -114,6 +114,9 @@ class RtcpTransceiverImpl { void HandleNack(const rtcp::CommonHeader& rtcp_packet_header); void HandleTransportFeedback(const rtcp::CommonHeader& rtcp_packet_header, Timestamp now); + void HandleCongestionControlFeedback( + const rtcp::CommonHeader& rtcp_packet_header, + Timestamp now); void HandleExtendedReports(const rtcp::CommonHeader& rtcp_packet_header, Timestamp now); // Extended Reports blocks handlers. diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc index 988bcccd5b..57f19d13b4 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc @@ -30,6 +30,7 @@ #include "modules/rtp_rtcp/source/rtcp_packet/app.h" #include "modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" +#include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h" #include "system_wrappers/include/clock.h" #include "test/gmock.h" #include "test/gtest.h" @@ -1403,6 +1404,31 @@ TEST_F(RtcpTransceiverImplTest, ParsesTransportFeedback) { rtcp_transceiver.ReceivePacket(tb.Build(), receive_time); } +TEST_F(RtcpTransceiverImplTest, ParsesCongestionControlFeedback) { + MockNetworkLinkRtcpObserver link_observer; + RtcpTransceiverConfig config = DefaultTestConfig(); + config.network_link_observer = &link_observer; + const uint32_t receive_time_ntp = 5678; + Timestamp receive_time = Timestamp::Seconds(9843); + RtcpTransceiverImpl rtcp_transceiver(config); + + EXPECT_CALL(link_observer, OnCongestionControlFeedback(receive_time, _)) + .WillOnce(WithArg<1>([](const rtcp::CongestionControlFeedback& message) { + EXPECT_EQ(message.report_timestamp_compact_ntp(), 5678u); + EXPECT_THAT(message.packets(), SizeIs(2)); + })); + + std::vector packets = { + {.ssrc = 1, + .sequence_number = 321, + .arrival_time_offset = TimeDelta::Millis(15)}, + {.ssrc = 1, + .sequence_number = 322, + .arrival_time_offset = TimeDelta::Millis(17)}}; + rtcp::CongestionControlFeedback ccfb(std::move(packets), receive_time_ntp); + rtcp_transceiver.ReceivePacket(ccfb.Build(), receive_time); +} + TEST_F(RtcpTransceiverImplTest, ParsesRemb) { MockNetworkLinkRtcpObserver link_observer; RtcpTransceiverConfig config = DefaultTestConfig();