From 8c63a82bf56cce8db03a6c1a24d7f1096e4ca0e2 Mon Sep 17 00:00:00 2001 From: ivoc Date: Fri, 21 Oct 2016 04:10:03 -0700 Subject: [PATCH] Add a placeholder stat for logging the estimated residual echo likelihood. The stat is currently always set to zero until the residual echo detector has landed. BUG=webrtc:6525 Review-Url: https://codereview.webrtc.org/2431443003 Cr-Commit-Position: refs/heads/master@{#14721} --- webrtc/api/call/audio_send_stream.h | 1 + webrtc/api/mediastreaminterface.h | 6 ++++-- webrtc/api/statscollector.cc | 13 ++++++++++--- webrtc/api/statscollector_unittest.cc | 9 +++++++-- webrtc/api/statstypes.cc | 2 ++ webrtc/api/statstypes.h | 1 + webrtc/audio/audio_send_stream.cc | 3 +++ webrtc/audio/audio_send_stream_unittest.cc | 2 ++ webrtc/media/base/mediachannel.h | 2 ++ webrtc/media/engine/webrtcvoiceengine.cc | 1 + webrtc/media/engine/webrtcvoiceengine_unittest.cc | 2 ++ 11 files changed, 35 insertions(+), 7 deletions(-) diff --git a/webrtc/api/call/audio_send_stream.h b/webrtc/api/call/audio_send_stream.h index ae7531cbcb..1956b97bd4 100644 --- a/webrtc/api/call/audio_send_stream.h +++ b/webrtc/api/call/audio_send_stream.h @@ -46,6 +46,7 @@ class AudioSendStream { int32_t echo_delay_std_ms = -1; int32_t echo_return_loss = -100; int32_t echo_return_loss_enhancement = -100; + float residual_echo_likelihood = -1.0f; bool typing_noise_detected = false; }; diff --git a/webrtc/api/mediastreaminterface.h b/webrtc/api/mediastreaminterface.h index 988ee84383..f813dda646 100644 --- a/webrtc/api/mediastreaminterface.h +++ b/webrtc/api/mediastreaminterface.h @@ -195,8 +195,9 @@ class AudioProcessorInterface : public rtc::RefCountInterface { echo_return_loss(0), echo_return_loss_enhancement(0), echo_delay_median_ms(0), - aec_quality_min(0.0), echo_delay_std_ms(0), + aec_quality_min(0.0), + residual_echo_likelihood(0.0f), aec_divergent_filter_fraction(0.0) {} ~AudioProcessorStats() {} @@ -204,8 +205,9 @@ class AudioProcessorInterface : public rtc::RefCountInterface { int echo_return_loss; int echo_return_loss_enhancement; int echo_delay_median_ms; - float aec_quality_min; int echo_delay_std_ms; + float aec_quality_min; + float residual_echo_likelihood; float aec_divergent_filter_fraction; }; diff --git a/webrtc/api/statscollector.cc b/webrtc/api/statscollector.cc index 766e949803..d150045d06 100644 --- a/webrtc/api/statscollector.cc +++ b/webrtc/api/statscollector.cc @@ -103,7 +103,8 @@ void SetAudioProcessingStats(StatsReport* report, int echo_return_loss_enhancement, int echo_delay_median_ms, float aec_quality_min, - int echo_delay_std_ms) { + int echo_delay_std_ms, + float residual_echo_likelihood) { report->AddBoolean(StatsReport::kStatsValueNameTypingNoiseState, typing_noise_detected); if (aec_quality_min >= 0.0f) { @@ -123,6 +124,10 @@ void SetAudioProcessingStats(StatsReport* report, report->AddInt(StatsReport::kStatsValueNameEchoReturnLoss, echo_return_loss); report->AddInt(StatsReport::kStatsValueNameEchoReturnLossEnhancement, echo_return_loss_enhancement); + if (residual_echo_likelihood >= 0.0f) { + report->AddFloat(StatsReport::kStatsValueNameResidualEchoLikelihood, + residual_echo_likelihood); + } } void ExtractStats(const cricket::VoiceReceiverInfo& info, StatsReport* report) { @@ -181,7 +186,8 @@ void ExtractStats(const cricket::VoiceSenderInfo& info, StatsReport* report) { SetAudioProcessingStats( report, info.typing_noise_detected, info.echo_return_loss, info.echo_return_loss_enhancement, info.echo_delay_median_ms, - info.aec_quality_min, info.echo_delay_std_ms); + info.aec_quality_min, info.echo_delay_std_ms, + info.residual_echo_likelihood); RTC_DCHECK_GE(info.audio_level, 0); const IntForAdd ints[] = { @@ -926,7 +932,8 @@ void StatsCollector::UpdateReportFromAudioTrack(AudioTrackInterface* track, SetAudioProcessingStats( report, stats.typing_noise_detected, stats.echo_return_loss, stats.echo_return_loss_enhancement, stats.echo_delay_median_ms, - stats.aec_quality_min, stats.echo_delay_std_ms); + stats.aec_quality_min, stats.echo_delay_std_ms, + stats.residual_echo_likelihood); report->AddFloat(StatsReport::kStatsValueNameAecDivergentFilterFraction, stats.aec_divergent_filter_fraction); diff --git a/webrtc/api/statscollector_unittest.cc b/webrtc/api/statscollector_unittest.cc index 8d5978f66f..866e76fdaa 100644 --- a/webrtc/api/statscollector_unittest.cc +++ b/webrtc/api/statscollector_unittest.cc @@ -402,8 +402,13 @@ void VerifyVoiceSenderInfoReport(const StatsReport* report, &value_in_report)); EXPECT_EQ(rtc::ToString(sinfo.echo_return_loss_enhancement), value_in_report); - EXPECT_TRUE(GetValue( - report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); + EXPECT_TRUE(GetValue(report, + StatsReport::kStatsValueNameResidualEchoLikelihood, + &value_in_report)); + EXPECT_EQ(rtc::ToString(sinfo.residual_echo_likelihood), + value_in_report); + EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAudioInputLevel, + &value_in_report)); EXPECT_EQ(rtc::ToString(sinfo.audio_level), value_in_report); EXPECT_TRUE(GetValue( report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); diff --git a/webrtc/api/statstypes.cc b/webrtc/api/statstypes.cc index 339d5bbaf7..391a938cc7 100644 --- a/webrtc/api/statstypes.cc +++ b/webrtc/api/statstypes.cc @@ -568,6 +568,8 @@ const char* StatsReport::Value::display_name() const { return "googRemoteCandidateType"; case kStatsValueNameRemoteCertificateId: return "remoteCertificateId"; + case kStatsValueNameResidualEchoLikelihood: + return "googResidualEchoLikelihood"; case kStatsValueNameRetransmitBitrate: return "googRetransmitBitrate"; case kStatsValueNameRtt: diff --git a/webrtc/api/statstypes.h b/webrtc/api/statstypes.h index a0a85c91a1..edcfcfd694 100644 --- a/webrtc/api/statstypes.h +++ b/webrtc/api/statstypes.h @@ -198,6 +198,7 @@ class StatsReport { kStatsValueNameRemoteCandidateType, kStatsValueNameRemoteCertificateId, kStatsValueNameRenderDelayMs, + kStatsValueNameResidualEchoLikelihood, kStatsValueNameRetransmitBitrate, kStatsValueNameRtt, kStatsValueNameSecondaryDecodedRate, diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc index fbed0f12af..8925b042b5 100644 --- a/webrtc/audio/audio_send_stream.cc +++ b/webrtc/audio/audio_send_stream.cc @@ -267,6 +267,9 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats() const { stats.echo_return_loss_enhancement = erle; } + // TODO(ivoc): Hook this up to the residual echo detector. + stats.residual_echo_likelihood = 0.0f; + internal::AudioState* audio_state = static_cast(audio_state_.get()); stats.typing_noise_detected = audio_state->typing_noise_detected(); diff --git a/webrtc/audio/audio_send_stream_unittest.cc b/webrtc/audio/audio_send_stream_unittest.cc index c17e8e393c..20bc357c05 100644 --- a/webrtc/audio/audio_send_stream_unittest.cc +++ b/webrtc/audio/audio_send_stream_unittest.cc @@ -41,6 +41,7 @@ const int kEchoDelayMedian = 254; const int kEchoDelayStdDev = -3; const int kEchoReturnLoss = -65; const int kEchoReturnLossEnhancement = 101; +const float kResidualEchoLikelihood = 0.0f; const unsigned int kSpeechInputLevel = 96; const CallStatistics kCallStats = { 1345, 1678, 1901, 1234, 112, 13456, 17890, 1567, -1890, -1123}; @@ -283,6 +284,7 @@ TEST(AudioSendStreamTest, GetStats) { EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms); EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss); EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); + EXPECT_EQ(kResidualEchoLikelihood, stats.residual_echo_likelihood); EXPECT_FALSE(stats.typing_noise_detected); } diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h index 3d21c31e82..f522a5f82b 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -597,6 +597,7 @@ struct VoiceSenderInfo : public MediaSenderInfo { echo_delay_std_ms(0), echo_return_loss(0), echo_return_loss_enhancement(0), + residual_echo_likelihood(0.0f), typing_noise_detected(false) { } @@ -608,6 +609,7 @@ struct VoiceSenderInfo : public MediaSenderInfo { int echo_delay_std_ms; int echo_return_loss; int echo_return_loss_enhancement; + float residual_echo_likelihood; bool typing_noise_detected; }; diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index d1d5827eac..4f6166556a 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -2431,6 +2431,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { sinfo.echo_delay_std_ms = stats.echo_delay_std_ms; sinfo.echo_return_loss = stats.echo_return_loss; sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement; + sinfo.residual_echo_likelihood = stats.residual_echo_likelihood; sinfo.typing_noise_detected = (send_ ? stats.typing_noise_detected : false); info->senders.push_back(sinfo); } diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc index f05254c7c6..b6f3eae0a2 100644 --- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc +++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc @@ -413,6 +413,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { stats.echo_delay_std_ms = 567; stats.echo_return_loss = 890; stats.echo_return_loss_enhancement = 1234; + stats.residual_echo_likelihood = 0.432f; stats.typing_noise_detected = true; return stats; } @@ -440,6 +441,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss); EXPECT_EQ(info.echo_return_loss_enhancement, stats.echo_return_loss_enhancement); + EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood); EXPECT_EQ(info.typing_noise_detected, stats.typing_noise_detected && is_sending); }