From 13b5eb7c471ba88da9650c3e58e74e853f9c760c Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Wed, 4 Oct 2023 16:20:05 +0200 Subject: [PATCH] stats: ensure rtx ssrc is associated with primary ssrc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BUG=webrtc:15529 Change-Id: I3623eede7fc7890677516d78f3ef7a89a287eb8a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/322221 Reviewed-by: Harald Alvestrand Commit-Queue: Philipp Hancke Reviewed-by: Henrik Boström Cr-Commit-Position: refs/heads/main@{#40873} --- ...er_connection_encodings_integrationtest.cc | 41 +++++++++++++++++++ pc/rtc_stats_collector.cc | 3 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/pc/peer_connection_encodings_integrationtest.cc b/pc/peer_connection_encodings_integrationtest.cc index 5b25e293cd..4e502f73d7 100644 --- a/pc/peer_connection_encodings_integrationtest.cc +++ b/pc/peer_connection_encodings_integrationtest.cc @@ -924,6 +924,47 @@ TEST_F(PeerConnectionEncodingsIntegrationTest, VP9_TargetBitrate_StandardL1T3) { EXPECT_LE(target_bitrate.kbps(), kVp9ExpectedMaxBitrateForL1T3.kbps()); } +TEST_F(PeerConnectionEncodingsIntegrationTest, + SimulcastProducesUniqueSsrcAndRtxSsrcs) { + rtc::scoped_refptr local_pc_wrapper = CreatePc(); + rtc::scoped_refptr remote_pc_wrapper = CreatePc(); + ExchangeIceCandidates(local_pc_wrapper, remote_pc_wrapper); + + std::vector layers = + CreateLayers({"f", "h", "q"}, /*active=*/true); + rtc::scoped_refptr transceiver = + AddTransceiverWithSimulcastLayers(local_pc_wrapper, remote_pc_wrapper, + layers); + std::vector codecs = + GetCapabilitiesAndRestrictToCodec(local_pc_wrapper, "VP8"); + transceiver->SetCodecPreferences(codecs); + + NegotiateWithSimulcastTweaks(local_pc_wrapper, remote_pc_wrapper); + local_pc_wrapper->WaitForConnection(); + remote_pc_wrapper->WaitForConnection(); + + // Wait until media is flowing on all three layers. + // Ramp up time is needed before all three layers are sending. + ASSERT_TRUE_WAIT(HasOutboundRtpBytesSent(local_pc_wrapper, 3u), + kLongTimeoutForRampingUp.ms()); + // Verify SSRCs and RTX SSRCs. + rtc::scoped_refptr report = GetStats(local_pc_wrapper); + std::vector outbound_rtps = + report->GetStatsOfType(); + ASSERT_THAT(outbound_rtps, SizeIs(3u)); + + std::set ssrcs; + std::set rtx_ssrcs; + for (const auto& outbound_rtp : outbound_rtps) { + ASSERT_TRUE(outbound_rtp->ssrc.has_value()); + ASSERT_TRUE(outbound_rtp->rtx_ssrc.has_value()); + ssrcs.insert(*outbound_rtp->ssrc); + rtx_ssrcs.insert(*outbound_rtp->rtx_ssrc); + } + EXPECT_EQ(ssrcs.size(), 3u); + EXPECT_EQ(rtx_ssrcs.size(), 3u); +} + TEST_F(PeerConnectionEncodingsIntegrationTest, EncodingParameterCodecIsEmptyWhenCreatedAudio) { rtc::scoped_refptr local_pc_wrapper = CreatePc(); diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc index c191f4d65e..0797ba2a76 100644 --- a/pc/rtc_stats_collector.cc +++ b/pc/rtc_stats_collector.cc @@ -839,7 +839,8 @@ CreateOutboundRTPStreamStatsFromVideoSenderInfo( } for (const auto& ssrc_group : video_sender_info.ssrc_groups) { if (ssrc_group.semantics == cricket::kFidSsrcGroupSemantics && - ssrc_group.ssrcs.size() == 2) { + ssrc_group.ssrcs.size() == 2 && + video_sender_info.ssrc() == ssrc_group.ssrcs[0]) { outbound_video->rtx_ssrc = ssrc_group.ssrcs[1]; } }