| 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 a467f6c5d102aeb75dc1c16449b3eed45fa60d9e..f88d026516ca201ae0303d75dfebdf0c7a9f1051 100644
|
| --- a/webrtc/video/send_statistics_proxy_unittest.cc
|
| +++ b/webrtc/video/send_statistics_proxy_unittest.cc
|
| @@ -25,6 +25,7 @@ const uint32_t kFirstSsrc = 17;
|
| const uint32_t kSecondSsrc = 42;
|
| const uint32_t kFirstRtxSsrc = 18;
|
| const uint32_t kSecondRtxSsrc = 43;
|
| +const uint32_t kFlexFecSsrc = 55;
|
|
|
| const int kQpIdx0 = 21;
|
| const int kQpIdx1 = 39;
|
| @@ -60,6 +61,25 @@ class SendStatisticsProxyTest : public ::testing::Test {
|
| return config;
|
| }
|
|
|
| + VideoSendStream::Config GetTestConfigWithFlexFec() {
|
| + VideoSendStream::Config config(nullptr);
|
| + config.rtp.ssrcs.push_back(kFirstSsrc);
|
| + config.rtp.ssrcs.push_back(kSecondSsrc);
|
| + config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc);
|
| + config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc);
|
| + config.rtp.flexfec.flexfec_payload_type = 50;
|
| + config.rtp.flexfec.flexfec_ssrc = kFlexFecSsrc;
|
| + return config;
|
| + }
|
| +
|
| + VideoSendStream::StreamStats GetStreamStats(uint32_t ssrc) {
|
| + VideoSendStream::Stats stats = statistics_proxy_->GetStats();
|
| + std::map<uint32_t, VideoSendStream::StreamStats>::iterator it =
|
| + stats.substreams.find(ssrc);
|
| + EXPECT_NE(it, stats.substreams.end());
|
| + return it->second;
|
| + }
|
| +
|
| void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) {
|
| EXPECT_EQ(one.input_frame_rate, other.input_frame_rate);
|
| EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate);
|
| @@ -824,6 +844,99 @@ TEST_F(SendStatisticsProxyTest, ResetsRtcpCountersOnContentChange) {
|
| 4 * 100 / 5));
|
| }
|
|
|
| +TEST_F(SendStatisticsProxyTest, GetStatsReportsIsFlexFec) {
|
| + statistics_proxy_.reset(
|
| + new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(),
|
| + VideoEncoderConfig::ContentType::kRealtimeVideo));
|
| +
|
| + StreamDataCountersCallback* proxy =
|
| + static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
|
| + StreamDataCounters counters;
|
| + proxy->DataCountersUpdated(counters, kFirstSsrc);
|
| + proxy->DataCountersUpdated(counters, kFlexFecSsrc);
|
| +
|
| + EXPECT_FALSE(GetStreamStats(kFirstSsrc).is_flexfec);
|
| + EXPECT_TRUE(GetStreamStats(kFlexFecSsrc).is_flexfec);
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest, SendBitratesAreReportedWithFlexFecEnabled) {
|
| + statistics_proxy_.reset(
|
| + new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(),
|
| + VideoEncoderConfig::ContentType::kRealtimeVideo));
|
| +
|
| + 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);
|
| +
|
| + // Reset stats proxy causes histograms to be reported.
|
| + statistics_proxy_.reset();
|
| + 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::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::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::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)));
|
| +}
|
| +
|
| TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
|
| StreamDataCountersCallback* proxy =
|
| static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
|
| @@ -835,15 +948,15 @@ TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
|
| proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
|
| proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
|
|
|
| - counters.transmitted.header_bytes = 400;
|
| + counters.transmitted.header_bytes = 5000;
|
| counters.transmitted.packets = 20;
|
| - counters.transmitted.padding_bytes = 1000;
|
| - counters.transmitted.payload_bytes = 2000;
|
| + counters.transmitted.padding_bytes = 10000;
|
| + counters.transmitted.payload_bytes = 20000;
|
|
|
| - counters.retransmitted.header_bytes = 40;
|
| + counters.retransmitted.header_bytes = 400;
|
| counters.retransmitted.packets = 2;
|
| - counters.retransmitted.padding_bytes = 100;
|
| - counters.retransmitted.payload_bytes = 200;
|
| + counters.retransmitted.padding_bytes = 1000;
|
| + counters.retransmitted.payload_bytes = 2000;
|
|
|
| counters.fec = counters.retransmitted;
|
|
|
| @@ -898,7 +1011,7 @@ TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
|
| EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
|
| EXPECT_EQ(1, metrics::NumEvents(
|
| "WebRTC.Video.FecBitrateSentInKbps",
|
| - static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) /
|
| + static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
|
| metrics::kMinRunTimeInSeconds / 1000)));
|
|
|
| // New start time but same counter values.
|
| @@ -965,7 +1078,7 @@ TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
|
| 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps"));
|
| EXPECT_EQ(1, metrics::NumEvents(
|
| "WebRTC.Video.Screenshare.FecBitrateSentInKbps",
|
| - static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) /
|
| + static_cast<int>((counters.fec.TotalBytes() * 2 * 8) /
|
| metrics::kMinRunTimeInSeconds / 1000)));
|
| }
|
|
|
|
|