diff --git a/webrtc/api/statstypes.cc b/webrtc/api/statstypes.cc index fb9e1e5d75..29a171e933 100644 --- a/webrtc/api/statstypes.cc +++ b/webrtc/api/statstypes.cc @@ -590,6 +590,8 @@ const char* StatsReport::Value::display_name() const { return "googRtt"; case kStatsValueNameSecondaryDecodedRate: return "googSecondaryDecodedRate"; + case kStatsValueNameSecondaryDiscardedRate: + return "googSecondaryDiscardedRate"; case kStatsValueNameSendPacketsDiscarded: return "packetsDiscardedOnSend"; case kStatsValueNameSpeechExpandRate: diff --git a/webrtc/api/statstypes.h b/webrtc/api/statstypes.h index 819bfe03af..1cc5cda2c2 100644 --- a/webrtc/api/statstypes.h +++ b/webrtc/api/statstypes.h @@ -210,6 +210,7 @@ class StatsReport { kStatsValueNameRetransmitBitrate, kStatsValueNameRtt, kStatsValueNameSecondaryDecodedRate, + kStatsValueNameSecondaryDiscardedRate, kStatsValueNameSendPacketsDiscarded, kStatsValueNameSpeechExpandRate, kStatsValueNameSrtpCipher, diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc index d2200f4794..b7ea047a79 100644 --- a/webrtc/audio/audio_receive_stream.cc +++ b/webrtc/audio/audio_receive_stream.cc @@ -199,6 +199,7 @@ webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const { 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/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc index 9723ee65fa..0d58614d09 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -327,6 +327,8 @@ TEST(AudioReceiveStreamTest, GetStats) { 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/webrtc/call/audio_receive_stream.h b/webrtc/call/audio_receive_stream.h index 78f1bffded..fdf1698b6b 100644 --- a/webrtc/call/audio_receive_stream.h +++ b/webrtc/call/audio_receive_stream.h @@ -64,6 +64,7 @@ class AudioReceiveStream { 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/webrtc/common_types.h b/webrtc/common_types.h index 843d9b8584..fcb4381ee7 100644 --- a/webrtc/common_types.h +++ b/webrtc/common_types.h @@ -393,7 +393,10 @@ struct NetworkStatistics { 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/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h index 76328ef440..99ed29169b 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -658,6 +658,7 @@ struct VoiceReceiverInfo : public MediaReceiverInfo { 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 @@ struct VoiceReceiverInfo : public MediaReceiverInfo { 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/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index fdbb5c78ed..8c45e953e4 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -2288,6 +2288,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { 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/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc index 28d09e8af9..5ccd7d6bb6 100644 --- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc +++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc @@ -601,6 +601,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { 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 @@ class WebRtcVoiceEngineTestFake : public testing::Test { 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/webrtc/pc/statscollector.cc b/webrtc/pc/statscollector.cc index 2dc2c3baa5..97bae3d189 100644 --- a/webrtc/pc/statscollector.cc +++ b/webrtc/pc/statscollector.cc @@ -142,6 +142,8 @@ void ExtractStats(const cricket::VoiceReceiverInfo& info, StatsReport* report) { { 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/webrtc/pc/statscollector_unittest.cc b/webrtc/pc/statscollector_unittest.cc index 0fad6adead..56d4fca14d 100644 --- a/webrtc/pc/statscollector_unittest.cc +++ b/webrtc/pc/statscollector_unittest.cc @@ -332,6 +332,11 @@ void VerifyVoiceReceiverInfoReport( EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, &value_in_report)); EXPECT_EQ(rtc::ToString(info.secondary_decoded_rate), value_in_report); + EXPECT_TRUE(GetValue(report, + StatsReport::kStatsValueNameSecondaryDiscardedRate, + &value_in_report)); + EXPECT_EQ(rtc::ToString(info.secondary_discarded_rate), + value_in_report); EXPECT_TRUE(GetValue( report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); EXPECT_EQ(rtc::ToString(info.packets_rcvd), value_in_report); @@ -483,6 +488,7 @@ void InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 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 {