Index: webrtc/modules/audio_processing/aec3/aec_state.h |
diff --git a/webrtc/modules/audio_processing/aec3/aec_state.h b/webrtc/modules/audio_processing/aec3/aec_state.h |
index 1b00bf55ff4f3f0a15e5e4cc58f81c9f3a560c4a..5192a929c66d26903b14388aeb556001eb62d57c 100644 |
--- a/webrtc/modules/audio_processing/aec3/aec_state.h |
+++ b/webrtc/modules/audio_processing/aec3/aec_state.h |
@@ -31,7 +31,7 @@ class ApmDataDumper; |
// Handles the state and the conditions for the echo removal functionality. |
class AecState { |
public: |
- explicit AecState(float echo_decay); |
+ explicit AecState(float reverb_decay); |
~AecState(); |
// Returns whether the linear filter estimate is usable. |
@@ -78,23 +78,50 @@ class AecState { |
void HandleEchoPathChange(const EchoPathVariability& echo_path_variability); |
// Returns the decay factor for the echo reverberation. |
- // TODO(peah): Make this adaptive. |
- float ReverbDecayFactor() const { return echo_decay_factor_; } |
+ float ReverbDecay() const { return reverb_decay_; } |
// Returns whether the echo suppression gain should be forced to zero. |
bool ForcedZeroGain() const { return force_zero_gain_; } |
+ // Returns whether the echo in the capture signal is audible. |
+ bool InaudibleEcho() const { return echo_audibility_.InaudibleEcho(); } |
+ |
+ // Updates the aec state with the AEC output signal. |
+ void UpdateWithOutput(rtc::ArrayView<const float> e) { |
+ echo_audibility_.UpdateWithOutput(e); |
+ } |
+ |
// Updates the aec state. |
void Update(const std::vector<std::array<float, kFftLengthBy2Plus1>>& |
adaptive_filter_frequency_response, |
+ const std::array<float, kAdaptiveFilterTimeDomainLength>& |
+ adaptive_filter_impulse_response, |
const rtc::Optional<size_t>& external_delay_samples, |
const RenderBuffer& render_buffer, |
const std::array<float, kFftLengthBy2Plus1>& E2_main, |
const std::array<float, kFftLengthBy2Plus1>& Y2, |
rtc::ArrayView<const float> x, |
+ const std::array<float, kBlockSize>& s_main, |
bool echo_leakage_detected); |
private: |
+ class EchoAudibility { |
+ public: |
+ void Update(rtc::ArrayView<const float> x, |
+ const std::array<float, kBlockSize>& s); |
+ void UpdateWithOutput(rtc::ArrayView<const float> e); |
+ bool InaudibleEcho() const { return inaudible_echo_; } |
+ |
+ private: |
+ float max_nearend_ = 0.f; |
+ size_t max_nearend_counter_ = 0; |
+ size_t low_farend_counter_ = 0; |
+ bool inaudible_echo_ = false; |
+ }; |
+ |
+ void UpdateReverb(const std::array<float, kAdaptiveFilterTimeDomainLength>& |
+ impulse_response); |
+ |
static int instance_count_; |
std::unique_ptr<ApmDataDumper> data_dumper_; |
ErlEstimator erl_estimator_; |
@@ -113,7 +140,12 @@ class AecState { |
rtc::Optional<size_t> filter_delay_; |
rtc::Optional<size_t> external_delay_; |
size_t blocks_since_last_saturation_ = 1000; |
- const float echo_decay_factor_; |
+ float reverb_decay_; |
+ float reverb_decay_to_test_ = 0.9f; |
+ float reverb_decay_candidate_ = 0.f; |
+ float reverb_decay_candidate_residual_ = -1.f; |
+ EchoAudibility echo_audibility_; |
+ |
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AecState); |
}; |