stats: implement fecSsrc on inbound-rtp

which is present if a fec mechanism like FlexFEC is negotiated

spec change:
  https://github.com/w3c/webrtc-stats/pull/765

BUG=webrtc:15250

Change-Id: I7d71d49fab0153d734f22831e6684d2acfc647fb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/314981
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@microsoft.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40514}
This commit is contained in:
Philipp Hancke 2023-08-04 11:12:46 +02:00 committed by WebRTC LUCI CQ
parent b17806a4cf
commit e2e04513e7
5 changed files with 14 additions and 0 deletions

View File

@ -250,6 +250,8 @@ class RTC_EXPORT RTCInboundRtpStreamStats final
RTCStatsMember<uint64_t> fec_packets_received; RTCStatsMember<uint64_t> fec_packets_received;
RTCStatsMember<uint64_t> fec_bytes_received; RTCStatsMember<uint64_t> fec_bytes_received;
RTCStatsMember<uint64_t> fec_packets_discarded; RTCStatsMember<uint64_t> fec_packets_discarded;
// Inbound FEC SSRC. Only present if a mechanism like FlexFEC is negotiated.
RTCStatsMember<uint32_t> fec_ssrc;
RTCStatsMember<uint64_t> bytes_received; RTCStatsMember<uint64_t> bytes_received;
RTCStatsMember<uint64_t> header_bytes_received; RTCStatsMember<uint64_t> header_bytes_received;
// Inbound RTX stats. Only defined when RTX is used and it is therefore // Inbound RTX stats. Only defined when RTX is used and it is therefore

View File

@ -681,6 +681,11 @@ CreateInboundRTPStreamStatsFromVideoReceiverInfo(
if (ssrc_group.semantics == cricket::kFidSsrcGroupSemantics && if (ssrc_group.semantics == cricket::kFidSsrcGroupSemantics &&
ssrc_group.ssrcs.size() == 2) { ssrc_group.ssrcs.size() == 2) {
inbound_video->rtx_ssrc = ssrc_group.ssrcs[1]; 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];
} }
} }

View File

@ -2370,6 +2370,8 @@ TEST_F(RTCStatsCollectorTest, CollectRTCInboundRtpStreamStats_Video) {
video_media_info.receivers[0].fec_bytes_received = 54; video_media_info.receivers[0].fec_bytes_received = 54;
video_media_info.receivers[0].ssrc_groups.push_back( video_media_info.receivers[0].ssrc_groups.push_back(
{cricket::kFidSsrcGroupSemantics, {1, 4404}}); {cricket::kFidSsrcGroupSemantics, {1, 4404}});
video_media_info.receivers[0].ssrc_groups.push_back(
{cricket::kFecFrSsrcGroupSemantics, {1, 5505}});
// Note: these two values intentionally differ, // Note: these two values intentionally differ,
// only the decoded one should show up. // 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_packets_received = 32;
expected_video.fec_bytes_received = 54; expected_video.fec_bytes_received = 54;
expected_video.rtx_ssrc = 4404; expected_video.rtx_ssrc = 4404;
expected_video.fec_ssrc = 5505;
ASSERT_TRUE(report->Get(expected_video.id())); ASSERT_TRUE(report->Get(expected_video.id()));
EXPECT_EQ( EXPECT_EQ(

View File

@ -617,6 +617,7 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined(inbound_stream.fec_bytes_received); verifier.TestMemberIsUndefined(inbound_stream.fec_bytes_received);
verifier.TestMemberIsUndefined(inbound_stream.fec_packets_received); verifier.TestMemberIsUndefined(inbound_stream.fec_packets_received);
verifier.TestMemberIsUndefined(inbound_stream.fec_packets_discarded); verifier.TestMemberIsUndefined(inbound_stream.fec_packets_discarded);
verifier.TestMemberIsUndefined(inbound_stream.fec_ssrc);
} }
verifier.TestMemberIsNonNegative<uint64_t>(inbound_stream.bytes_received); verifier.TestMemberIsNonNegative<uint64_t>(inbound_stream.bytes_received);
verifier.TestMemberIsNonNegative<uint64_t>( verifier.TestMemberIsNonNegative<uint64_t>(
@ -700,6 +701,7 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined( verifier.TestMemberIsUndefined(
inbound_stream.retransmitted_bytes_received); inbound_stream.retransmitted_bytes_received);
verifier.TestMemberIsUndefined(inbound_stream.rtx_ssrc); 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 // Test runtime too short to get an estimate (at least two RTCP sender

View File

@ -309,6 +309,7 @@ WEBRTC_RTCSTATS_IMPL(
&fec_packets_received, &fec_packets_received,
&fec_bytes_received, &fec_bytes_received,
&fec_packets_discarded, &fec_packets_discarded,
&fec_ssrc,
&bytes_received, &bytes_received,
&header_bytes_received, &header_bytes_received,
&retransmitted_packets_received, &retransmitted_packets_received,
@ -375,6 +376,7 @@ RTCInboundRtpStreamStats::RTCInboundRtpStreamStats(std::string id,
fec_packets_received("fecPacketsReceived"), fec_packets_received("fecPacketsReceived"),
fec_bytes_received("fecBytesReceived"), fec_bytes_received("fecBytesReceived"),
fec_packets_discarded("fecPacketsDiscarded"), fec_packets_discarded("fecPacketsDiscarded"),
fec_ssrc("fecSsrc"),
bytes_received("bytesReceived"), bytes_received("bytesReceived"),
header_bytes_received("headerBytesReceived"), header_bytes_received("headerBytesReceived"),
retransmitted_packets_received("retransmittedPacketsReceived"), retransmitted_packets_received("retransmittedPacketsReceived"),