diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h index 4861f8ab84..8bb1ff2d05 100644 --- a/api/stats/rtcstats_objects.h +++ b/api/stats/rtcstats_objects.h @@ -250,6 +250,8 @@ class RTC_EXPORT RTCInboundRtpStreamStats final RTCStatsMember fec_packets_received; RTCStatsMember fec_bytes_received; RTCStatsMember fec_packets_discarded; + // Inbound FEC SSRC. Only present if a mechanism like FlexFEC is negotiated. + RTCStatsMember fec_ssrc; RTCStatsMember bytes_received; RTCStatsMember header_bytes_received; // Inbound RTX stats. Only defined when RTX is used and it is therefore diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc index 0c4df20093..c191f4d65e 100644 --- a/pc/rtc_stats_collector.cc +++ b/pc/rtc_stats_collector.cc @@ -681,6 +681,11 @@ CreateInboundRTPStreamStatsFromVideoReceiverInfo( if (ssrc_group.semantics == cricket::kFidSsrcGroupSemantics && ssrc_group.ssrcs.size() == 2) { inbound_video->rtx_ssrc = ssrc_group.ssrcs[1]; + } else if (ssrc_group.semantics == cricket::kFecFrSsrcGroupSemantics && + ssrc_group.ssrcs.size() == 2) { + // TODO(bugs.webrtc.org/15002): the ssrc-group might be >= 2 with + // multistream support. + inbound_video->fec_ssrc = ssrc_group.ssrcs[1]; } } diff --git a/pc/rtc_stats_collector_unittest.cc b/pc/rtc_stats_collector_unittest.cc index 788c884a54..37821ac829 100644 --- a/pc/rtc_stats_collector_unittest.cc +++ b/pc/rtc_stats_collector_unittest.cc @@ -2370,6 +2370,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCInboundRtpStreamStats_Video) { video_media_info.receivers[0].fec_bytes_received = 54; video_media_info.receivers[0].ssrc_groups.push_back( {cricket::kFidSsrcGroupSemantics, {1, 4404}}); + video_media_info.receivers[0].ssrc_groups.push_back( + {cricket::kFecFrSsrcGroupSemantics, {1, 5505}}); // Note: these two values intentionally differ, // only the decoded one should show up. @@ -2437,6 +2439,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCInboundRtpStreamStats_Video) { expected_video.fec_packets_received = 32; expected_video.fec_bytes_received = 54; expected_video.rtx_ssrc = 4404; + expected_video.fec_ssrc = 5505; ASSERT_TRUE(report->Get(expected_video.id())); EXPECT_EQ( diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc index 3e767a77e3..648efab69a 100644 --- a/pc/rtc_stats_integrationtest.cc +++ b/pc/rtc_stats_integrationtest.cc @@ -617,6 +617,7 @@ class RTCStatsReportVerifier { verifier.TestMemberIsUndefined(inbound_stream.fec_bytes_received); verifier.TestMemberIsUndefined(inbound_stream.fec_packets_received); verifier.TestMemberIsUndefined(inbound_stream.fec_packets_discarded); + verifier.TestMemberIsUndefined(inbound_stream.fec_ssrc); } verifier.TestMemberIsNonNegative(inbound_stream.bytes_received); verifier.TestMemberIsNonNegative( @@ -700,6 +701,7 @@ class RTCStatsReportVerifier { verifier.TestMemberIsUndefined( inbound_stream.retransmitted_bytes_received); verifier.TestMemberIsUndefined(inbound_stream.rtx_ssrc); + verifier.TestMemberIsUndefined(inbound_stream.fec_ssrc); } // Test runtime too short to get an estimate (at least two RTCP sender diff --git a/stats/rtcstats_objects.cc b/stats/rtcstats_objects.cc index fbd597cf1a..77feaf87ba 100644 --- a/stats/rtcstats_objects.cc +++ b/stats/rtcstats_objects.cc @@ -309,6 +309,7 @@ WEBRTC_RTCSTATS_IMPL( &fec_packets_received, &fec_bytes_received, &fec_packets_discarded, + &fec_ssrc, &bytes_received, &header_bytes_received, &retransmitted_packets_received, @@ -375,6 +376,7 @@ RTCInboundRtpStreamStats::RTCInboundRtpStreamStats(std::string id, fec_packets_received("fecPacketsReceived"), fec_bytes_received("fecBytesReceived"), fec_packets_discarded("fecPacketsDiscarded"), + fec_ssrc("fecSsrc"), bytes_received("bytesReceived"), header_bytes_received("headerBytesReceived"), retransmitted_packets_received("retransmittedPacketsReceived"),