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