Wiring discard rate of audio FEC/RED packets up to StatsReport.

BUG=webrtc:7903

Change-Id: I0325725be354ab89cfce1d3564936fe5ff93d303
Reviewed-on: https://chromium-review.googlesource.com/559339
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Commit-Queue: Minyue Li <minyue@webrtc.org>
Cr-Original-Commit-Position: refs/heads/master@{#19560}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 0e320ec5baf3a0845cfef5d3a347501093aeeaad
diff --git a/api/statstypes.cc b/api/statstypes.cc
index fb9e1e5..29a171e 100644
--- a/api/statstypes.cc
+++ b/api/statstypes.cc
@@ -590,6 +590,8 @@
       return "googRtt";
     case kStatsValueNameSecondaryDecodedRate:
       return "googSecondaryDecodedRate";
+    case kStatsValueNameSecondaryDiscardedRate:
+      return "googSecondaryDiscardedRate";
     case kStatsValueNameSendPacketsDiscarded:
       return "packetsDiscardedOnSend";
     case kStatsValueNameSpeechExpandRate:
diff --git a/api/statstypes.h b/api/statstypes.h
index 819bfe0..1cc5cda 100644
--- a/api/statstypes.h
+++ b/api/statstypes.h
@@ -210,6 +210,7 @@
     kStatsValueNameRetransmitBitrate,
     kStatsValueNameRtt,
     kStatsValueNameSecondaryDecodedRate,
+    kStatsValueNameSecondaryDiscardedRate,
     kStatsValueNameSendPacketsDiscarded,
     kStatsValueNameSpeechExpandRate,
     kStatsValueNameSrtpCipher,
diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc
index d2200f4..b7ea047 100644
--- a/audio/audio_receive_stream.cc
+++ b/audio/audio_receive_stream.cc
@@ -199,6 +199,7 @@
   stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
   stats.speech_expand_rate = Q14ToFloat(ns.currentSpeechExpandRate);
   stats.secondary_decoded_rate = Q14ToFloat(ns.currentSecondaryDecodedRate);
+  stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
   stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
   stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
 
diff --git a/audio/audio_receive_stream_unittest.cc b/audio/audio_receive_stream_unittest.cc
index 9723ee65..0d58614 100644
--- a/audio/audio_receive_stream_unittest.cc
+++ b/audio/audio_receive_stream_unittest.cc
@@ -327,6 +327,8 @@
             stats.speech_expand_rate);
   EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSecondaryDecodedRate),
             stats.secondary_decoded_rate);
