diff --git a/talk/app/webrtc/statscollector.cc b/talk/app/webrtc/statscollector.cc index fb1595236..131d581e5 100644 --- a/talk/app/webrtc/statscollector.cc +++ b/talk/app/webrtc/statscollector.cc @@ -129,6 +129,9 @@ void ExtractStats(const cricket::VoiceReceiverInfo& info, StatsReport* report) { { StatsReport::kStatsValueNameSecondaryDecodedRate, info.secondary_decoded_rate }, { StatsReport::kStatsValueNameSpeechExpandRate, info.speech_expand_rate }, + { StatsReport::kStatsValueNameAccelerateRate, info.accelerate_rate }, + { StatsReport::kStatsValueNamePreemptiveExpandRate, + info.preemptive_expand_rate }, }; const IntForAdd ints[] = { diff --git a/talk/app/webrtc/statscollector_unittest.cc b/talk/app/webrtc/statscollector_unittest.cc index 4e2bbedf7..ed035acba 100644 --- a/talk/app/webrtc/statscollector_unittest.cc +++ b/talk/app/webrtc/statscollector_unittest.cc @@ -313,6 +313,12 @@ void VerifyVoiceReceiverInfoReport( EXPECT_TRUE(GetValue( report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report)); EXPECT_EQ(rtc::ToString(info.speech_expand_rate), value_in_report); + EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAccelerateRate, + &value_in_report)); + EXPECT_EQ(rtc::ToString(info.accelerate_rate), value_in_report); + EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNamePreemptiveExpandRate, + &value_in_report)); + EXPECT_EQ(rtc::ToString(info.preemptive_expand_rate), value_in_report); EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, &value_in_report)); EXPECT_EQ(rtc::ToString(info.secondary_decoded_rate), value_in_report); @@ -451,6 +457,8 @@ void InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { voice_receiver_info->expand_rate = 121; voice_receiver_info->speech_expand_rate = 122; voice_receiver_info->secondary_decoded_rate = 123; + voice_receiver_info->accelerate_rate = 124; + voice_receiver_info->preemptive_expand_rate = 125; } class StatsCollectorForTest : public webrtc::StatsCollector { diff --git a/talk/app/webrtc/statstypes.cc b/talk/app/webrtc/statstypes.cc index 582d20336..a90221047 100644 --- a/talk/app/webrtc/statstypes.cc +++ b/talk/app/webrtc/statstypes.cc @@ -408,6 +408,8 @@ const char* StatsReport::Value::display_name() const { return "datachannelid"; // 'goog' prefixed constants. + case kStatsValueNameAccelerateRate: + return "googAccelerateRate"; case kStatsValueNameActiveConnection: return "googActiveConnection"; case kStatsValueNameActualEncBitrate: @@ -544,6 +546,8 @@ const char* StatsReport::Value::display_name() const { return "googNacksReceived"; case kStatsValueNameNacksSent: return "googNacksSent"; + case kStatsValueNamePreemptiveExpandRate: + return "googPreemptiveExpandRate"; case kStatsValueNamePlisReceived: return "googPlisReceived"; case kStatsValueNamePlisSent: diff --git a/talk/app/webrtc/statstypes.h b/talk/app/webrtc/statstypes.h index 9df1de795..c58f39058 100644 --- a/talk/app/webrtc/statstypes.h +++ b/talk/app/webrtc/statstypes.h @@ -131,6 +131,7 @@ class StatsReport { kStatsValueNameTransportId, // Internal StatsValue names. + kStatsValueNameAccelerateRate, kStatsValueNameActualEncBitrate, kStatsValueNameAdaptationChanges, kStatsValueNameAvailableReceiveBandwidth, @@ -197,6 +198,7 @@ class StatsReport { kStatsValueNameNacksSent, kStatsValueNamePlisReceived, kStatsValueNamePlisSent, + kStatsValueNamePreemptiveExpandRate, kStatsValueNamePreferredJitterBufferMs, kStatsValueNameRemoteAddress, kStatsValueNameRemoteCandidateId, diff --git a/talk/media/base/mediachannel.h b/talk/media/base/mediachannel.h index d96fe1c71..b5b246077 100644 --- a/talk/media/base/mediachannel.h +++ b/talk/media/base/mediachannel.h @@ -784,14 +784,15 @@ struct VoiceReceiverInfo : public MediaReceiverInfo { expand_rate(0), speech_expand_rate(0), secondary_decoded_rate(0), + accelerate_rate(0), + preemptive_expand_rate(0), decoding_calls_to_silence_generator(0), decoding_calls_to_neteq(0), decoding_normal(0), decoding_plc(0), decoding_cng(0), decoding_plc_cng(0), - capture_start_ntp_time_ms(-1) { - } + capture_start_ntp_time_ms(-1) {} int ext_seqnum; int jitter_ms; @@ -805,6 +806,10 @@ 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 data removed through time compression. + float accelerate_rate; + // Fraction of data inserted through time stretching. + float preemptive_expand_rate; int decoding_calls_to_silence_generator; int decoding_calls_to_neteq; int decoding_normal; diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc index 7f000ab6b..a429feebf 100644 --- a/talk/media/webrtc/webrtcvoiceengine.cc +++ b/talk/media/webrtc/webrtcvoiceengine.cc @@ -3345,6 +3345,10 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { static_cast(ns.currentSpeechExpandRate) / (1 << 14); rinfo.secondary_decoded_rate = static_cast(ns.currentSecondaryDecodedRate) / (1 << 14); + rinfo.accelerate_rate = + static_cast(ns.currentAccelerateRate) / (1 << 14); + rinfo.preemptive_expand_rate = + static_cast(ns.currentPreemptiveRate) / (1 << 14); } webrtc::AudioDecodingCallStats ds; diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc index 0f2c73a5c..cf8100b06 100644 --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc @@ -2066,6 +2066,12 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) { (1 << 14), info.receivers[0].speech_expand_rate); EXPECT_EQ(static_cast(cricket::kNetStats.currentSecondaryDecodedRate) / (1 << 14), info.receivers[0].secondary_decoded_rate); + EXPECT_EQ( + static_cast(cricket::kNetStats.currentAccelerateRate) / (1 << 14), + info.receivers[0].accelerate_rate); + EXPECT_EQ( + static_cast(cricket::kNetStats.currentPreemptiveRate) / (1 << 14), + info.receivers[0].preemptive_expand_rate); } // Test that we can add and remove receive streams, and do proper send/playout.