2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #include "testing/gtest/include/gtest/gtest.h"
14 #include "webrtc/modules/audio_processing/utility/delay_estimator.h"
15 #include "webrtc/modules/audio_processing/utility/delay_estimator_internal.h"
16 #include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
18 #include "webrtc/typedefs.h"
22 enum { kSpectrumSize = 65 };
23 // Delay history sizes.
24 enum { kMaxDelay = 100 };
25 enum { kLookahead = 10 };
26 enum { kHistorySize = kMaxDelay + kLookahead };
27 // Length of binary spectrum sequence.
28 enum { kSequenceLength = 400 };
30 const int kDifferentHistorySize = 3;
31 const int kDifferentLookahead = 1;
33 const int kEnable[] = { 0, 1 };
34 const size_t kSizeEnable = sizeof(kEnable) / sizeof(*kEnable);
36 class DelayEstimatorTest : public ::testing::Test {
40 virtual void TearDown();
44 void VerifyDelay(BinaryDelayEstimator* binary_handle, int offset, int delay);
45 void RunBinarySpectra(BinaryDelayEstimator* binary1,
46 BinaryDelayEstimator* binary2,
47 int near_offset, int lookahead_offset, int far_offset);
48 void RunBinarySpectraTest(int near_offset, int lookahead_offset,
49 int ref_robust_validation, int robust_validation);
52 DelayEstimator* self_;
54 DelayEstimatorFarend* farend_self_;
55 BinaryDelayEstimator* binary_;
56 BinaryDelayEstimatorFarend* binary_farend_;
58 // Dummy input spectra.
59 float far_f_[kSpectrumSize];
60 float near_f_[kSpectrumSize];
61 uint16_t far_u16_[kSpectrumSize];
62 uint16_t near_u16_[kSpectrumSize];
63 uint32_t binary_spectrum_[kSequenceLength + kHistorySize];
66 DelayEstimatorTest::DelayEstimatorTest()
73 spectrum_size_(kSpectrumSize) {
74 // Dummy input data are set with more or less arbitrary non-zero values.
75 memset(far_f_, 1, sizeof(far_f_));
76 memset(near_f_, 2, sizeof(near_f_));
77 memset(far_u16_, 1, sizeof(far_u16_));
78 memset(near_u16_, 2, sizeof(near_u16_));
79 // Construct a sequence of binary spectra used to verify delay estimate. The
80 // |kSequenceLength| has to be long enough for the delay estimation to leave
81 // the initialized state.
82 binary_spectrum_[0] = 1;
83 for (int i = 1; i < (kSequenceLength + kHistorySize); i++) {
84 binary_spectrum_[i] = 3 * binary_spectrum_[i - 1];
88 void DelayEstimatorTest::SetUp() {
89 farend_handle_ = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize,
91 ASSERT_TRUE(farend_handle_ != NULL);
92 farend_self_ = reinterpret_cast<DelayEstimatorFarend*>(farend_handle_);
93 handle_ = WebRtc_CreateDelayEstimator(farend_handle_, kLookahead);
94 ASSERT_TRUE(handle_ != NULL);
95 self_ = reinterpret_cast<DelayEstimator*>(handle_);
96 binary_farend_ = WebRtc_CreateBinaryDelayEstimatorFarend(kHistorySize);
97 ASSERT_TRUE(binary_farend_ != NULL);
98 binary_ = WebRtc_CreateBinaryDelayEstimator(binary_farend_, kLookahead);
99 ASSERT_TRUE(binary_ != NULL);
102 void DelayEstimatorTest::TearDown() {
103 WebRtc_FreeDelayEstimator(handle_);
106 WebRtc_FreeDelayEstimatorFarend(farend_handle_);
107 farend_handle_ = NULL;
109 WebRtc_FreeBinaryDelayEstimator(binary_);
111 WebRtc_FreeBinaryDelayEstimatorFarend(binary_farend_);
112 binary_farend_ = NULL;
115 void DelayEstimatorTest::Init() {
116 // Initialize Delay Estimator
117 EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
118 EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
119 // Verify initialization.
120 EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
121 EXPECT_EQ(0, self_->near_spectrum_initialized);
122 EXPECT_EQ(-2, WebRtc_last_delay(handle_)); // Delay in initial state.
123 EXPECT_FLOAT_EQ(0, WebRtc_last_delay_quality(handle_)); // Zero quality.
126 void DelayEstimatorTest::InitBinary() {
127 // Initialize Binary Delay Estimator (far-end part).
128 WebRtc_InitBinaryDelayEstimatorFarend(binary_farend_);
129 // Initialize Binary Delay Estimator
130 WebRtc_InitBinaryDelayEstimator(binary_);
131 // Verify initialization. This does not guarantee a complete check, since
132 // |last_delay| may be equal to -2 before initialization if done on the fly.
133 EXPECT_EQ(-2, binary_->last_delay);
136 void DelayEstimatorTest::VerifyDelay(BinaryDelayEstimator* binary_handle,
137 int offset, int delay) {
138 // Verify that we WebRtc_binary_last_delay() returns correct delay.
139 EXPECT_EQ(delay, WebRtc_binary_last_delay(binary_handle));
142 // Verify correct delay estimate. In the non-causal case the true delay
143 // is equivalent with the |offset|.
144 EXPECT_EQ(offset, delay);
148 void DelayEstimatorTest::RunBinarySpectra(BinaryDelayEstimator* binary1,
149 BinaryDelayEstimator* binary2,
151 int lookahead_offset,
153 int different_validations = binary1->robust_validation_enabled ^
154 binary2->robust_validation_enabled;
155 WebRtc_InitBinaryDelayEstimatorFarend(binary_farend_);
156 WebRtc_InitBinaryDelayEstimator(binary1);
157 WebRtc_InitBinaryDelayEstimator(binary2);
158 // Verify initialization. This does not guarantee a complete check, since
159 // |last_delay| may be equal to -2 before initialization if done on the fly.
160 EXPECT_EQ(-2, binary1->last_delay);
161 EXPECT_EQ(-2, binary2->last_delay);
162 for (int i = kLookahead; i < (kSequenceLength + kLookahead); i++) {
163 WebRtc_AddBinaryFarSpectrum(binary_farend_,
164 binary_spectrum_[i + far_offset]);
165 int delay_1 = WebRtc_ProcessBinarySpectrum(binary1, binary_spectrum_[i]);
167 WebRtc_ProcessBinarySpectrum(binary2,
168 binary_spectrum_[i - near_offset]);
170 VerifyDelay(binary1, far_offset + kLookahead, delay_1);
172 far_offset + kLookahead + lookahead_offset + near_offset,
174 // Expect the two delay estimates to be offset by |lookahead_offset| +
175 // |near_offset| when we have left the initial state.
176 if ((delay_1 != -2) && (delay_2 != -2)) {
177 EXPECT_EQ(delay_1, delay_2 - lookahead_offset - near_offset);
179 // For the case of identical signals |delay_1| and |delay_2| should match
180 // all the time, unless one of them has robust validation turned on. In
181 // that case the robust validation leaves the initial state faster.
182 if ((near_offset == 0) && (lookahead_offset == 0)) {
183 if (!different_validations) {
184 EXPECT_EQ(delay_1, delay_2);
186 if (binary1->robust_validation_enabled) {
187 EXPECT_GE(delay_1, delay_2);
189 EXPECT_GE(delay_2, delay_1);
194 // Verify that we have left the initialized state.
195 EXPECT_NE(-2, WebRtc_binary_last_delay(binary1));
196 EXPECT_LT(0, WebRtc_binary_last_delay_quality(binary1));
197 EXPECT_NE(-2, WebRtc_binary_last_delay(binary2));
198 EXPECT_LT(0, WebRtc_binary_last_delay_quality(binary2));
201 void DelayEstimatorTest::RunBinarySpectraTest(int near_offset,
202 int lookahead_offset,
203 int ref_robust_validation,
204 int robust_validation) {
205 BinaryDelayEstimator* binary2 =
206 WebRtc_CreateBinaryDelayEstimator(binary_farend_,
207 kLookahead + lookahead_offset);
208 // Verify the delay for both causal and non-causal systems. For causal systems
209 // the delay is equivalent with a positive |offset| of the far-end sequence.
210 // For non-causal systems the delay is equivalent with a negative |offset| of
211 // the far-end sequence.
212 binary_->robust_validation_enabled = ref_robust_validation;
213 binary2->robust_validation_enabled = robust_validation;
214 for (int offset = -kLookahead;
215 offset < kMaxDelay - lookahead_offset - near_offset;
217 RunBinarySpectra(binary_, binary2, near_offset, lookahead_offset, offset);
219 WebRtc_FreeBinaryDelayEstimator(binary2);
221 binary_->robust_validation_enabled = 0; // Reset reference.
224 TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfWrapper) {
225 // In this test we verify correct error returns on invalid API calls.
227 // WebRtc_CreateDelayEstimatorFarend() and WebRtc_CreateDelayEstimator()
228 // should return a NULL pointer on invalid input values.
229 // Make sure we have a non-NULL value at start, so we can detect NULL after
231 void* handle = farend_handle_;
232 handle = WebRtc_CreateDelayEstimatorFarend(33, kHistorySize);
233 EXPECT_TRUE(handle == NULL);
234 handle = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize, 1);
235 EXPECT_TRUE(handle == NULL);
238 handle = WebRtc_CreateDelayEstimator(NULL, kLookahead);
239 EXPECT_TRUE(handle == NULL);
240 handle = WebRtc_CreateDelayEstimator(farend_handle_, -1);
241 EXPECT_TRUE(handle == NULL);
243 // WebRtc_InitDelayEstimatorFarend() and WebRtc_InitDelayEstimator() should
244 // return -1 if we have a NULL pointer as |handle|.
245 EXPECT_EQ(-1, WebRtc_InitDelayEstimatorFarend(NULL));
246 EXPECT_EQ(-1, WebRtc_InitDelayEstimator(NULL));
248 // WebRtc_AddFarSpectrumFloat() should return -1 if we have:
249 // 1) NULL pointer as |handle|.
250 // 2) NULL pointer as far-end spectrum.
251 // 3) Incorrect spectrum size.
252 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(NULL, far_f_, spectrum_size_));
253 // Use |farend_handle_| which is properly created at SetUp().
254 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(farend_handle_, NULL,
256 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
257 spectrum_size_ + 1));
259 // WebRtc_AddFarSpectrumFix() should return -1 if we have:
260 // 1) NULL pointer as |handle|.
261 // 2) NULL pointer as far-end spectrum.
262 // 3) Incorrect spectrum size.
263 // 4) Too high precision in far-end spectrum (Q-domain > 15).
264 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(NULL, far_u16_, spectrum_size_, 0));
265 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, NULL, spectrum_size_,
267 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
268 spectrum_size_ + 1, 0));
269 EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
270 spectrum_size_, 16));
272 // WebRtc_set_history_size() should return -1 if:
273 // 1) |handle| is a NULL.
274 // 2) |history_size| <= 1.
275 EXPECT_EQ(-1, WebRtc_set_history_size(NULL, 1));
276 EXPECT_EQ(-1, WebRtc_set_history_size(handle_, 1));
277 // WebRtc_history_size() should return -1 if:
278 // 1) NULL pointer input.
279 EXPECT_EQ(-1, WebRtc_history_size(NULL));
280 // 2) there is a mismatch between history size.
281 void* tmp_handle = WebRtc_CreateDelayEstimator(farend_handle_, kHistorySize);
282 EXPECT_EQ(0, WebRtc_InitDelayEstimator(tmp_handle));
283 EXPECT_EQ(kDifferentHistorySize,
284 WebRtc_set_history_size(tmp_handle, kDifferentHistorySize));
285 EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(tmp_handle));
286 EXPECT_EQ(kHistorySize, WebRtc_set_history_size(handle_, kHistorySize));
287 EXPECT_EQ(-1, WebRtc_history_size(tmp_handle));
289 // WebRtc_set_lookahead() should return -1 if we try a value outside the
291 EXPECT_EQ(-1, WebRtc_set_lookahead(handle_, kLookahead + 1));
292 EXPECT_EQ(-1, WebRtc_set_lookahead(handle_, -1));
294 // WebRtc_set_allowed_offset() should return -1 if we have:
295 // 1) NULL pointer as |handle|.
296 // 2) |allowed_offset| < 0.
297 EXPECT_EQ(-1, WebRtc_set_allowed_offset(NULL, 0));
298 EXPECT_EQ(-1, WebRtc_set_allowed_offset(handle_, -1));
300 EXPECT_EQ(-1, WebRtc_get_allowed_offset(NULL));
302 // WebRtc_enable_robust_validation() should return -1 if we have:
303 // 1) NULL pointer as |handle|.
304 // 2) Incorrect |enable| value (not 0 or 1).
305 EXPECT_EQ(-1, WebRtc_enable_robust_validation(NULL, kEnable[0]));
306 EXPECT_EQ(-1, WebRtc_enable_robust_validation(handle_, -1));
307 EXPECT_EQ(-1, WebRtc_enable_robust_validation(handle_, 2));
309 // WebRtc_is_robust_validation_enabled() should return -1 if we have NULL
310 // pointer as |handle|.
311 EXPECT_EQ(-1, WebRtc_is_robust_validation_enabled(NULL));
313 // WebRtc_DelayEstimatorProcessFloat() should return -1 if we have:
314 // 1) NULL pointer as |handle|.
315 // 2) NULL pointer as near-end spectrum.
316 // 3) Incorrect spectrum size.
317 // 4) Non matching history sizes if multiple delay estimators using the same
318 // far-end reference.
319 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(NULL, near_f_,
321 // Use |handle_| which is properly created at SetUp().
322 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, NULL,
324 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
325 spectrum_size_ + 1));
326 // |tmp_handle| is already in a non-matching state.
327 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(tmp_handle,
331 // WebRtc_DelayEstimatorProcessFix() should return -1 if we have:
332 // 1) NULL pointer as |handle|.
333 // 2) NULL pointer as near-end spectrum.
334 // 3) Incorrect spectrum size.
335 // 4) Too high precision in near-end spectrum (Q-domain > 15).
336 // 5) Non matching history sizes if multiple delay estimators using the same
337 // far-end reference.
338 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(NULL, near_u16_, spectrum_size_,
340 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, NULL, spectrum_size_,
342 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
343 spectrum_size_ + 1, 0));
344 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
345 spectrum_size_, 16));
346 // |tmp_handle| is already in a non-matching state.
347 EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(tmp_handle,
351 WebRtc_FreeDelayEstimator(tmp_handle);
353 // WebRtc_last_delay() should return -1 if we have a NULL pointer as |handle|.
354 EXPECT_EQ(-1, WebRtc_last_delay(NULL));
356 // Free any local memory if needed.
357 WebRtc_FreeDelayEstimator(handle);
360 TEST_F(DelayEstimatorTest, VerifyAllowedOffset) {
361 // Is set to zero by default.
362 EXPECT_EQ(0, WebRtc_get_allowed_offset(handle_));
363 for (int i = 1; i >= 0; i--) {
364 EXPECT_EQ(0, WebRtc_set_allowed_offset(handle_, i));
365 EXPECT_EQ(i, WebRtc_get_allowed_offset(handle_));
367 // Unaffected over a reset.
368 EXPECT_EQ(i, WebRtc_get_allowed_offset(handle_));
372 TEST_F(DelayEstimatorTest, VerifyEnableRobustValidation) {
373 // Disabled by default.
374 EXPECT_EQ(0, WebRtc_is_robust_validation_enabled(handle_));
375 for (size_t i = 0; i < kSizeEnable; ++i) {
376 EXPECT_EQ(0, WebRtc_enable_robust_validation(handle_, kEnable[i]));
377 EXPECT_EQ(kEnable[i], WebRtc_is_robust_validation_enabled(handle_));
379 // Unaffected over a reset.
380 EXPECT_EQ(kEnable[i], WebRtc_is_robust_validation_enabled(handle_));
384 TEST_F(DelayEstimatorTest, InitializedSpectrumAfterProcess) {
385 // In this test we verify that the mean spectra are initialized after first
386 // time we call WebRtc_AddFarSpectrum() and Process() respectively. The test
387 // also verifies the state is not left for zero spectra.
388 const float kZerosFloat[kSpectrumSize] = { 0.0 };
389 const uint16_t kZerosU16[kSpectrumSize] = { 0 };
391 // For floating point operations, process one frame and verify initialization
394 EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, kZerosFloat,
396 EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
397 EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
399 EXPECT_EQ(1, farend_self_->far_spectrum_initialized);
400 EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFloat(handle_, kZerosFloat,
402 EXPECT_EQ(0, self_->near_spectrum_initialized);
403 EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
405 EXPECT_EQ(1, self_->near_spectrum_initialized);
407 // For fixed point operations, process one frame and verify initialization
410 EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, kZerosU16,
412 EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
413 EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
415 EXPECT_EQ(1, farend_self_->far_spectrum_initialized);
416 EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFix(handle_, kZerosU16,
418 EXPECT_EQ(0, self_->near_spectrum_initialized);
419 EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
421 EXPECT_EQ(1, self_->near_spectrum_initialized);
424 TEST_F(DelayEstimatorTest, CorrectLastDelay) {
425 // In this test we verify that we get the correct last delay upon valid call.
426 // We simply process the same data until we leave the initialized state
427 // (|last_delay| = -2). Then we compare the Process() output with the
428 // last_delay() call.
430 // TODO(bjornv): Update quality values for robust validation.
432 // Floating point operations.
434 for (int i = 0; i < 200; i++) {
435 EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
437 last_delay = WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
439 if (last_delay != -2) {
440 EXPECT_EQ(last_delay, WebRtc_last_delay(handle_));
441 if (!WebRtc_is_robust_validation_enabled(handle_)) {
442 EXPECT_FLOAT_EQ(7203.f / kMaxBitCountsQ9,
443 WebRtc_last_delay_quality(handle_));
448 // Verify that we have left the initialized state.
449 EXPECT_NE(-2, WebRtc_last_delay(handle_));
450 EXPECT_LT(0, WebRtc_last_delay_quality(handle_));
452 // Fixed point operations.
454 for (int i = 0; i < 200; i++) {
455 EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
457 last_delay = WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
459 if (last_delay != -2) {
460 EXPECT_EQ(last_delay, WebRtc_last_delay(handle_));
461 if (!WebRtc_is_robust_validation_enabled(handle_)) {
462 EXPECT_FLOAT_EQ(7203.f / kMaxBitCountsQ9,
463 WebRtc_last_delay_quality(handle_));
468 // Verify that we have left the initialized state.
469 EXPECT_NE(-2, WebRtc_last_delay(handle_));
470 EXPECT_LT(0, WebRtc_last_delay_quality(handle_));
473 TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfBinaryEstimatorFarend) {
474 // In this test we verify correct output on invalid API calls to the Binary
475 // Delay Estimator (far-end part).
477 BinaryDelayEstimatorFarend* binary = binary_farend_;
478 // WebRtc_CreateBinaryDelayEstimatorFarend() should return -1 if the input
479 // history size is less than 2. This is to make sure the buffer shifting
481 // Make sure we have a non-NULL value at start, so we can detect NULL after
483 binary = WebRtc_CreateBinaryDelayEstimatorFarend(1);
484 EXPECT_TRUE(binary == NULL);
487 TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfBinaryEstimator) {
488 // In this test we verify correct output on invalid API calls to the Binary
491 BinaryDelayEstimator* binary_handle = binary_;
492 // WebRtc_CreateBinaryDelayEstimator() should return -1 if we have a NULL
493 // pointer as |binary_farend| or invalid input values. Upon failure, the
494 // |binary_handle| should be NULL.
495 // Make sure we have a non-NULL value at start, so we can detect NULL after
497 binary_handle = WebRtc_CreateBinaryDelayEstimator(NULL, kLookahead);
498 EXPECT_TRUE(binary_handle == NULL);
499 binary_handle = WebRtc_CreateBinaryDelayEstimator(binary_farend_, -1);
500 EXPECT_TRUE(binary_handle == NULL);
503 TEST_F(DelayEstimatorTest, MeanEstimatorFix) {
504 // In this test we verify that we update the mean value in correct direction
505 // only. With "direction" we mean increase or decrease.
507 int32_t mean_value = 4000;
508 int32_t mean_value_before = mean_value;
509 int32_t new_mean_value = mean_value * 2;
511 // Increasing |mean_value|.
512 WebRtc_MeanEstimatorFix(new_mean_value, 10, &mean_value);
513 EXPECT_LT(mean_value_before, mean_value);
514 EXPECT_GT(new_mean_value, mean_value);
516 // Decreasing |mean_value|.
517 new_mean_value = mean_value / 2;
518 mean_value_before = mean_value;
519 WebRtc_MeanEstimatorFix(new_mean_value, 10, &mean_value);
520 EXPECT_GT(mean_value_before, mean_value);
521 EXPECT_LT(new_mean_value, mean_value);
524 TEST_F(DelayEstimatorTest, ExactDelayEstimateMultipleNearSameSpectrum) {
525 // In this test we verify that we get the correct delay estimates if we shift
526 // the signal accordingly. We create two Binary Delay Estimators and feed them
527 // with the same signals, so they should output the same results.
528 // We verify both causal and non-causal delays.
529 // For these noise free signals, the robust validation should not have an
530 // impact, hence we turn robust validation on/off for both reference and
533 for (size_t i = 0; i < kSizeEnable; ++i) {
534 for (size_t j = 0; j < kSizeEnable; ++j) {
535 RunBinarySpectraTest(0, 0, kEnable[i], kEnable[j]);
540 TEST_F(DelayEstimatorTest, ExactDelayEstimateMultipleNearDifferentSpectrum) {
541 // In this test we use the same setup as above, but we now feed the two Binary
542 // Delay Estimators with different signals, so they should output different
544 // For these noise free signals, the robust validation should not have an
545 // impact, hence we turn robust validation on/off for both reference and
548 const int kNearOffset = 1;
549 for (size_t i = 0; i < kSizeEnable; ++i) {
550 for (size_t j = 0; j < kSizeEnable; ++j) {
551 RunBinarySpectraTest(kNearOffset, 0, kEnable[i], kEnable[j]);
556 TEST_F(DelayEstimatorTest, ExactDelayEstimateMultipleNearDifferentLookahead) {
557 // In this test we use the same setup as above, feeding the two Binary
558 // Delay Estimators with the same signals. The difference is that we create
559 // them with different lookahead.
560 // For these noise free signals, the robust validation should not have an
561 // impact, hence we turn robust validation on/off for both reference and
564 const int kLookaheadOffset = 1;
565 for (size_t i = 0; i < kSizeEnable; ++i) {
566 for (size_t j = 0; j < kSizeEnable; ++j) {
567 RunBinarySpectraTest(0, kLookaheadOffset, kEnable[i], kEnable[j]);
572 TEST_F(DelayEstimatorTest, AllowedOffsetNoImpactWhenRobustValidationDisabled) {
573 // The same setup as in ExactDelayEstimateMultipleNearSameSpectrum with the
574 // difference that |allowed_offset| is set for the reference binary delay
577 binary_->allowed_offset = 10;
578 RunBinarySpectraTest(0, 0, 0, 0);
579 binary_->allowed_offset = 0; // Reset reference.
582 TEST_F(DelayEstimatorTest, VerifyLookaheadAtCreate) {
583 void* farend_handle = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize,
585 ASSERT_TRUE(farend_handle != NULL);
586 void* handle = WebRtc_CreateDelayEstimator(farend_handle, kLookahead);
587 ASSERT_TRUE(handle != NULL);
588 EXPECT_EQ(kLookahead, WebRtc_lookahead(handle));
589 WebRtc_FreeDelayEstimator(handle);
590 WebRtc_FreeDelayEstimatorFarend(farend_handle);
593 TEST_F(DelayEstimatorTest, VerifyLookaheadIsSetAndKeptAfterInit) {
594 EXPECT_EQ(kLookahead, WebRtc_lookahead(handle_));
595 EXPECT_EQ(kDifferentLookahead,
596 WebRtc_set_lookahead(handle_, kDifferentLookahead));
597 EXPECT_EQ(kDifferentLookahead, WebRtc_lookahead(handle_));
598 EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
599 EXPECT_EQ(kDifferentLookahead, WebRtc_lookahead(handle_));
600 EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
601 EXPECT_EQ(kDifferentLookahead, WebRtc_lookahead(handle_));
604 TEST_F(DelayEstimatorTest, VerifyHistorySizeAtCreate) {
605 EXPECT_EQ(kHistorySize, WebRtc_history_size(handle_));
608 TEST_F(DelayEstimatorTest, VerifyHistorySizeIsSetAndKeptAfterInit) {
609 EXPECT_EQ(kHistorySize, WebRtc_history_size(handle_));
610 EXPECT_EQ(kDifferentHistorySize,
611 WebRtc_set_history_size(handle_, kDifferentHistorySize));
612 EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(handle_));
613 EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
614 EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(handle_));
615 EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
616 EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(handle_));
619 // TODO(bjornv): Add tests for SoftReset...(...).