Only notify NetworkLinkObserver if SSRC match known SSRC

There is one RTCP receiver per receive stream. Therefore, only handle a
received CongestionControlFeedback in the RTCP receiver corresponding to
the first SSRC in the report.

Bug: webrtc:42225697
Change-Id: I9bc0009cb6840cddeaca25f39c597bc2c13a3604
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/372280
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43613}
This commit is contained in:
Per Kjellander 2024-12-19 12:24:38 +00:00 committed by WebRTC LUCI CQ
parent a3653782e4
commit fab4992f3d
2 changed files with 40 additions and 8 deletions

View File

@ -1085,10 +1085,15 @@ bool RTCPReceiver::HandleCongestionControlFeedback(
const CommonHeader& rtcp_block,
PacketInformation* packet_information) {
rtcp::CongestionControlFeedback feedback;
if (!feedback.Parse(rtcp_block)) {
if (!feedback.Parse(rtcp_block) || feedback.packets().empty()) {
return false;
}
packet_information->congestion_control_feedback.emplace(std::move(feedback));
uint32_t first_media_source_ssrc = feedback.packets()[0].ssrc;
if (first_media_source_ssrc == local_media_ssrc() ||
registered_ssrcs_.contains(first_media_source_ssrc)) {
packet_information->congestion_control_feedback.emplace(
std::move(feedback));
}
return true;
}

View File

@ -1747,10 +1747,10 @@ TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) {
ReceiverMocks mocks;
mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
RTCPReceiver receiver = Create(mocks);
receiver.SetRemoteSSRC(kSenderSsrc);
rtcp::CongestionControlFeedback packet({{
.ssrc = 123,
rtcp::CongestionControlFeedback packet(
{{
.ssrc = mocks.config.local_media_ssrc,
.sequence_number = 1,
}},
/*report_timestamp_compact_ntp=*/324);
@ -1764,6 +1764,33 @@ TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) {
receiver.IncomingPacket(packet.Build());
}
TEST(RtcpReceiverTest, FiltersCongestionControlFeedbackOnFirstSsrc) {
ReceiverMocks mocks_1;
mocks_1.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
RTCPReceiver receiver_1 = Create(mocks_1);
ReceiverMocks mocks_2;
mocks_2.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
mocks_2.config.local_media_ssrc = 789;
mocks_2.config.rtx_send_ssrc = 345;
RTCPReceiver receiver_2 = Create(mocks_2);
rtcp::CongestionControlFeedback packet(
{{
.ssrc = mocks_2.config.local_media_ssrc,
.sequence_number = 1,
}},
/*report_timestamp_compact_ntp=*/324);
packet.SetSenderSsrc(kSenderSsrc);
EXPECT_CALL(mocks_1.network_link_rtcp_observer, OnCongestionControlFeedback)
.Times(0);
EXPECT_CALL(mocks_2.network_link_rtcp_observer, OnCongestionControlFeedback)
.Times(1);
receiver_1.IncomingPacket(packet.Build());
receiver_2.IncomingPacket(packet.Build());
}
TEST(RtcpReceiverTest,
NotifiesNetworkStateEstimateObserverOnRemoteNetworkEstimate) {
ReceiverMocks mocks;