From 83e8286c6bbf5a30f8e4a4b373ef708566f9da07 Mon Sep 17 00:00:00 2001 From: "henrik.lundin" Date: Wed, 18 May 2016 05:43:01 -0700 Subject: [PATCH] AEC: Add UMA logging of buffer re-alignment This change adds a UMA log that will be written to when a non-zero delay correction is done in the AEC. The number of elements moved (positive or negative) will be logged to "WebRTC.Audio.AecDelayAdjustmentAgnosticValue" or "WebRTC.Audio.AecDelayAdjustmentSystemValue", depending on whether delay-agnostic AEC is used or not, respectively. BUG=webrtc:5903 Review-Url: https://codereview.webrtc.org/1991723002 Cr-Commit-Position: refs/heads/master@{#12795} --- .../modules/audio_processing/aec/aec_core.cc | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/webrtc/modules/audio_processing/aec/aec_core.cc b/webrtc/modules/audio_processing/aec/aec_core.cc index 2cb6dd2ce7..4c109d7d9c 100644 --- a/webrtc/modules/audio_processing/aec/aec_core.cc +++ b/webrtc/modules/audio_processing/aec/aec_core.cc @@ -33,9 +33,37 @@ extern "C" { #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h" #include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h" #include "webrtc/system_wrappers/include/cpu_features_wrapper.h" +#include "webrtc/system_wrappers/include/metrics.h" #include "webrtc/typedefs.h" namespace webrtc { +namespace { +enum class DelaySource { + kSystemDelay, // The delay values come from the OS. + kDelayAgnostic, // The delay values come from the DA-AEC. +}; + +constexpr int kMinDelayLogValue = -200; +constexpr int kMaxDelayLogValue = 200; +constexpr int kNumDelayLogBuckets = 100; + +void MaybeLogDelayAdjustment(int moved_ms, DelaySource source) { + if (moved_ms == 0) + return; + switch (source) { + case DelaySource::kSystemDelay: + RTC_HISTOGRAM_COUNTS("WebRTC.Audio.AecDelayAdjustmentMsSystemValue", + moved_ms, kMinDelayLogValue, kMaxDelayLogValue, + kNumDelayLogBuckets); + return; + case DelaySource::kDelayAgnostic: + RTC_HISTOGRAM_COUNTS("WebRTC.Audio.AecDelayAdjustmentMsAgnosticValue", + moved_ms, kMinDelayLogValue, kMaxDelayLogValue, + kNumDelayLogBuckets); + return; + } +} +} // namespace // Buffer size (samples) static const size_t kBufSizePartitions = 250; // 1 second of audio in 16 kHz. @@ -1785,11 +1813,15 @@ void WebRtcAec_ProcessFrames(AecCore* aec, // rounding, like -16. int move_elements = (aec->knownDelay - knownDelay - 32) / PART_LEN; int moved_elements = WebRtc_MoveReadPtr(aec->far_time_buf, move_elements); + MaybeLogDelayAdjustment(moved_elements * (aec->sampFreq == 8000 ? 8 : 4), + DelaySource::kSystemDelay); aec->knownDelay -= moved_elements * PART_LEN; } else { // 2 b) Apply signal based delay correction. int move_elements = SignalBasedDelayCorrection(aec); int moved_elements = WebRtc_MoveReadPtr(aec->far_time_buf, move_elements); + MaybeLogDelayAdjustment(moved_elements * (aec->sampFreq == 8000 ? 8 : 4), + DelaySource::kDelayAgnostic); int far_near_buffer_diff = WebRtc_available_read(aec->far_time_buf) - WebRtc_available_read(aec->nearFrBuf) / PART_LEN;