voice_engine: Updates GetEcDelayMetrics() w.r.t. new metric
As of r8230 (https://webrtc-codereview.appspot.com/39739004/) a new Echo Delay Metric was added calculating the fraction of poor values that may cause the AEC to fail. There are currently two methods for GetDelayMetrics() in webrtc::AutioProcessing and one is deprecated. This CL updates - GetEcDelayMetrics() - voe_auto_test - talk/media/(fake)webrtcvoiceengine BUG=N/A TESTED=locally and trybots R=pbos@webrtc.org, tina.legrand@webrtc.org Review URL: https://webrtc-codereview.appspot.com/41749004 Cr-Commit-Position: refs/heads/master@{#8251} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8251 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
		| @@ -1167,7 +1167,8 @@ class FakeWebRtcVoiceEngine | |||||||
|     return 0; |     return 0; | ||||||
|   } |   } | ||||||
|   WEBRTC_STUB(GetEchoMetrics, (int& ERL, int& ERLE, int& RERL, int& A_NLP)); |   WEBRTC_STUB(GetEchoMetrics, (int& ERL, int& ERLE, int& RERL, int& A_NLP)); | ||||||
|   WEBRTC_STUB(GetEcDelayMetrics, (int& delay_median, int& delay_std)); |   WEBRTC_STUB(GetEcDelayMetrics, (int& delay_median, int& delay_std, | ||||||
|  |       float& fraction_poor_delays)); | ||||||
|  |  | ||||||
|   WEBRTC_STUB(StartDebugRecording, (const char* fileNameUTF8)); |   WEBRTC_STUB(StartDebugRecording, (const char* fileNameUTF8)); | ||||||
|   WEBRTC_STUB(StartDebugRecording, (FILE* handle)); |   WEBRTC_STUB(StartDebugRecording, (FILE* handle)); | ||||||
|   | |||||||
| @@ -3323,7 +3323,9 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     int median, std; |     int median, std; | ||||||
|     if (engine()->voe()->processing()->GetEcDelayMetrics(median, std) != -1) { |     float dummy; | ||||||
|  |     if (engine()->voe()->processing()->GetEcDelayMetrics( | ||||||
|  |         median, std, dummy) != -1) { | ||||||
|       echo_delay_median_ms = median; |       echo_delay_median_ms = median; | ||||||
|       echo_delay_std_ms = std; |       echo_delay_std_ms = std; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1575,7 +1575,7 @@ int WebRtcAec_InitAec(AecCore* aec, int sampFreq) { | |||||||
|   aec->num_delay_values = 0; |   aec->num_delay_values = 0; | ||||||
|   aec->delay_median = -1; |   aec->delay_median = -1; | ||||||
|   aec->delay_std = -1; |   aec->delay_std = -1; | ||||||
|   aec->fraction_poor_delays = -1; |   aec->fraction_poor_delays = -1.0f; | ||||||
|  |  | ||||||
|   aec->signal_delay_correction = 0; |   aec->signal_delay_correction = 0; | ||||||
|   aec->previous_delay = -2;  // (-2): Uninitialized. |   aec->previous_delay = -2;  // (-2): Uninitialized. | ||||||
|   | |||||||
| @@ -185,9 +185,11 @@ public: | |||||||
|     virtual int GetEchoMetrics(int& ERL, int& ERLE, int& RERL, int& A_NLP) = 0; |     virtual int GetEchoMetrics(int& ERL, int& ERLE, int& RERL, int& A_NLP) = 0; | ||||||
|  |  | ||||||
|     // Gets the EC internal |delay_median| and |delay_std| in ms between |     // Gets the EC internal |delay_median| and |delay_std| in ms between | ||||||
|     // near-end and far-end. The values are calculated over the time period |     // near-end and far-end. The metric |fraction_poor_delays| is the amount of | ||||||
|     // since the last GetEcDelayMetrics() call. |     // delay values that potentially can break the EC. The values are aggregated | ||||||
|     virtual int GetEcDelayMetrics(int& delay_median, int& delay_std) = 0; |     // over one second and the last updated metrics are returned. | ||||||
|  |     virtual int GetEcDelayMetrics(int& delay_median, int& delay_std, | ||||||
|  |                                   float& fraction_poor_delays) = 0; | ||||||
|  |  | ||||||
|     // Enables recording of Audio Processing (AP) debugging information. |     // Enables recording of Audio Processing (AP) debugging information. | ||||||
|     // The file can later be used for off-line analysis of the AP performance. |     // The file can later be used for off-line analysis of the AP performance. | ||||||
|   | |||||||
| @@ -41,14 +41,17 @@ TEST_F(EcMetricsTest, ManualTestEcMetrics) { | |||||||
|   int erl, erle, rerl, a_nlp; |   int erl, erle, rerl, a_nlp; | ||||||
|   int delay_median = 0; |   int delay_median = 0; | ||||||
|   int delay_std = 0; |   int delay_std = 0; | ||||||
|  |   float fraction_poor_delays = 0; | ||||||
|  |  | ||||||
|   for (int i = 0; i < 5; i++) { |   for (int i = 0; i < 5; i++) { | ||||||
|     Sleep(1000); |     Sleep(1000); | ||||||
|     EXPECT_EQ(0, voe_apm_->GetEchoMetrics(erl, erle, rerl, a_nlp)); |     EXPECT_EQ(0, voe_apm_->GetEchoMetrics(erl, erle, rerl, a_nlp)); | ||||||
|     EXPECT_EQ(0, voe_apm_->GetEcDelayMetrics(delay_median, delay_std)); |     EXPECT_EQ(0, voe_apm_->GetEcDelayMetrics(delay_median, delay_std, | ||||||
|  |                                              fraction_poor_delays)); | ||||||
|     TEST_LOG("    Echo  : ERL=%5d, ERLE=%5d, RERL=%5d, A_NLP=%5d [dB], " |     TEST_LOG("    Echo  : ERL=%5d, ERLE=%5d, RERL=%5d, A_NLP=%5d [dB], " | ||||||
|         " delay median=%3d, delay std=%3d [ms]\n", erl, erle, rerl, a_nlp, |         " delay median=%3d, delay std=%3d [ms], " | ||||||
|         delay_median, delay_std); |         "fraction_poor_delays=%3.1f [%%]\n", erl, erle, rerl, a_nlp, | ||||||
|  |         delay_median, delay_std, fraction_poor_delays * 100); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(false)); |   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(false)); | ||||||
| @@ -63,8 +66,9 @@ TEST_F(EcMetricsTest, GetEcMetricsFailsIfEcNotEnabled) { | |||||||
|  |  | ||||||
| TEST_F(EcMetricsTest, GetEcDelayMetricsFailsIfEcNotEnabled) { | TEST_F(EcMetricsTest, GetEcDelayMetricsFailsIfEcNotEnabled) { | ||||||
|   int dummy = 0; |   int dummy = 0; | ||||||
|  |   float dummy_f = 0; | ||||||
|   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true)); |   EXPECT_EQ(0, voe_apm_->SetEcMetricsStatus(true)); | ||||||
|   EXPECT_EQ(-1, voe_apm_->GetEcDelayMetrics(dummy, dummy)); |   EXPECT_EQ(-1, voe_apm_->GetEcDelayMetrics(dummy, dummy, dummy_f)); | ||||||
|   EXPECT_EQ(VE_APM_ERROR, voe_base_->LastError()); |   EXPECT_EQ(VE_APM_ERROR, voe_base_->LastError()); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -76,8 +80,11 @@ TEST_F(EcMetricsTest, ManualVerifyEcDelayMetrics) { | |||||||
|  |  | ||||||
|   for (int i = 0; i < 5; i++) { |   for (int i = 0; i < 5; i++) { | ||||||
|     int delay, delay_std; |     int delay, delay_std; | ||||||
|     EXPECT_EQ(0, voe_apm_->GetEcDelayMetrics(delay, delay_std)); |     float fraction_poor_delays; | ||||||
|     TEST_LOG("Delay = %d, Delay Std = %d\n", delay, delay_std); |     EXPECT_EQ(0, voe_apm_->GetEcDelayMetrics(delay, delay_std, | ||||||
|  |                                              fraction_poor_delays)); | ||||||
|  |     TEST_LOG("Delay = %d, Delay Std = %d, Fraction poor delays = %3.1f\n", | ||||||
|  |              delay, delay_std, fraction_poor_delays * 100); | ||||||
|     Sleep(1000); |     Sleep(1000); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -921,9 +921,10 @@ int VoEAudioProcessingImpl::GetEchoMetrics(int& ERL, | |||||||
| } | } | ||||||
|  |  | ||||||
| int VoEAudioProcessingImpl::GetEcDelayMetrics(int& delay_median, | int VoEAudioProcessingImpl::GetEcDelayMetrics(int& delay_median, | ||||||
|                                               int& delay_std) { |                                               int& delay_std, | ||||||
|  |                                               float& fraction_poor_delays) { | ||||||
|   WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), |   WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), | ||||||
|                "GetEcDelayMetrics(median=?, std=?)"); |                "GetEcDelayMetrics(median=?, std=?, fraction_poor_delays=?)"); | ||||||
| #ifdef WEBRTC_VOICE_ENGINE_ECHO | #ifdef WEBRTC_VOICE_ENGINE_ECHO | ||||||
|   if (!_shared->statistics().Initialized()) { |   if (!_shared->statistics().Initialized()) { | ||||||
|     _shared->SetLastError(VE_NOT_INITED, kTraceError); |     _shared->SetLastError(VE_NOT_INITED, kTraceError); | ||||||
| @@ -937,9 +938,10 @@ int VoEAudioProcessingImpl::GetEcDelayMetrics(int& delay_median, | |||||||
|  |  | ||||||
|   int median = 0; |   int median = 0; | ||||||
|   int std = 0; |   int std = 0; | ||||||
|  |   float poor_fraction = 0; | ||||||
|   // Get delay-logging values from Audio Processing Module. |   // Get delay-logging values from Audio Processing Module. | ||||||
|   if (_shared->audio_processing()->echo_cancellation()->GetDelayMetrics( |   if (_shared->audio_processing()->echo_cancellation()->GetDelayMetrics( | ||||||
|         &median, &std)) { |         &median, &std, &poor_fraction)) { | ||||||
|     WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1), |     WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1), | ||||||
|                  "GetEcDelayMetrics(), AudioProcessingModule delay-logging " |                  "GetEcDelayMetrics(), AudioProcessingModule delay-logging " | ||||||
|                  "error"); |                  "error"); | ||||||
| @@ -949,10 +951,12 @@ int VoEAudioProcessingImpl::GetEcDelayMetrics(int& delay_median, | |||||||
|   // EC delay-logging metrics |   // EC delay-logging metrics | ||||||
|   delay_median = median; |   delay_median = median; | ||||||
|   delay_std = std; |   delay_std = std; | ||||||
|  |   fraction_poor_delays = poor_fraction; | ||||||
|  |  | ||||||
|   WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1), |   WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1), | ||||||
|                "GetEcDelayMetrics() => delay_median=%d, delay_std=%d", |                "GetEcDelayMetrics() => delay_median=%d, delay_std=%d, " | ||||||
|                delay_median, delay_std); |                "fraction_poor_delays=%f", delay_median, delay_std, | ||||||
|  |                fraction_poor_delays); | ||||||
|   return 0; |   return 0; | ||||||
| #else | #else | ||||||
|   _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError, |   _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError, | ||||||
|   | |||||||
| @@ -76,7 +76,8 @@ class VoEAudioProcessingImpl : public VoEAudioProcessing { | |||||||
|  |  | ||||||
|   virtual int GetEchoMetrics(int& ERL, int& ERLE, int& RERL, int& A_NLP); |   virtual int GetEchoMetrics(int& ERL, int& ERLE, int& RERL, int& A_NLP); | ||||||
|  |  | ||||||
|   virtual int GetEcDelayMetrics(int& delay_median, int& delay_std); |   virtual int GetEcDelayMetrics(int& delay_median, int& delay_std, | ||||||
|  |                                 float& fraction_poor_delays); | ||||||
|  |  | ||||||
|   virtual int StartDebugRecording(const char* fileNameUTF8); |   virtual int StartDebugRecording(const char* fileNameUTF8); | ||||||
|   virtual int StartDebugRecording(FILE* file_handle); |   virtual int StartDebugRecording(FILE* file_handle); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bjornv@webrtc.org
					bjornv@webrtc.org