Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Unified Diff: webrtc/video/send_statistics_proxy_unittest.cc

Issue 2536613002: Use RateAccCounter for sent bitrate stats. Reports average of periodically computed stats over a ca… (Closed)
Patch Set: rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/video/send_statistics_proxy.cc ('k') | webrtc/video/stats_counter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/video/send_statistics_proxy_unittest.cc
diff --git a/webrtc/video/send_statistics_proxy_unittest.cc b/webrtc/video/send_statistics_proxy_unittest.cc
index 915b8df17789ecc8b1d170063408739596cfb3fa..778514a083f7a66cafac048b3fa3fd9a57e6847c 100644
--- a/webrtc/video/send_statistics_proxy_unittest.cc
+++ b/webrtc/video/send_statistics_proxy_unittest.cc
@@ -1089,75 +1089,52 @@ TEST_F(SendStatisticsProxyTest, SendBitratesAreReportedWithFlexFecEnabled) {
StreamDataCountersCallback* proxy =
static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-
StreamDataCounters counters;
StreamDataCounters rtx_counters;
- proxy->DataCountersUpdated(counters, kFirstSsrc);
- proxy->DataCountersUpdated(counters, kSecondSsrc);
- proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
- proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
- proxy->DataCountersUpdated(counters, kFlexFecSsrc);
-
- counters.transmitted.header_bytes = 5000;
- counters.transmitted.packets = 20;
- counters.transmitted.padding_bytes = 10000;
- counters.transmitted.payload_bytes = 20000;
- counters.retransmitted.header_bytes = 400;
- counters.retransmitted.packets = 2;
- counters.retransmitted.padding_bytes = 1000;
- counters.retransmitted.payload_bytes = 2000;
- counters.fec = counters.retransmitted;
- rtx_counters.transmitted = counters.transmitted;
- fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
- proxy->DataCountersUpdated(counters, kFirstSsrc);
- proxy->DataCountersUpdated(counters, kSecondSsrc);
- proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
- proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
- proxy->DataCountersUpdated(counters, kFlexFecSsrc);
+ const int kMinRequiredPeriodSamples = 8;
+ const int kPeriodIntervalMs = 2000;
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.padding_bytes += 1000;
+ counters.transmitted.payload_bytes += 2000;
+ counters.retransmitted.packets += 2;
+ counters.retransmitted.header_bytes += 25;
+ counters.retransmitted.padding_bytes += 100;
+ counters.retransmitted.payload_bytes += 250;
+ counters.fec = counters.retransmitted;
+ rtx_counters.transmitted = counters.transmitted;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ proxy->DataCountersUpdated(counters, kSecondSsrc);
+ proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
+ proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
+ proxy->DataCountersUpdated(counters, kFlexFecSsrc);
+ }
- // Reset stats proxy causes histograms to be reported.
statistics_proxy_.reset();
+ // Interval: 3500 bytes * 4 / 2 sec = 7000 bytes / sec = 56 kbps
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.BitrateSentInKbps",
- static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.BitrateSentInKbps", 56));
+ // Interval: 3500 bytes * 2 / 2 sec = 3500 bytes / sec = 28 kbps
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtxBitrateSentInKbps", 28));
+ // Interval: (2000 - 2 * 250) bytes / 2 sec = 1500 bytes / sec = 12 kbps
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps"));
- EXPECT_EQ(1, metrics::NumEvents(
- "WebRTC.Video.MediaBitrateSentInKbps",
- static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.MediaBitrateSentInKbps", 12));
+ // Interval: 1000 bytes * 4 / 2 sec = 2000 bytes / sec = 16 kbps
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.PaddingBitrateSentInKbps",
- static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PaddingBitrateSentInKbps", 16));
+ // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FecBitrateSentInKbps", 3));
+ // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
EXPECT_EQ(1,
metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.RetransmittedBitrateSentInKbps",
- static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
- EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
EXPECT_EQ(
- 1, metrics::NumEvents(
- "WebRTC.Video.RtxBitrateSentInKbps",
- static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
- EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
- EXPECT_EQ(1, metrics::NumEvents(
- "WebRTC.Video.FecBitrateSentInKbps",
- static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
+ 1, metrics::NumEvents("WebRTC.Video.RetransmittedBitrateSentInKbps", 3));
}
TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
@@ -1166,143 +1143,211 @@ TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
StreamDataCounters counters;
StreamDataCounters rtx_counters;
counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
- proxy->DataCountersUpdated(counters, kFirstSsrc);
- proxy->DataCountersUpdated(counters, kSecondSsrc);
- proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
- proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
-
- counters.transmitted.header_bytes = 5000;
- counters.transmitted.packets = 20;
- counters.transmitted.padding_bytes = 10000;
- counters.transmitted.payload_bytes = 20000;
-
- counters.retransmitted.header_bytes = 400;
- counters.retransmitted.packets = 2;
- counters.retransmitted.padding_bytes = 1000;
- counters.retransmitted.payload_bytes = 2000;
- counters.fec = counters.retransmitted;
-
- rtx_counters.transmitted = counters.transmitted;
-
- fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
- proxy->DataCountersUpdated(counters, kFirstSsrc);
- proxy->DataCountersUpdated(counters, kSecondSsrc);
- proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
- proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
+ const int kMinRequiredPeriodSamples = 8;
+ const int kPeriodIntervalMs = 2000;
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.padding_bytes += 1000;
+ counters.transmitted.payload_bytes += 2000;
+ counters.retransmitted.packets += 2;
+ counters.retransmitted.header_bytes += 25;
+ counters.retransmitted.padding_bytes += 100;
+ counters.retransmitted.payload_bytes += 250;
+ counters.fec = counters.retransmitted;
+ rtx_counters.transmitted = counters.transmitted;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ proxy->DataCountersUpdated(counters, kSecondSsrc);
+ proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
+ proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
+ }
// Changing content type causes histograms to be reported.
VideoEncoderConfig config;
config.content_type = VideoEncoderConfig::ContentType::kScreen;
- statistics_proxy_->OnEncoderReconfigured(config, 50);
+ statistics_proxy_->OnEncoderReconfigured(config, 50000);
+ // Interval: 3500 bytes * 4 / 2 sec = 7000 bytes / sec = 56 kbps
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.BitrateSentInKbps",
- static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.BitrateSentInKbps", 56));
+ // Interval: 3500 bytes * 2 / 2 sec = 3500 bytes / sec = 28 kbps
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtxBitrateSentInKbps", 28));
+ // Interval: (2000 - 2 * 250) bytes / 2 sec = 1500 bytes / sec = 12 kbps
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps"));
- EXPECT_EQ(1, metrics::NumEvents(
- "WebRTC.Video.MediaBitrateSentInKbps",
- static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.MediaBitrateSentInKbps", 12));
+ // Interval: 1000 bytes * 4 / 2 sec = 2000 bytes / sec = 16 kbps
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.PaddingBitrateSentInKbps",
- static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PaddingBitrateSentInKbps", 16));
+ // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FecBitrateSentInKbps", 3));
+ // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
EXPECT_EQ(1,
metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.RetransmittedBitrateSentInKbps",
- static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
- EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
EXPECT_EQ(
- 1, metrics::NumEvents(
- "WebRTC.Video.RtxBitrateSentInKbps",
- static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
- EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
- EXPECT_EQ(1, metrics::NumEvents(
- "WebRTC.Video.FecBitrateSentInKbps",
- static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
- // New start time but same counter values.
- proxy->DataCountersUpdated(counters, kFirstSsrc);
- proxy->DataCountersUpdated(counters, kSecondSsrc);
- proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
- proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
+ 1, metrics::NumEvents("WebRTC.Video.RetransmittedBitrateSentInKbps", 3));
+ // New metric counters but same data counters.
// Double counter values, this should result in the same counts as before but
// with new histogram names.
- StreamDataCounters new_counters = counters;
- new_counters.Add(counters);
- StreamDataCounters new_rtx_counters = rtx_counters;
- new_rtx_counters.Add(rtx_counters);
-
- fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
- proxy->DataCountersUpdated(new_counters, kFirstSsrc);
- proxy->DataCountersUpdated(new_counters, kSecondSsrc);
- proxy->DataCountersUpdated(new_rtx_counters, kFirstRtxSsrc);
- proxy->DataCountersUpdated(new_rtx_counters, kSecondRtxSsrc);
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.padding_bytes += 1000;
+ counters.transmitted.payload_bytes += 2000;
+ counters.retransmitted.packets += 2;
+ counters.retransmitted.header_bytes += 25;
+ counters.retransmitted.padding_bytes += 100;
+ counters.retransmitted.payload_bytes += 250;
+ counters.fec = counters.retransmitted;
+ rtx_counters.transmitted = counters.transmitted;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ proxy->DataCountersUpdated(counters, kSecondSsrc);
+ proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
+ proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
+ }
- SetUp(); // Reset stats proxy also causes histograms to be reported.
+ // Reset stats proxy also causes histograms to be reported.
+ statistics_proxy_.reset();
+ // Interval: 3500 bytes * 4 / 2 sec = 7000 bytes / sec = 56 kbps
EXPECT_EQ(1,
metrics::NumSamples("WebRTC.Video.Screenshare.BitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.Screenshare.BitrateSentInKbps",
- static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(
+ 1, metrics::NumEvents("WebRTC.Video.Screenshare.BitrateSentInKbps", 56));
+ // Interval: 3500 bytes * 2 / 2 sec = 3500 bytes / sec = 28 kbps
+ EXPECT_EQ(
+ 1, metrics::NumSamples("WebRTC.Video.Screenshare.RtxBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents(
+ "WebRTC.Video.Screenshare.RtxBitrateSentInKbps", 28));
+ // Interval: (2000 - 2 * 250) bytes / 2 sec = 1500 bytes / sec = 12 kbps
EXPECT_EQ(1, metrics::NumSamples(
"WebRTC.Video.Screenshare.MediaBitrateSentInKbps"));
EXPECT_EQ(1, metrics::NumEvents(
- "WebRTC.Video.Screenshare.MediaBitrateSentInKbps",
- static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ "WebRTC.Video.Screenshare.MediaBitrateSentInKbps", 12));
+ // Interval: 1000 bytes * 4 / 2 sec = 2000 bytes / sec = 16 kbps
EXPECT_EQ(1, metrics::NumSamples(
"WebRTC.Video.Screenshare.PaddingBitrateSentInKbps"));
- EXPECT_EQ(1,
- metrics::NumEvents(
- "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps",
- static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
-
+ EXPECT_EQ(1, metrics::NumEvents(
+ "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps", 16));
+ // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
+ EXPECT_EQ(
+ 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents(
+ "WebRTC.Video.Screenshare.FecBitrateSentInKbps", 3));
+ // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
EXPECT_EQ(1, metrics::NumSamples(
"WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps"));
EXPECT_EQ(1,
metrics::NumEvents(
- "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps",
- static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
+ "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps", 3));
+}
- EXPECT_EQ(
- 1, metrics::NumSamples("WebRTC.Video.Screenshare.RtxBitrateSentInKbps"));
- EXPECT_EQ(
- 1, metrics::NumEvents(
- "WebRTC.Video.Screenshare.RtxBitrateSentInKbps",
- static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
+TEST_F(SendStatisticsProxyTest, RtxBitrateIsZeroWhenEnabledAndNoRtxDataIsSent) {
+ StreamDataCountersCallback* proxy =
+ static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
+ StreamDataCounters counters;
+ StreamDataCounters rtx_counters;
- EXPECT_EQ(
- 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps"));
- EXPECT_EQ(1, metrics::NumEvents(
- "WebRTC.Video.Screenshare.FecBitrateSentInKbps",
- static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
- metrics::kMinRunTimeInSeconds / 1000)));
+ const int kMinRequiredPeriodSamples = 8;
+ const int kPeriodIntervalMs = 2000;
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.payload_bytes += 2000;
+ counters.fec = counters.retransmitted;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ }
+
+ // RTX enabled. No data sent over RTX.
+ statistics_proxy_.reset();
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtxBitrateSentInKbps", 0));
+}
+
+TEST_F(SendStatisticsProxyTest, RtxBitrateNotReportedWhenNotEnabled) {
+ VideoSendStream::Config config(nullptr);
+ config.rtp.ssrcs.push_back(kFirstSsrc); // RTX not configured.
+ statistics_proxy_.reset(new SendStatisticsProxy(
+ &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
+
+ StreamDataCountersCallback* proxy =
+ static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
+ StreamDataCounters counters;
+
+ const int kMinRequiredPeriodSamples = 8;
+ const int kPeriodIntervalMs = 2000;
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.payload_bytes += 2000;
+ counters.fec = counters.retransmitted;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ }
+
+ // RTX not enabled.
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
+}
+
+TEST_F(SendStatisticsProxyTest, FecBitrateIsZeroWhenEnabledAndNoFecDataIsSent) {
+ StreamDataCountersCallback* proxy =
+ static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
+ StreamDataCounters counters;
+ StreamDataCounters rtx_counters;
+
+ const int kMinRequiredPeriodSamples = 8;
+ const int kPeriodIntervalMs = 2000;
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.payload_bytes += 2000;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ }
+
+ // FEC enabled. No FEC data sent.
+ statistics_proxy_.reset();
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FecBitrateSentInKbps", 0));
+}
+
+TEST_F(SendStatisticsProxyTest, FecBitrateNotReportedWhenNotEnabled) {
+ VideoSendStream::Config config(nullptr);
+ config.rtp.ssrcs.push_back(kFirstSsrc); // FEC not configured.
+ statistics_proxy_.reset(new SendStatisticsProxy(
+ &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
+
+ StreamDataCountersCallback* proxy =
+ static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
+ StreamDataCounters counters;
+
+ const int kMinRequiredPeriodSamples = 8;
+ const int kPeriodIntervalMs = 2000;
+ for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
+ counters.transmitted.packets += 20;
+ counters.transmitted.header_bytes += 500;
+ counters.transmitted.payload_bytes += 2000;
+ counters.fec = counters.retransmitted;
+ // Advance one interval and update counters.
+ fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
+ proxy->DataCountersUpdated(counters, kFirstSsrc);
+ }
+
+ // FEC not enabled.
+ statistics_proxy_.reset();
+ EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
}
} // namespace webrtc
« no previous file with comments | « webrtc/video/send_statistics_proxy.cc ('k') | webrtc/video/stats_counter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698