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}
This commit is contained in:
ivoc
2016-10-21 04:10:03 -07:00
committed by Commit bot
parent 3355f6d6f5
commit 8c63a82bf5
11 changed files with 35 additions and 7 deletions

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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);

View File

@ -402,8 +402,13 @@ void VerifyVoiceSenderInfoReport(const StatsReport* report,
&value_in_report));
EXPECT_EQ(rtc::ToString<int>(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<float>(sinfo.residual_echo_likelihood),
value_in_report);
EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAudioInputLevel,
&value_in_report));
EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report);
EXPECT_TRUE(GetValue(
report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report));

View File

@ -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:

View File

@ -198,6 +198,7 @@ class StatsReport {
kStatsValueNameRemoteCandidateType,
kStatsValueNameRemoteCertificateId,
kStatsValueNameRenderDelayMs,
kStatsValueNameResidualEchoLikelihood,
kStatsValueNameRetransmitBitrate,
kStatsValueNameRtt,
kStatsValueNameSecondaryDecodedRate,

View File

@ -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<internal::AudioState*>(audio_state_.get());
stats.typing_noise_detected = audio_state->typing_noise_detected();

View File

@ -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);
}

View File

@ -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;
};

View File

@ -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);
}

View File

@ -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);
}