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 <danilchap@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43486}
This commit is contained in:
Per K 2024-12-03 15:54:58 +00:00 committed by WebRTC LUCI CQ
parent ad63489c58
commit ae1ad04077
3 changed files with 47 additions and 0 deletions

View File

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

View File

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

View File

@ -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<rtcp::CongestionControlFeedback::PacketInfo> 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();