+  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSecondaryDiscardedRate),
+            stats.secondary_discarded_rate);
   EXPECT_EQ(Q14ToFloat(kNetworkStats.currentAccelerateRate),
             stats.accelerate_rate);
   EXPECT_EQ(Q14ToFloat(kNetworkStats.currentPreemptiveRate),
diff --git a/call/audio_receive_stream.h b/call/audio_receive_stream.h
index 78f1bff..fdf1698 100644
--- a/call/audio_receive_stream.h
+++ b/call/audio_receive_stream.h
@@ -64,6 +64,7 @@
     float expand_rate = 0.0f;
     float speech_expand_rate = 0.0f;
     float secondary_decoded_rate = 0.0f;
+    float secondary_discarded_rate = 0.0f;
     float accelerate_rate = 0.0f;
     float preemptive_expand_rate = 0.0f;
     int32_t decoding_calls_to_silence_generator = 0;
diff --git a/common_types.h b/common_types.h
index 843d9b8..fcb4381 100644
--- a/common_types.h
+++ b/common_types.h
@@ -393,7 +393,10 @@
   uint16_t currentAccelerateRate;
   // fraction of data coming from secondary decoding (in Q14)
   uint16_t currentSecondaryDecodedRate;
-  // fraction of secondary data that is discarded (in Q14).
+  // Fraction of secondary data, including FEC and RED, that is discarded (in
+  // Q14). Discarding of secondary data can be caused by the reception of the
+  // primary data, obsoleting the secondary data. It can also be caused by early
+  // or late arrival of secondary data.
   uint16_t currentSecondaryDiscardedRate;
   // clock-drift in parts-per-million (negative or positive)
   int32_t clockDriftPPM;
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h
index 76328ef..99ed291 100644
--- a/media/base/mediachannel.h
+++ b/media/base/mediachannel.h
@@ -658,6 +658,7 @@
         expand_rate(0),
         speech_expand_rate(0),
         secondary_decoded_rate(0),
+        secondary_discarded_rate(0),
         accelerate_rate(0),
         preemptive_expand_rate(0),
         decoding_calls_to_silence_generator(0),
@@ -693,6 +694,12 @@
   float speech_expand_rate;
   // fraction of data out of secondary decoding, including FEC and RED.
   float secondary_decoded_rate;
+  // Fraction of secondary data, including FEC and RED, that is discarded.
+  // Discarding of secondary data can be caused by the reception of the primary
+  // data, obsoleting the secondary data. It can also be caused by early
+  // or late arrival of secondary data. This metric is the percentage of
+  // discarded secondary data since last query of receiver info.
+  float secondary_discarded_rate;
   // Fraction of data removed through time compression.
   float accelerate_rate;
   // Fraction of data inserted through time stretching.
diff --git a/media/engine/webrtcvoiceengine.cc b/media/engine/webrtcvoiceengine.cc
index fdbb5c7..8c45e95 100644
--- a/media/engine/webrtcvoiceengine.cc
+++ b/media/engine/webrtcvoiceengine.cc
@@ -2288,6 +2288,7 @@
     rinfo.expand_rate = stats.expand_rate;
     rinfo.speech_expand_rate = stats.speech_expand_rate;
     rinfo.secondary_decoded_rate = stats.secondary_decoded_rate;
+    rinfo.secondary_discarded_rate = stats.secondary_discarded_rate;
     rinfo.accelerate_rate = stats.accelerate_rate;
     rinfo.preemptive_expand_rate = stats.preemptive_expand_rate;
     rinfo.decoding_calls_to_silence_generator =
diff --git a/media/engine/webrtcvoiceengine_unittest.cc b/media/engine/webrtcvoiceengine_unittest.cc
index 28d09e8..5ccd7d6 100644
--- a/media/engine/webrtcvoiceengine_unittest.cc
+++ b/media/engine/webrtcvoiceengine_unittest.cc
@@ -601,6 +601,7 @@
     stats.expand_rate = 5.67f;
     stats.speech_expand_rate = 8.90f;
     stats.secondary_decoded_rate = 1.23f;
+    stats.secondary_discarded_rate = 0.12f;
     stats.accelerate_rate = 4.56f;
     stats.preemptive_expand_rate = 7.89f;
     stats.decoding_calls_to_silence_generator = 12;
@@ -639,6 +640,7 @@
     EXPECT_EQ(info.expand_rate, stats.expand_rate);
     EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
     EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
+    EXPECT_EQ(info.secondary_discarded_rate, stats.secondary_discarded_rate);
     EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
     EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
     EXPECT_EQ(info.decoding_calls_to_silence_generator,
diff --git a/pc/statscollector.cc b/pc/statscollector.cc
index 2dc2c3b..97bae3d 100644
--- a/pc/statscollector.cc
+++ b/pc/statscollector.cc
@@ -142,6 +142,8 @@
     { StatsReport::kStatsValueNameExpandRate, info.expand_rate },
     { StatsReport::kStatsValueNameSecondaryDecodedRate,
       info.secondary_decoded_rate },
+    { StatsReport::kStatsValueNameSecondaryDiscardedRate,
+      info.secondary_discarded_rate },
     { StatsReport::kStatsValueNameSpeechExpandRate, info.speech_expand_rate },
     { StatsReport::kStatsValueNameAccelerateRate, info.accelerate_rate },
     { StatsReport::kStatsValueNamePreemptiveExpandRate,
diff --git a/pc/statscollector_unittest.cc b/pc/statscollector_unittest.cc
index 0fad6ad..56d4fca 100644
--- a/pc/statscollector_unittest.cc
+++ b/pc/statscollector_unittest.cc
@@ -332,6 +332,11 @@
   EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate,
                        &value_in_report));
   EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report);
+  EXPECT_TRUE(GetValue(report,
+                       StatsReport::kStatsValueNameSecondaryDiscardedRate,
+                       &value_in_report));
+  EXPECT_EQ(rtc::ToString<float>(info.secondary_discarded_rate),
+            value_in_report);
   EXPECT_TRUE(GetValue(
       report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report));
   EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report);
@@ -483,6 +488,7 @@
   voice_receiver_info->secondary_decoded_rate = 123;
   voice_receiver_info->accelerate_rate = 124;
   voice_receiver_info->preemptive_expand_rate = 125;
+  voice_receiver_info->secondary_discarded_rate = 126;
 }
 
 class StatsCollectorForTest : public webrtc::StatsCollector {