blob: 3567b5b7320669f4e2c70b3b57a90da8615ee238 [file] [log] [blame]
Per Åhgrenb6b00dc2018-02-20 22:18:27 +01001/*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#include "api/audio/echo_canceller3_config.h"
11
Sam Zackrissona4c85142018-10-10 10:44:43 +020012#include <algorithm>
13
Yves Gerey988cc082018-10-23 12:03:01 +020014#include "rtc_base/checks.h"
Sam Zackrissona4c85142018-10-10 10:44:43 +020015#include "rtc_base/numerics/safe_minmax.h"
16
Per Åhgrenb6b00dc2018-02-20 22:18:27 +010017namespace webrtc {
Sam Zackrissona4c85142018-10-10 10:44:43 +020018namespace {
19bool Limit(float* value, float min, float max) {
20 float clamped = rtc::SafeClamp(*value, min, max);
21 bool res = *value == clamped;
22 *value = clamped;
23 return res;
24}
25
26bool Limit(size_t* value, size_t min, size_t max) {
27 size_t clamped = rtc::SafeClamp(*value, min, max);
28 bool res = *value == clamped;
29 *value = clamped;
30 return res;
31}
32
33bool Limit(int* value, int min, int max) {
34 int clamped = rtc::SafeClamp(*value, min, max);
35 bool res = *value == clamped;
36 *value = clamped;
37 return res;
38}
39} // namespace
Per Åhgrenb6b00dc2018-02-20 22:18:27 +010040
41EchoCanceller3Config::EchoCanceller3Config() = default;
Per Åhgren251c7352018-03-28 16:31:57 +020042EchoCanceller3Config::EchoCanceller3Config(const EchoCanceller3Config& e) =
43 default;
Per Åhgren398689f2018-08-23 11:38:27 +020044EchoCanceller3Config::Delay::Delay() = default;
45EchoCanceller3Config::Delay::Delay(const EchoCanceller3Config::Delay& e) =
46 default;
47
Jesús de Vicente Peñadd092872018-05-25 16:55:11 +020048EchoCanceller3Config::EchoModel::EchoModel() = default;
49EchoCanceller3Config::EchoModel::EchoModel(
50 const EchoCanceller3Config::EchoModel& e) = default;
51
Per Åhgren524e8782018-08-24 22:48:49 +020052EchoCanceller3Config::Suppressor::Suppressor() = default;
53EchoCanceller3Config::Suppressor::Suppressor(
54 const EchoCanceller3Config::Suppressor& e) = default;
55
56EchoCanceller3Config::Suppressor::MaskingThresholds::MaskingThresholds(
57 float enr_transparent,
58 float enr_suppress,
59 float emr_transparent)
60 : enr_transparent(enr_transparent),
61 enr_suppress(enr_suppress),
62 emr_transparent(emr_transparent) {}
63EchoCanceller3Config::Suppressor::Suppressor::MaskingThresholds::
64 MaskingThresholds(
65 const EchoCanceller3Config::Suppressor::MaskingThresholds& e) = default;
66
67EchoCanceller3Config::Suppressor::Tuning::Tuning(MaskingThresholds mask_lf,
68 MaskingThresholds mask_hf,
69 float max_inc_factor,
70 float max_dec_factor_lf)
71 : mask_lf(mask_lf),
72 mask_hf(mask_hf),
73 max_inc_factor(max_inc_factor),
74 max_dec_factor_lf(max_dec_factor_lf) {}
75EchoCanceller3Config::Suppressor::Tuning::Tuning(
76 const EchoCanceller3Config::Suppressor::Tuning& e) = default;
77
Sam Zackrissona4c85142018-10-10 10:44:43 +020078bool EchoCanceller3Config::Validate(EchoCanceller3Config* config) {
79 RTC_DCHECK(config);
80 EchoCanceller3Config* c = config;
81 bool res = true;
82
83 if (c->delay.down_sampling_factor != 4 &&
84 c->delay.down_sampling_factor != 8) {
85 c->delay.down_sampling_factor = 4;
86 res = false;
87 }
Sam Zackrisson848273a2018-10-23 12:13:42 +000088
89 if (c->delay.num_filters == 0) {
90 c->delay.num_filters = 1;
91 res = false;
92 }
93 if (c->delay.api_call_jitter_blocks == 0) {
94 c->delay.api_call_jitter_blocks = 1;
95 res = false;
96 }
97
98 if (c->delay.api_call_jitter_blocks == 0) {
99 c->delay.api_call_jitter_blocks = 1;
100 res = false;
101 }
Sam Zackrissona4c85142018-10-10 10:44:43 +0200102 if (c->delay.delay_headroom_blocks <= 1 &&
103 c->delay.hysteresis_limit_1_blocks == 1) {
104 c->delay.hysteresis_limit_1_blocks = 0;
105 res = false;
106 }
Sam Zackrisson848273a2018-10-23 12:13:42 +0000107 res = res && Limit(&c->delay.delay_estimate_smoothing, 0.f, 1.f);
108 res = res && Limit(&c->delay.delay_candidate_detection_threshold, 0.f, 1.f);
109 res = res && Limit(&c->delay.delay_selection_thresholds.initial, 1, 250);
110 res = res && Limit(&c->delay.delay_selection_thresholds.converged, 1, 250);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200111
Sam Zackrisson848273a2018-10-23 12:13:42 +0000112 res = res && Limit(&c->filter.main.length_blocks, 1, 50);
113 res = res && Limit(&c->filter.main.leakage_converged, 0.f, 1000.f);
114 res = res && Limit(&c->filter.main.leakage_diverged, 0.f, 1000.f);
115 res = res && Limit(&c->filter.main.error_floor, 0.f, 1000.f);
116 res = res && Limit(&c->filter.main.noise_gate, 0.f, 100000000.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200117
Sam Zackrisson848273a2018-10-23 12:13:42 +0000118 res = res && Limit(&c->filter.main_initial.length_blocks, 1, 50);
119 res = res && Limit(&c->filter.main_initial.leakage_converged, 0.f, 1000.f);
120 res = res && Limit(&c->filter.main_initial.leakage_diverged, 0.f, 1000.f);
121 res = res && Limit(&c->filter.main_initial.error_floor, 0.f, 1000.f);
122 res = res && Limit(&c->filter.main_initial.noise_gate, 0.f, 100000000.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200123
124 if (c->filter.main.length_blocks < c->filter.main_initial.length_blocks) {
125 c->filter.main_initial.length_blocks = c->filter.main.length_blocks;
126 res = false;
127 }
128
Sam Zackrisson848273a2018-10-23 12:13:42 +0000129 res = res && Limit(&c->filter.shadow.length_blocks, 1, 50);
130 res = res && Limit(&c->filter.shadow.rate, 0.f, 1.f);
131 res = res && Limit(&c->filter.shadow.noise_gate, 0.f, 100000000.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200132
Sam Zackrisson848273a2018-10-23 12:13:42 +0000133 res = res && Limit(&c->filter.shadow_initial.length_blocks, 1, 50);
134 res = res && Limit(&c->filter.shadow_initial.rate, 0.f, 1.f);
135 res = res && Limit(&c->filter.shadow_initial.noise_gate, 0.f, 100000000.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200136
137 if (c->filter.shadow.length_blocks < c->filter.shadow_initial.length_blocks) {
138 c->filter.shadow_initial.length_blocks = c->filter.shadow.length_blocks;
139 res = false;
140 }
141
Sam Zackrisson848273a2018-10-23 12:13:42 +0000142 res = res && Limit(&c->filter.config_change_duration_blocks, 0, 100000);
143 res = res && Limit(&c->filter.initial_state_seconds, 0.f, 100.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200144
Sam Zackrisson848273a2018-10-23 12:13:42 +0000145 res = res && Limit(&c->erle.min, 1.f, 100000.f);
146 res = res && Limit(&c->erle.max_l, 1.f, 100000.f);
147 res = res && Limit(&c->erle.max_h, 1.f, 100000.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200148 if (c->erle.min > c->erle.max_l || c->erle.min > c->erle.max_h) {
149 c->erle.min = std::min(c->erle.max_l, c->erle.max_h);
150 res = false;
151 }
152
Sam Zackrisson848273a2018-10-23 12:13:42 +0000153 res = res && Limit(&c->ep_strength.lf, 0.f, 1000000.f);
154 res = res && Limit(&c->ep_strength.mf, 0.f, 1000000.f);
155 res = res && Limit(&c->ep_strength.hf, 0.f, 1000000.f);
156 res = res && Limit(&c->ep_strength.default_len, 0.f, 1.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200157
Sam Zackrisson848273a2018-10-23 12:13:42 +0000158 res = res &&
159 Limit(&c->echo_audibility.low_render_limit, 0.f, 32768.f * 32768.f);
160 res = res &&
Sam Zackrisson8ee06a72018-10-23 12:32:42 +0200161 Limit(&c->echo_audibility.normal_render_limit, 0.f, 32768.f * 32768.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000162 res = res && Limit(&c->echo_audibility.floor_power, 0.f, 32768.f * 32768.f);
163 res = res && Limit(&c->echo_audibility.audibility_threshold_lf, 0.f,
164 32768.f * 32768.f);
165 res = res && Limit(&c->echo_audibility.audibility_threshold_mf, 0.f,
166 32768.f * 32768.f);
167 res = res && Limit(&c->echo_audibility.audibility_threshold_hf, 0.f,
168 32768.f * 32768.f);
Sam Zackrisson8ee06a72018-10-23 12:32:42 +0200169
Sam Zackrisson848273a2018-10-23 12:13:42 +0000170 res = res &&
Sam Zackrisson8ee06a72018-10-23 12:32:42 +0200171 Limit(&c->render_levels.active_render_limit, 0.f, 32768.f * 32768.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000172 res = res && Limit(&c->render_levels.poor_excitation_render_limit, 0.f,
173 32768.f * 32768.f);
174 res = res && Limit(&c->render_levels.poor_excitation_render_limit_ds8, 0.f,
175 32768.f * 32768.f);
Sam Zackrisson8ee06a72018-10-23 12:32:42 +0200176
177 res =
Sam Zackrisson848273a2018-10-23 12:13:42 +0000178 res && Limit(&c->echo_removal_control.gain_rampup.initial_gain, 0.f, 1.f);
179 res = res && Limit(&c->echo_removal_control.gain_rampup.first_non_zero_gain,
180 0.f, 1.f);
181 res = res && Limit(&c->echo_removal_control.gain_rampup.non_zero_gain_blocks,
182 0, 100000);
183 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200184 Limit(&c->echo_removal_control.gain_rampup.full_gain_blocks, 0, 100000);
185
Sam Zackrisson848273a2018-10-23 12:13:42 +0000186 res = res && Limit(&c->echo_model.noise_floor_hold, 0, 1000);
187 res = res && Limit(&c->echo_model.min_noise_floor_power, 0, 2000000.f);
188 res = res && Limit(&c->echo_model.stationary_gate_slope, 0, 1000000.f);
189 res = res && Limit(&c->echo_model.noise_gate_power, 0, 1000000.f);
190 res = res && Limit(&c->echo_model.noise_gate_slope, 0, 1000000.f);
191 res = res && Limit(&c->echo_model.render_pre_window_size, 0, 100);
192 res = res && Limit(&c->echo_model.render_post_window_size, 0, 100);
193 res = res && Limit(&c->echo_model.render_pre_window_size_init, 0, 100);
194 res = res && Limit(&c->echo_model.render_post_window_size_init, 0, 100);
195 res = res && Limit(&c->echo_model.nonlinear_hold, 0, 100);
196 res = res && Limit(&c->echo_model.nonlinear_release, 0, 1.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200197
Sam Zackrisson848273a2018-10-23 12:13:42 +0000198 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200199 Limit(&c->suppressor.normal_tuning.mask_lf.enr_transparent, 0.f, 100.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000200 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200201 Limit(&c->suppressor.normal_tuning.mask_lf.enr_suppress, 0.f, 100.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000202 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200203 Limit(&c->suppressor.normal_tuning.mask_lf.emr_transparent, 0.f, 100.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000204 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200205 Limit(&c->suppressor.normal_tuning.mask_hf.enr_transparent, 0.f, 100.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000206 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200207 Limit(&c->suppressor.normal_tuning.mask_hf.enr_suppress, 0.f, 100.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000208 res = res &&
Sam Zackrissona4c85142018-10-10 10:44:43 +0200209 Limit(&c->suppressor.normal_tuning.mask_hf.emr_transparent, 0.f, 100.f);
Sam Zackrisson848273a2018-10-23 12:13:42 +0000210 res = res && Limit(&c->suppressor.normal_tuning.max_inc_factor, 0.f, 100.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200211 res =
Sam Zackrisson848273a2018-10-23 12:13:42 +0000212 res && Limit(&c->suppressor.normal_tuning.max_dec_factor_lf, 0.f, 100.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200213
Sam Zackrisson848273a2018-10-23 12:13:42 +0000214 res = res && Limit(&c->suppressor.nearend_tuning.mask_lf.enr_transparent, 0.f,
215 100.f);
216 res = res &&
217 Limit(&c->suppressor.nearend_tuning.mask_lf.enr_suppress, 0.f, 100.f);
218 res = res && Limit(&c->suppressor.nearend_tuning.mask_lf.emr_transparent, 0.f,
219 100.f);
220 res = res && Limit(&c->suppressor.nearend_tuning.mask_hf.enr_transparent, 0.f,
221 100.f);
222 res = res &&
223 Limit(&c->suppressor.nearend_tuning.mask_hf.enr_suppress, 0.f, 100.f);
224 res = res && Limit(&c->suppressor.nearend_tuning.mask_hf.emr_transparent, 0.f,
225 100.f);
226 res = res && Limit(&c->suppressor.nearend_tuning.max_inc_factor, 0.f, 100.f);
227 res =
228 res && Limit(&c->suppressor.nearend_tuning.max_dec_factor_lf, 0.f, 100.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200229
Sam Zackrisson848273a2018-10-23 12:13:42 +0000230 res = res && Limit(&c->suppressor.dominant_nearend_detection.enr_threshold,
231 0.f, 1000000.f);
232 res = res && Limit(&c->suppressor.dominant_nearend_detection.snr_threshold,
233 0.f, 1000000.f);
234 res = res && Limit(&c->suppressor.dominant_nearend_detection.hold_duration, 0,
235 10000);
236 res =
237 res && Limit(&c->suppressor.dominant_nearend_detection.trigger_threshold,
238 0, 10000);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200239
Sam Zackrisson848273a2018-10-23 12:13:42 +0000240 res = res && Limit(&c->suppressor.high_bands_suppression.enr_threshold, 0.f,
241 1000000.f);
242 res = res && Limit(&c->suppressor.high_bands_suppression.max_gain_during_echo,
243 0.f, 1.f);
244
245 res = res && Limit(&c->suppressor.floor_first_increase, 0.f, 1000000.f);
Sam Zackrissona4c85142018-10-10 10:44:43 +0200246
247 return res;
248}
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100249} // namespace webrtc