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