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}
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc
index 672ee98..21b6c95 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -1085,10 +1085,15 @@
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;
}
diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index f8789edc..75d268d0 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -1747,13 +1747,13 @@
ReceiverMocks mocks;
mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
RTCPReceiver receiver = Create(mocks);
- receiver.SetRemoteSSRC(kSenderSsrc);
- rtcp::CongestionControlFeedback packet({{
- .ssrc = 123,
- .sequence_number = 1,
- }},
- /*report_timestamp_compact_ntp=*/324);
+ rtcp::CongestionControlFeedback packet(
+ {{
+ .ssrc = mocks.config.local_media_ssrc,
+ .sequence_number = 1,
+ }},
+ /*report_timestamp_compact_ntp=*/324);
packet.SetSenderSsrc(kSenderSsrc);
EXPECT_CALL(
@@ -1764,6 +1764,33 @@
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;