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 dae0b46a4547de43543d1cae1f71682d58c8137f..160255c7f45f656ba472555f51d1acfd4ca75e28 100644 |
--- a/webrtc/video/send_statistics_proxy_unittest.cc |
+++ b/webrtc/video/send_statistics_proxy_unittest.cc |
@@ -27,6 +27,7 @@ const uint32_t kSecondSsrc = 42; |
const uint32_t kFirstRtxSsrc = 18; |
const uint32_t kSecondRtxSsrc = 43; |
+const int64_t kMaxPacketDelayMs = 11000; |
const int kMinRequiredSamples = 200; |
const int kQpIdx0 = 21; |
const int kQpIdx1 = 39; |
@@ -111,10 +112,7 @@ class SendStatisticsProxyTest : public ::testing::Test { |
TEST_F(SendStatisticsProxyTest, RtcpStatistics) { |
RtcpStatisticsCallback* callback = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc]; |
// Add statistics with some arbitrary, but unique, numbers. |
@@ -125,10 +123,7 @@ TEST_F(SendStatisticsProxyTest, RtcpStatistics) { |
ssrc_stats.rtcp_stats.jitter = offset + 3; |
callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc); |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc]; |
// Add statistics with some arbitrary, but unique, numbers. |
@@ -169,10 +164,7 @@ TEST_F(SendStatisticsProxyTest, Suspended) { |
TEST_F(SendStatisticsProxyTest, FrameCounts) { |
FrameCountObserver* observer = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
// Add statistics with some arbitrary, but unique, numbers. |
VideoSendStream::StreamStats& stats = expected_.substreams[ssrc]; |
uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats); |
@@ -182,10 +174,7 @@ TEST_F(SendStatisticsProxyTest, FrameCounts) { |
stats.frame_counts = frame_counts; |
observer->FrameCountUpdated(frame_counts, ssrc); |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
// Add statistics with some arbitrary, but unique, numbers. |
VideoSendStream::StreamStats& stats = expected_.substreams[ssrc]; |
uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats); |
@@ -202,10 +191,7 @@ TEST_F(SendStatisticsProxyTest, FrameCounts) { |
TEST_F(SendStatisticsProxyTest, DataCounters) { |
StreamDataCountersCallback* callback = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats; |
// Add statistics with some arbitrary, but unique, numbers. |
size_t offset = ssrc * sizeof(StreamDataCounters); |
@@ -218,10 +204,7 @@ TEST_F(SendStatisticsProxyTest, DataCounters) { |
counters.transmitted.packets = offset_uint32 + 5; |
callback->DataCountersUpdated(counters, ssrc); |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats; |
// Add statistics with some arbitrary, but unique, numbers. |
size_t offset = ssrc * sizeof(StreamDataCounters); |
@@ -241,10 +224,7 @@ TEST_F(SendStatisticsProxyTest, DataCounters) { |
TEST_F(SendStatisticsProxyTest, Bitrate) { |
BitrateStatisticsObserver* observer = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
BitrateStatistics total; |
BitrateStatistics retransmit; |
// Use ssrc as bitrate_bps to get a unique value for each stream. |
@@ -254,10 +234,7 @@ TEST_F(SendStatisticsProxyTest, Bitrate) { |
expected_.substreams[ssrc].total_bitrate_bps = total.bitrate_bps; |
expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit.bitrate_bps; |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
BitrateStatistics total; |
BitrateStatistics retransmit; |
// Use ssrc as bitrate_bps to get a unique value for each stream. |
@@ -274,10 +251,7 @@ TEST_F(SendStatisticsProxyTest, Bitrate) { |
TEST_F(SendStatisticsProxyTest, SendSideDelay) { |
SendSideDelayObserver* observer = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
// Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each |
// stream. |
int avg_delay_ms = ssrc; |
@@ -286,10 +260,7 @@ TEST_F(SendStatisticsProxyTest, SendSideDelay) { |
expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms; |
expected_.substreams[ssrc].max_delay_ms = max_delay_ms; |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
// Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each |
// stream. |
int avg_delay_ms = ssrc; |
@@ -302,6 +273,59 @@ TEST_F(SendStatisticsProxyTest, SendSideDelay) { |
ExpectEqual(expected_, stats); |
} |
+TEST_F(SendStatisticsProxyTest, VerifySendDelayHistogramStats) { |
+ test::ClearHistograms(); |
+ const int64_t kSendDelayInMs = 5; |
+ SendPacketObserver* observer = statistics_proxy_.get(); |
+ const uint32_t ssrc = *config_.rtp.ssrcs.begin(); |
+ |
+ uint16_t packet_id = 0; |
+ for (int i = 0; i < kMinRequiredSamples; ++i) { |
+ observer->OnSendPacket(++packet_id, fake_clock_.TimeInMilliseconds(), ssrc); |
+ // Packet sent to transport. |
+ fake_clock_.AdvanceTimeMilliseconds(kSendDelayInMs); |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(packet_id)); |
+ } |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.SendDelayInMs")); |
+ EXPECT_EQ(kSendDelayInMs, |
+ test::LastHistogramSample("WebRTC.Video.SendDelayInMs")); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, OnSentPacket) { |
+ const uint16_t kPacketId = 2345; |
+ SendPacketObserver* observer = statistics_proxy_.get(); |
+ const uint32_t ssrc = *config_.rtp.ssrcs.begin(); |
+ |
+ observer->OnSendPacket(kPacketId, fake_clock_.TimeInMilliseconds(), ssrc); |
+ fake_clock_.AdvanceTimeMilliseconds(kMaxPacketDelayMs - 1); |
+ observer->OnSendPacket(kPacketId + 1, fake_clock_.TimeInMilliseconds(), ssrc); |
+ |
+ // Verify that packets are found. |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(kPacketId)); |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(kPacketId + 1)); |
+ // Packets found, should have been removed. |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(kPacketId)); |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(kPacketId + 1)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, OnSendPacketRemovesOldPackets) { |
+ SendPacketObserver* observer = statistics_proxy_.get(); |
+ const uint32_t ssrc = *config_.rtp.ssrcs.begin(); |
+ const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); |
+ |
+ observer->OnSendPacket(0xffffu, kCaptureTimeMs, ssrc); |
+ observer->OnSendPacket(0u, kCaptureTimeMs, ssrc); |
+ observer->OnSendPacket(1u, kCaptureTimeMs + 1, ssrc); |
+ fake_clock_.AdvanceTimeMilliseconds(kMaxPacketDelayMs); // 0xffff, 0 -> old. |
+ observer->OnSendPacket(2u, kCaptureTimeMs + 2, ssrc); |
+ |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(0xffffu)); // Old removed. |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(0u)); // Old removed. |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(1u)); |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(2u)); |
+} |
+ |
TEST_F(SendStatisticsProxyTest, OnEncodedFrameTimeMeasured) { |
const int kEncodeTimeMs = 11; |
CpuOveruseMetrics metrics; |