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

Unified Diff: webrtc/video/send_statistics_proxy_unittest.cc

Issue 1478253002: Add histogram stats for send delay for a sent video stream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 8 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
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;

Powered by Google App Engine
This is Rietveld 408576698