AEC3: Move option for reverb model in nonlinaer mode into AEC3 config

This adds a config parameter for reverb modelling in nonlinear mode.
The killswitch is preserved, and will have the same effect before and after this CL.

Tested: Bitexact on a large number of aecdumps both with and without WebRTC-Aec3NonlinearModeReverbKillSwitch.
Bug: webrtc:8671
Change-Id: I7b2fa92307af5316dbe895392367abb8d15f06bf
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/183541
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32298}
diff --git a/api/audio/echo_canceller3_config.h b/api/audio/echo_canceller3_config.h
index a505625..7f416c1 100644
--- a/api/audio/echo_canceller3_config.h
+++ b/api/audio/echo_canceller3_config.h
@@ -143,6 +143,7 @@
     float noise_gate_slope = 0.3f;
     size_t render_pre_window_size = 1;
     size_t render_post_window_size = 1;
+    bool model_reverb_in_nonlinear_mode = true;
   } echo_model;
 
   struct ComfortNoise {
diff --git a/api/audio/echo_canceller3_config_json.cc b/api/audio/echo_canceller3_config_json.cc
index f5c1249..6a99630 100644
--- a/api/audio/echo_canceller3_config_json.cc
+++ b/api/audio/echo_canceller3_config_json.cc
@@ -302,6 +302,8 @@
               &cfg.echo_model.render_pre_window_size);
     ReadParam(section, "render_post_window_size",
               &cfg.echo_model.render_post_window_size);
+    ReadParam(section, "model_reverb_in_nonlinear_mode",
+              &cfg.echo_model.model_reverb_in_nonlinear_mode);
   }
 
   if (rtc::GetValueFromJsonObject(aec3_root, "comfort_noise", &section)) {
@@ -585,7 +587,9 @@
   ost << "\"render_pre_window_size\": "
       << config.echo_model.render_pre_window_size << ",";
   ost << "\"render_post_window_size\": "
-      << config.echo_model.render_post_window_size;
+      << config.echo_model.render_post_window_size << ",";
+  ost << "\"model_reverb_in_nonlinear_mode\": "
+      << (config.echo_model.model_reverb_in_nonlinear_mode ? "true" : "false");
   ost << "},";
 
   ost << "\"comfort_noise\": {";
diff --git a/api/audio/test/echo_canceller3_config_json_unittest.cc b/api/audio/test/echo_canceller3_config_json_unittest.cc
index a149c17..4a952fe 100644
--- a/api/audio/test/echo_canceller3_config_json_unittest.cc
+++ b/api/audio/test/echo_canceller3_config_json_unittest.cc
@@ -22,6 +22,7 @@
   cfg.filter.refined.error_floor = 2.f;
   cfg.filter.coarse_initial.length_blocks = 3u;
   cfg.comfort_noise.noise_floor_dbfs = 100.f;
+  cfg.echo_model.model_reverb_in_nonlinear_mode = false;
   cfg.suppressor.normal_tuning.mask_hf.enr_suppress = .5f;
   cfg.suppressor.subband_nearend_detection.nearend_average_blocks = 3;
   cfg.suppressor.subband_nearend_detection.subband1 = {1, 3};
@@ -48,6 +49,8 @@
             cfg_transformed.filter.refined.error_floor);
   EXPECT_EQ(cfg.comfort_noise.noise_floor_dbfs,
             cfg_transformed.comfort_noise.noise_floor_dbfs);
+  EXPECT_EQ(cfg.echo_model.model_reverb_in_nonlinear_mode,
+            cfg_transformed.echo_model.model_reverb_in_nonlinear_mode);
   EXPECT_EQ(cfg.suppressor.normal_tuning.mask_hf.enr_suppress,
             cfg_transformed.suppressor.normal_tuning.mask_hf.enr_suppress);
   EXPECT_EQ(cfg.suppressor.subband_nearend_detection.nearend_average_blocks,
diff --git a/modules/audio_processing/aec3/echo_canceller3.cc b/modules/audio_processing/aec3/echo_canceller3.cc
index d96abc9..a3f14f1 100644
--- a/modules/audio_processing/aec3/echo_canceller3.cc
+++ b/modules/audio_processing/aec3/echo_canceller3.cc
@@ -378,6 +378,10 @@
     adjusted_cfg.render_levels.active_render_limit = 30.f;
   }
 
+  if (field_trial::IsEnabled("WebRTC-Aec3NonlinearModeReverbKillSwitch")) {
+    adjusted_cfg.echo_model.model_reverb_in_nonlinear_mode = false;
+  }
+
   // Field-trial based override for the whole suppressor tuning.
   const std::string suppressor_tuning_override_trial_name =
       field_trial::FindFullName("WebRTC-Aec3SuppressorTuningOverride");
diff --git a/modules/audio_processing/aec3/residual_echo_estimator.cc b/modules/audio_processing/aec3/residual_echo_estimator.cc
index e0de375..46db233 100644
--- a/modules/audio_processing/aec3/residual_echo_estimator.cc
+++ b/modules/audio_processing/aec3/residual_echo_estimator.cc
@@ -23,10 +23,6 @@
 namespace webrtc {
 namespace {
 
-bool ModelReverbInNonlinearMode() {
-  return !field_trial::IsEnabled("WebRTC-Aec3NonlinearModeReverbKillSwitch");
-}
-
 constexpr float kDefaultTransparentModeGain = 0.f;
 
 float GetTransparentModeGain() {
@@ -181,8 +177,7 @@
       early_reflections_general_gain_(
           GetEarlyReflectionsDefaultModeGain(config_.ep_strength)),
       late_reflections_general_gain_(
-          GetLateReflectionsDefaultModeGain(config_.ep_strength)),
-      model_reverb_in_nonlinear_mode_(ModelReverbInNonlinearMode()) {
+          GetLateReflectionsDefaultModeGain(config_.ep_strength)) {
   Reset();
 }
 
@@ -250,7 +245,8 @@
       NonLinearEstimate(echo_path_gain, X2, R2);
     }
 
-    if (model_reverb_in_nonlinear_mode_ && !aec_state.TransparentModeActive()) {
+    if (config_.echo_model.model_reverb_in_nonlinear_mode &&
+        !aec_state.TransparentModeActive()) {
       AddReverb(ReverbType::kNonLinear, aec_state, render_buffer, R2);
     }
   }
diff --git a/modules/audio_processing/aec3/residual_echo_estimator.h b/modules/audio_processing/aec3/residual_echo_estimator.h
index 081cc06..8fe7a84 100644
--- a/modules/audio_processing/aec3/residual_echo_estimator.h
+++ b/modules/audio_processing/aec3/residual_echo_estimator.h
@@ -68,7 +68,6 @@
   const float late_reflections_transparent_mode_gain_;
   const float early_reflections_general_gain_;
   const float late_reflections_general_gain_;
-  const bool model_reverb_in_nonlinear_mode_;
   std::array<float, kFftLengthBy2Plus1> X2_noise_floor_;
   std::array<int, kFftLengthBy2Plus1> X2_noise_floor_counter_;
   ReverbModel echo_reverb_;