diff --git a/data/audio_processing/output_data_float.pb b/data/audio_processing/output_data_float.pb index 18a206eacb..aff94fa9f6 100644 Binary files a/data/audio_processing/output_data_float.pb and b/data/audio_processing/output_data_float.pb differ diff --git a/data/audio_processing/output_data_mac.pb b/data/audio_processing/output_data_mac.pb index a6a88f9fb2..78d0e10965 100644 Binary files a/data/audio_processing/output_data_mac.pb and b/data/audio_processing/output_data_mac.pb differ diff --git a/webrtc/modules/audio_processing/utility/delay_estimator.cc b/webrtc/modules/audio_processing/utility/delay_estimator.cc index 15a67472b1..56bdde890c 100644 --- a/webrtc/modules/audio_processing/utility/delay_estimator.cc +++ b/webrtc/modules/audio_processing/utility/delay_estimator.cc @@ -13,6 +13,7 @@ #include #include #include +#include // Number of right shifts for scaling is linearly depending on number of bits in // the far-end binary spectrum. @@ -618,15 +619,29 @@ int WebRtc_ProcessBinarySpectrum(BinaryDelayEstimator* self, ((value_best_candidate < self->minimum_probability) || (value_best_candidate < self->last_delay_probability))); - UpdateRobustValidationStatistics(self, candidate_delay, valley_depth, - value_best_candidate); + // Check for nonstationary farend signal. + const bool non_stationary_farend = + std::any_of(self->farend->far_bit_counts, + self->farend->far_bit_counts + self->history_size, + [](int a) { return a > 0; }); + + if (non_stationary_farend) { + // Only update the validation statistics when the farend is nonstationary + // as the underlying estimates are otherwise frozen. + UpdateRobustValidationStatistics(self, candidate_delay, valley_depth, + value_best_candidate); + } + if (self->robust_validation_enabled) { int is_histogram_valid = HistogramBasedValidation(self, candidate_delay); valid_candidate = RobustValidation(self, candidate_delay, valid_candidate, is_histogram_valid); } - if (valid_candidate) { + + // Only update the delay estimate when the farend is nonstationary and when + // a valid delay candidate is available. + if (non_stationary_farend && valid_candidate) { if (candidate_delay != self->last_delay) { self->last_delay_histogram = (self->histogram[candidate_delay] > kLastHistogramMax ?