Add video send bitrates to histogram stats:
- total bitrate ("WebRTC.Video.BitrateSentInKbps")
- media bitrate ("WebRTC.Video.MediaBitrateSentInKbps")
- rtx bitrate ("WebRTC.Video.RtxBitrateSentInKbps")
- padding bitrate ("WebRTC.Video.PaddingBitrateSentInKbps")
- retransmitted bitrate ("WebRTC.Video.RetransmittedBitrateInKbps")
Add retransmitted bytes to StreamDataCounters.
Change in UpdateRtpStats to also update counters for retransmitted packet.
BUG=crbug/419657
R=mflodman@webrtc.org, stefan@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/30199004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@7838 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/rtp_rtcp/source/receive_statistics_unittest.cc b/modules/rtp_rtcp/source/receive_statistics_unittest.cc
index 808a880..6cc6008 100644
--- a/modules/rtp_rtcp/source/receive_statistics_unittest.cc
+++ b/modules/rtp_rtcp/source/receive_statistics_unittest.cc
@@ -132,6 +132,23 @@
EXPECT_EQ(2u, packets_received);
}
+TEST_F(ReceiveStatisticsTest, GetReceiveStreamDataCounters) {
+ receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
+ StreamStatistician* statistician =
+ receive_statistics_->GetStatistician(kSsrc1);
+ ASSERT_TRUE(statistician != NULL);
+
+ StreamDataCounters counters;
+ statistician->GetReceiveStreamDataCounters(&counters);
+ EXPECT_EQ(1u, counters.packets);
+
+ // GetReceiveStreamDataCounters includes reset counter values.
+ statistician->ResetStatistics();
+ receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
+ statistician->GetReceiveStreamDataCounters(&counters);
+ EXPECT_EQ(2u, counters.packets);
+}
+
TEST_F(ReceiveStatisticsTest, RtcpCallbacks) {
class TestCallback : public RtcpStatisticsCallback {
public:
@@ -232,20 +249,22 @@
++num_calls_;
}
- void ExpectMatches(uint32_t num_calls,
- uint32_t ssrc,
- size_t bytes,
- size_t padding,
- uint32_t packets,
- uint32_t retransmits,
- uint32_t fec) {
+ void Matches(uint32_t num_calls,
+ uint32_t ssrc,
+ const StreamDataCounters& expected) {
EXPECT_EQ(num_calls, num_calls_);
EXPECT_EQ(ssrc, ssrc_);
- EXPECT_EQ(bytes, stats_.bytes);
- EXPECT_EQ(padding, stats_.padding_bytes);
- EXPECT_EQ(packets, stats_.packets);
- EXPECT_EQ(retransmits, stats_.retransmitted_packets);
- EXPECT_EQ(fec, stats_.fec_packets);
+ EXPECT_EQ(expected.bytes, stats_.bytes);
+ EXPECT_EQ(expected.header_bytes, stats_.header_bytes);
+ EXPECT_EQ(expected.padding_bytes, stats_.padding_bytes);
+ EXPECT_EQ(expected.packets, stats_.packets);
+ EXPECT_EQ(expected.retransmitted_bytes, stats_.retransmitted_bytes);
+ EXPECT_EQ(expected.retransmitted_header_bytes,
+ stats_.retransmitted_header_bytes);
+ EXPECT_EQ(expected.retransmitted_padding_bytes,
+ stats_.retransmitted_padding_bytes);
+ EXPECT_EQ(expected.retransmitted_packets, stats_.retransmitted_packets);
+ EXPECT_EQ(expected.fec_packets, stats_.fec_packets);
}
uint32_t num_calls_;
@@ -264,7 +283,17 @@
header1_.headerLength = kHeaderLength;
receive_statistics_->IncomingPacket(
header1_, kPacketSize1 + kHeaderLength, false);
- callback.ExpectMatches(1, kSsrc1, kPacketSize1, 0, 1, 0, 0);
+ StreamDataCounters expected;
+ expected.bytes = kPacketSize1;
+ expected.header_bytes = kHeaderLength;
+ expected.padding_bytes = 0;
+ expected.packets = 1;
+ expected.retransmitted_bytes = 0;
+ expected.retransmitted_header_bytes = 0;
+ expected.retransmitted_padding_bytes = 0;
+ expected.retransmitted_packets = 0;
+ expected.fec_packets = 0;
+ callback.Matches(1, kSsrc1, expected);
++header1_.sequenceNumber;
clock_.AdvanceTimeMilliseconds(5);
@@ -272,14 +301,25 @@
// Another packet of size kPacketSize1 with 9 bytes padding.
receive_statistics_->IncomingPacket(
header1_, kPacketSize1 + kHeaderLength + kPaddingLength, false);
- callback.ExpectMatches(2, kSsrc1, 2 * kPacketSize1, kPaddingLength, 2, 0, 0);
+ expected.bytes = kPacketSize1 * 2;
+ expected.header_bytes = kHeaderLength * 2;
+ expected.padding_bytes = kPaddingLength;
+ expected.packets = 2;
+ callback.Matches(2, kSsrc1, expected);
clock_.AdvanceTimeMilliseconds(5);
// Retransmit last packet.
receive_statistics_->IncomingPacket(
header1_, kPacketSize1 + kHeaderLength + kPaddingLength, true);
- callback.ExpectMatches(
- 3, kSsrc1, 3 * kPacketSize1, kPaddingLength * 2, 3, 1, 0);
+ expected.bytes = kPacketSize1 * 3;
+ expected.header_bytes = kHeaderLength * 3;
+ expected.padding_bytes = kPaddingLength * 2;
+ expected.packets = 3;
+ expected.retransmitted_bytes = kPacketSize1;
+ expected.retransmitted_header_bytes = kHeaderLength;
+ expected.retransmitted_padding_bytes = kPaddingLength;
+ expected.retransmitted_packets = 1;
+ callback.Matches(3, kSsrc1, expected);
header1_.paddingLength = 0;
++header1_.sequenceNumber;
@@ -288,8 +328,11 @@
receive_statistics_->IncomingPacket(
header1_, kPacketSize1 + kHeaderLength, false);
receive_statistics_->FecPacketReceived(kSsrc1);
- callback.ExpectMatches(
- 5, kSsrc1, 4 * kPacketSize1, kPaddingLength * 2, 4, 1, 1);
+ expected.bytes = kPacketSize1 * 4;
+ expected.header_bytes = kHeaderLength * 4;
+ expected.packets = 4;
+ expected.fec_packets = 1;
+ callback.Matches(5, kSsrc1, expected);
receive_statistics_->RegisterRtpStatisticsCallback(NULL);
@@ -298,8 +341,7 @@
clock_.AdvanceTimeMilliseconds(5);
receive_statistics_->IncomingPacket(
header1_, kPacketSize1 + kHeaderLength, true);
- callback.ExpectMatches(
- 5, kSsrc1, 4 * kPacketSize1, kPaddingLength * 2, 4, 1, 1);
+ callback.Matches(5, kSsrc1, expected);
}
TEST_F(ReceiveStatisticsTest, RtpCallbacksFecFirst) {
@@ -315,9 +357,16 @@
header1_.headerLength = kHeaderLength;
receive_statistics_->IncomingPacket(
header1_, kPacketSize1 + kHeaderLength, false);
- callback.ExpectMatches(1, kSsrc1, kPacketSize1, 0, 1, 0, 0);
+ StreamDataCounters expected;
+ expected.bytes = kPacketSize1;
+ expected.header_bytes = kHeaderLength;
+ expected.padding_bytes = 0;
+ expected.packets = 1;
+ expected.fec_packets = 0;
+ callback.Matches(1, kSsrc1, expected);
receive_statistics_->FecPacketReceived(kSsrc1);
- callback.ExpectMatches(2, kSsrc1, kPacketSize1, 0, 1, 0, 1);
+ expected.fec_packets = 1;
+ callback.Matches(2, kSsrc1, expected);
}
} // namespace webrtc