| Index: webrtc/modules/audio_processing/aec/system_delay_unittest.cc
|
| diff --git a/webrtc/modules/audio_processing/aec/system_delay_unittest.cc b/webrtc/modules/audio_processing/aec/system_delay_unittest.cc
|
| index 42800c50a394aa5970f72b9a3425d1351dc7bf5f..31401d4f29efe944e884527342b7a24bf828a71d 100644
|
| --- a/webrtc/modules/audio_processing/aec/system_delay_unittest.cc
|
| +++ b/webrtc/modules/audio_processing/aec/system_delay_unittest.cc
|
| @@ -9,7 +9,6 @@
|
| */
|
|
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| -#include "webrtc/base/checks.h"
|
| extern "C" {
|
| #include "webrtc/modules/audio_processing/aec/aec_core.h"
|
| }
|
| @@ -41,7 +40,7 @@ class SystemDelayTest : public ::testing::Test {
|
|
|
| // Maps buffer size in ms into samples, taking the unprocessed frame into
|
| // account.
|
| - int MapBufferSizeToSamples(int size_in_ms);
|
| + int MapBufferSizeToSamples(int size_in_ms, bool extended_filter);
|
|
|
| void* handle_;
|
| Aec* self_;
|
| @@ -100,6 +99,7 @@ static const int kMaxConvergenceMs = 500;
|
| void SystemDelayTest::Init(int sample_rate_hz) {
|
| // Initialize AEC
|
| EXPECT_EQ(0, WebRtcAec_Init(handle_, sample_rate_hz, 48000));
|
| + EXPECT_EQ(0, WebRtcAec_system_delay(self_->aec));
|
|
|
| // One frame equals 10 ms of data.
|
| samples_per_frame_ = sample_rate_hz / 100;
|
| @@ -135,26 +135,38 @@ void SystemDelayTest::RunStableStartup() {
|
| // up the far-end buffer with the same amount as we will report in through
|
| // Process().
|
| int buffer_size = BufferFillUp();
|
| - // A stable device should be accepted and put in a regular process mode within
|
| - // |kStableConvergenceMs|.
|
| - int process_time_ms = 0;
|
| - for (; process_time_ms < kStableConvergenceMs; process_time_ms += 10) {
|
| +
|
| + if (WebRtcAec_reported_delay_enabled(self_->aec) == 0) {
|
| + // In extended_filter mode we set the buffer size after the first processed
|
| + // 10 ms chunk. Hence, we don't need to wait for the reported system delay
|
| + // values to become stable.
|
| RenderAndCapture(kDeviceBufMs);
|
| buffer_size += samples_per_frame_;
|
| - if (self_->startup_phase == 0) {
|
| - // We have left the startup phase.
|
| - break;
|
| + EXPECT_EQ(0, self_->startup_phase);
|
| + } else {
|
| + // A stable device should be accepted and put in a regular process mode
|
| + // within |kStableConvergenceMs|.
|
| + int process_time_ms = 0;
|
| + for (; process_time_ms < kStableConvergenceMs; process_time_ms += 10) {
|
| + RenderAndCapture(kDeviceBufMs);
|
| + buffer_size += samples_per_frame_;
|
| + if (self_->startup_phase == 0) {
|
| + // We have left the startup phase.
|
| + break;
|
| + }
|
| }
|
| + // Verify convergence time.
|
| + EXPECT_GT(kStableConvergenceMs, process_time_ms);
|
| }
|
| - // Verify convergence time.
|
| - EXPECT_GT(kStableConvergenceMs, process_time_ms);
|
| // Verify that the buffer has been flushed.
|
| EXPECT_GE(buffer_size, WebRtcAec_system_delay(self_->aec));
|
| }
|
|
|
| -int SystemDelayTest::MapBufferSizeToSamples(int size_in_ms) {
|
| - // The extra 10 ms corresponds to the unprocessed frame.
|
| - return (size_in_ms + 10) * samples_per_frame_ / 10;
|
| + int SystemDelayTest::MapBufferSizeToSamples(int size_in_ms,
|
| + bool extended_filter) {
|
| + // If extended_filter is disabled we add an extra 10 ms for the unprocessed
|
| + // frame. That is simply how the algorithm is constructed.
|
| + return (size_in_ms + (extended_filter ? 0 : 10)) * samples_per_frame_ / 10;
|
| }
|
|
|
| // The tests should meet basic requirements and not be adjusted to what is
|
| @@ -181,14 +193,23 @@ int SystemDelayTest::MapBufferSizeToSamples(int size_in_ms) {
|
| TEST_F(SystemDelayTest, CorrectIncreaseWhenBufferFarend) {
|
| // When we add data to the AEC buffer the internal system delay should be
|
| // incremented with the same amount as the size of data.
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| -
|
| - // Loop through a couple of calls to make sure the system delay increments
|
| - // correctly.
|
| - for (int j = 1; j <= 5; j++) {
|
| - EXPECT_EQ(0, WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
|
| - EXPECT_EQ(j * samples_per_frame_, WebRtcAec_system_delay(self_->aec));
|
| + // This process should be independent of DA-AEC and extended_filter mode.
|
| + for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + // Loop through a couple of calls to make sure the system delay
|
| + // increments correctly.
|
| + for (int j = 1; j <= 5; j++) {
|
| + EXPECT_EQ(0,
|
| + WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
|
| + EXPECT_EQ(j * samples_per_frame_, WebRtcAec_system_delay(self_->aec));
|
| + }
|
| + }
|
| }
|
| }
|
| }
|
| @@ -199,21 +220,42 @@ TEST_F(SystemDelayTest, CorrectIncreaseWhenBufferFarend) {
|
| TEST_F(SystemDelayTest, CorrectDelayAfterStableStartup) {
|
| // We run the system in a stable startup. After that we verify that the system
|
| // delay meets the requirements.
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| - RunStableStartup();
|
| -
|
| - // Verify system delay with respect to requirements, i.e., the
|
| - // |system_delay| is in the interval [75%, 100%] of what's reported on the
|
| - // average.
|
| - int average_reported_delay = kDeviceBufMs * samples_per_frame_ / 10;
|
| - EXPECT_GE(average_reported_delay, WebRtcAec_system_delay(self_->aec));
|
| - EXPECT_LE(average_reported_delay * 3 / 4,
|
| - WebRtcAec_system_delay(self_->aec));
|
| + // This process should be independent of DA-AEC and extended_filter mode.
|
| + for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + RunStableStartup();
|
| +
|
| + // Verify system delay with respect to requirements, i.e., the
|
| + // |system_delay| is in the interval [75%, 100%] of what's reported on
|
| + // the average.
|
| + // In extended_filter mode we target 50% and measure after one processed
|
| + // 10 ms chunk.
|
| + int average_reported_delay = kDeviceBufMs * samples_per_frame_ / 10;
|
| + EXPECT_GE(average_reported_delay, WebRtcAec_system_delay(self_->aec));
|
| + int lower_bound = WebRtcAec_extended_filter_enabled(self_->aec)
|
| + ? average_reported_delay / 2 - samples_per_frame_
|
| + : average_reported_delay * 3 / 4;
|
| + EXPECT_LE(lower_bound, WebRtcAec_system_delay(self_->aec));
|
| + }
|
| + }
|
| }
|
| }
|
|
|
| TEST_F(SystemDelayTest, CorrectDelayAfterUnstableStartup) {
|
| + // This test does not apply in extended_filter mode, since we only use the
|
| + // the first 10 ms chunk to determine a reasonable buffer size. Neither does
|
| + // it apply if DA-AEC is on because that overrides the startup procedure.
|
| + WebRtcAec_enable_extended_filter(self_->aec, 0);
|
| + EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1);
|
| + EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(self_->aec));
|
| +
|
| // In an unstable system we would start processing after |kMaxConvergenceMs|.
|
| // On the last frame the AEC buffer is adjusted to 60% of the last reported
|
| // device buffer size.
|
| @@ -254,15 +296,19 @@ TEST_F(SystemDelayTest, CorrectDelayAfterUnstableStartup) {
|
| }
|
| }
|
|
|
| -TEST_F(SystemDelayTest,
|
| - DISABLED_ON_ANDROID(CorrectDelayAfterStableBufferBuildUp)) {
|
| +TEST_F(SystemDelayTest, CorrectDelayAfterStableBufferBuildUp) {
|
| + // This test does not apply in extended_filter mode, since we only use the
|
| + // the first 10 ms chunk to determine a reasonable buffer size. Neither does
|
| + // it apply if DA-AEC is on because that overrides the startup procedure.
|
| + WebRtcAec_enable_extended_filter(self_->aec, 0);
|
| + EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1);
|
| + EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(self_->aec));
|
| +
|
| // In this test we start by establishing the device buffer size during stable
|
| // conditions, but with an empty internal far-end buffer. Once that is done we
|
| // verify that the system delay is increased correctly until we have reach an
|
| // internal buffer size of 75% of what's been reported.
|
| -
|
| - // This test assumes the reported delays are used.
|
| - WebRtcAec_enable_reported_delay(WebRtcAec_aec_core(handle_), 1);
|
| for (size_t i = 0; i < kNumSampleRates; i++) {
|
| Init(kSampleRateHz[i]);
|
|
|
| @@ -316,62 +362,73 @@ TEST_F(SystemDelayTest, CorrectDelayWhenBufferUnderrun) {
|
| // WebRtcAec_Process() we will finally run out of data, but should
|
| // automatically stuff the buffer. We verify this behavior by checking if the
|
| // system delay goes negative.
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| - RunStableStartup();
|
| -
|
| - // The AEC has now left the Startup phase. We now have at most
|
| - // |kStableConvergenceMs| in the buffer. Keep on calling Process() until
|
| - // we run out of data and verify that the system delay is non-negative.
|
| - for (int j = 0; j <= kStableConvergenceMs; j += 10) {
|
| - EXPECT_EQ(0,
|
| - WebRtcAec_Process(handle_,
|
| - &near_ptr_,
|
| - 1,
|
| - &out_ptr_,
|
| - samples_per_frame_,
|
| - kDeviceBufMs,
|
| - 0));
|
| - EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| + // This process should be independent of DA-AEC and extended_filter mode.
|
| + for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + RunStableStartup();
|
| +
|
| + // The AEC has now left the Startup phase. We now have at most
|
| + // |kStableConvergenceMs| in the buffer. Keep on calling Process() until
|
| + // we run out of data and verify that the system delay is non-negative.
|
| + for (int j = 0; j <= kStableConvergenceMs; j += 10) {
|
| + EXPECT_EQ(0, WebRtcAec_Process(handle_, &near_ptr_, 1, &out_ptr_,
|
| + samples_per_frame_, kDeviceBufMs, 0));
|
| + EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| + }
|
| + }
|
| }
|
| }
|
| }
|
|
|
| -TEST_F(SystemDelayTest, DISABLED_ON_ANDROID(CorrectDelayDuringDrift)) {
|
| +TEST_F(SystemDelayTest, CorrectDelayDuringDrift) {
|
| // This drift test should verify that the system delay is never exceeding the
|
| // device buffer. The drift is simulated by decreasing the reported device
|
| // buffer size by 1 ms every 100 ms. If the device buffer size goes below 30
|
| // ms we jump (add) 10 ms to give a repeated pattern.
|
|
|
| - // This test assumes the reported delays are used.
|
| - WebRtcAec_enable_reported_delay(WebRtcAec_aec_core(handle_), 1);
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| - RunStableStartup();
|
| -
|
| - // We have now left the startup phase and proceed with normal processing.
|
| - int jump = 0;
|
| - for (int j = 0; j < 1000; j++) {
|
| - // Drift = -1 ms per 100 ms of data.
|
| - int device_buf_ms = kDeviceBufMs - (j / 10) + jump;
|
| - int device_buf = MapBufferSizeToSamples(device_buf_ms);
|
| -
|
| - if (device_buf_ms < 30) {
|
| - // Add 10 ms data, taking affect next frame.
|
| - jump += 10;
|
| + // This process should be independent of DA-AEC and extended_filter mode.
|
| + for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + RunStableStartup();
|
| +
|
| + // We have left the startup phase and proceed with normal processing.
|
| + int jump = 0;
|
| + for (int j = 0; j < 1000; j++) {
|
| + // Drift = -1 ms per 100 ms of data.
|
| + int device_buf_ms = kDeviceBufMs - (j / 10) + jump;
|
| + int device_buf = MapBufferSizeToSamples(device_buf_ms,
|
| + extended_filter == 1);
|
| +
|
| + if (device_buf_ms < 30) {
|
| + // Add 10 ms data, taking affect next frame.
|
| + jump += 10;
|
| + }
|
| + RenderAndCapture(device_buf_ms);
|
| +
|
| + // Verify that the system delay does not exceed the device buffer.
|
| + EXPECT_GE(device_buf, WebRtcAec_system_delay(self_->aec));
|
| +
|
| + // Verify that the system delay is non-negative.
|
| + EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| + }
|
| }
|
| - RenderAndCapture(device_buf_ms);
|
| -
|
| - // Verify that the system delay does not exceed the device buffer.
|
| - EXPECT_GE(device_buf, WebRtcAec_system_delay(self_->aec));
|
| -
|
| - // Verify that the system delay is non-negative.
|
| - EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| }
|
| }
|
| }
|
|
|
| -TEST_F(SystemDelayTest, DISABLED_ON_ANDROID(ShouldRecoverAfterGlitch)) {
|
| +TEST_F(SystemDelayTest, ShouldRecoverAfterGlitch) {
|
| // This glitch test should verify that the system delay recovers if there is
|
| // a glitch in data. The data glitch is constructed as 200 ms of buffering
|
| // after which the stable procedure continues. The glitch is never reported by
|
| @@ -379,79 +436,100 @@ TEST_F(SystemDelayTest, DISABLED_ON_ANDROID(ShouldRecoverAfterGlitch)) {
|
| // The system is said to be in a non-causal state if the difference between
|
| // the device buffer and system delay is less than a block (64 samples).
|
|
|
| - // This test assumes the reported delays are used.
|
| - WebRtcAec_enable_reported_delay(WebRtcAec_aec_core(handle_), 1);
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| - RunStableStartup();
|
| - int device_buf = MapBufferSizeToSamples(kDeviceBufMs);
|
| - // Glitch state.
|
| - for (int j = 0; j < 20; j++) {
|
| - EXPECT_EQ(0, WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
|
| - // No need to verify system delay, since that is done in a separate test.
|
| - }
|
| - // Verify that we are in a non-causal state, i.e.,
|
| - // |system_delay| > |device_buf|.
|
| - EXPECT_LT(device_buf, WebRtcAec_system_delay(self_->aec));
|
| -
|
| - // Recover state. Should recover at least 4 ms of data per 10 ms, hence a
|
| - // glitch of 200 ms will take at most 200 * 10 / 4 = 500 ms to recover from.
|
| - bool non_causal = true; // We are currently in a non-causal state.
|
| - for (int j = 0; j < 50; j++) {
|
| - int system_delay_before = WebRtcAec_system_delay(self_->aec);
|
| - RenderAndCapture(kDeviceBufMs);
|
| - int system_delay_after = WebRtcAec_system_delay(self_->aec);
|
| -
|
| - // We have recovered if |device_buf| - |system_delay_after| >= 64 (one
|
| - // block). During recovery |system_delay_after| < |system_delay_before|,
|
| - // otherwise they are equal.
|
| - if (non_causal) {
|
| - EXPECT_LT(system_delay_after, system_delay_before);
|
| - if (device_buf - system_delay_after >= 64) {
|
| - non_causal = false;
|
| + // This process should be independent of DA-AEC and extended_filter mode.
|
| + for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + RunStableStartup();
|
| + int device_buf = MapBufferSizeToSamples(kDeviceBufMs,
|
| + extended_filter == 1);
|
| + // Glitch state.
|
| + for (int j = 0; j < 20; j++) {
|
| + EXPECT_EQ(0,
|
| + WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
|
| + // No need to verify system delay, since that is done in a separate
|
| + // test.
|
| }
|
| - } else {
|
| - EXPECT_EQ(system_delay_before, system_delay_after);
|
| + // Verify that we are in a non-causal state, i.e.,
|
| + // |system_delay| > |device_buf|.
|
| + EXPECT_LT(device_buf, WebRtcAec_system_delay(self_->aec));
|
| +
|
| + // Recover state. Should recover at least 4 ms of data per 10 ms, hence
|
| + // a glitch of 200 ms will take at most 200 * 10 / 4 = 500 ms to recover
|
| + // from.
|
| + bool non_causal = true; // We are currently in a non-causal state.
|
| + for (int j = 0; j < 50; j++) {
|
| + int system_delay_before = WebRtcAec_system_delay(self_->aec);
|
| + RenderAndCapture(kDeviceBufMs);
|
| + int system_delay_after = WebRtcAec_system_delay(self_->aec);
|
| + // We have recovered if
|
| + // |device_buf| - |system_delay_after| >= PART_LEN (1 block).
|
| + // During recovery, |system_delay_after| < |system_delay_before|,
|
| + // otherwise they are equal.
|
| + if (non_causal) {
|
| + EXPECT_LT(system_delay_after, system_delay_before);
|
| + if (device_buf - system_delay_after >= PART_LEN) {
|
| + non_causal = false;
|
| + }
|
| + } else {
|
| + EXPECT_EQ(system_delay_before, system_delay_after);
|
| + }
|
| + // Verify that the system delay is non-negative.
|
| + EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| + }
|
| + // Check that we have recovered.
|
| + EXPECT_FALSE(non_causal);
|
| }
|
| - // Verify that the system delay is non-negative.
|
| - EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| }
|
| - // Check that we have recovered.
|
| - EXPECT_FALSE(non_causal);
|
| }
|
| }
|
|
|
| TEST_F(SystemDelayTest, UnaffectedWhenSpuriousDeviceBufferValues) {
|
| - // This spurious device buffer data test aims at verifying that the system
|
| - // delay is unaffected by large outliers.
|
| - // The system is said to be in a non-causal state if the difference between
|
| - // the device buffer and system delay is less than a block (64 samples).
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| - RunStableStartup();
|
| - int device_buf = MapBufferSizeToSamples(kDeviceBufMs);
|
| -
|
| - // Normal state. We are currently not in a non-causal state.
|
| - bool non_causal = false;
|
| -
|
| - // Run 1 s and replace device buffer size with 500 ms every 100 ms.
|
| - for (int j = 0; j < 100; j++) {
|
| - int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
|
| - int device_buf_ms = kDeviceBufMs;
|
| - if (j % 10 == 0) {
|
| - device_buf_ms = 500;
|
| - }
|
| - RenderAndCapture(device_buf_ms);
|
| + // This test does not apply in extended_filter mode, since we only use the
|
| + // the first 10 ms chunk to determine a reasonable buffer size.
|
| + const int extended_filter = 0;
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| +
|
| + // Should be DA-AEC independent.
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + // This spurious device buffer data test aims at verifying that the system
|
| + // delay is unaffected by large outliers.
|
| + // The system is said to be in a non-causal state if the difference between
|
| + // the device buffer and system delay is less than a block (64 samples).
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + RunStableStartup();
|
| + int device_buf = MapBufferSizeToSamples(kDeviceBufMs,
|
| + extended_filter == 1);
|
| +
|
| + // Normal state. We are currently not in a non-causal state.
|
| + bool non_causal = false;
|
| +
|
| + // Run 1 s and replace device buffer size with 500 ms every 100 ms.
|
| + for (int j = 0; j < 100; j++) {
|
| + int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
|
| + int device_buf_ms = j % 10 == 0 ? 500 : kDeviceBufMs;
|
| + RenderAndCapture(device_buf_ms);
|
| +
|
| + // Check for non-causality.
|
| + if (device_buf - WebRtcAec_system_delay(self_->aec) < PART_LEN) {
|
| + non_causal = true;
|
| + }
|
| + EXPECT_FALSE(non_causal);
|
| + EXPECT_EQ(system_delay_before_calls,
|
| + WebRtcAec_system_delay(self_->aec));
|
|
|
| - // Check for non-causality.
|
| - if (device_buf - WebRtcAec_system_delay(self_->aec) < 64) {
|
| - non_causal = true;
|
| + // Verify that the system delay is non-negative.
|
| + EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| }
|
| - EXPECT_FALSE(non_causal);
|
| - EXPECT_EQ(system_delay_before_calls, WebRtcAec_system_delay(self_->aec));
|
| -
|
| - // Verify that the system delay is non-negative.
|
| - EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| }
|
| }
|
| }
|
| @@ -462,36 +540,54 @@ TEST_F(SystemDelayTest, CorrectImpactWhenTogglingDeviceBufferValues) {
|
| // The test is constructed such that every other device buffer value is zero
|
| // and then 2 * |kDeviceBufMs|, hence the size is constant on the average. The
|
| // zero values will force us into a non-causal state and thereby lowering the
|
| - // system delay until we basically runs out of data. Once that happens the
|
| + // system delay until we basically run out of data. Once that happens the
|
| // buffer will be stuffed.
|
| // TODO(bjornv): This test will have a better impact if we verified that the
|
| - // delay estimate goes up when the system delay goes done to meet the average
|
| + // delay estimate goes up when the system delay goes down to meet the average
|
| // device buffer size.
|
| - for (size_t i = 0; i < kNumSampleRates; i++) {
|
| - Init(kSampleRateHz[i]);
|
| - RunStableStartup();
|
| - int device_buf = MapBufferSizeToSamples(kDeviceBufMs);
|
| -
|
| - // Normal state. We are currently not in a non-causal state.
|
| - bool non_causal = false;
|
| -
|
| - // Loop through 100 frames (both render and capture), which equals 1 s of
|
| - // data. Every odd frame we set the device buffer size to 2 * |kDeviceBufMs|
|
| - // and even frames we set the device buffer size to zero.
|
| - for (int j = 0; j < 100; j++) {
|
| - int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
|
| - int device_buf_ms = 2 * (j % 2) * kDeviceBufMs;
|
| - RenderAndCapture(device_buf_ms);
|
|
|
| - // Check for non-causality, compared with the average device buffer size.
|
| - non_causal |= (device_buf - WebRtcAec_system_delay(self_->aec) < 64);
|
| - EXPECT_GE(system_delay_before_calls, WebRtcAec_system_delay(self_->aec));
|
| -
|
| - // Verify that the system delay is non-negative.
|
| - EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| + // This test does not apply if DA-AEC is enabled and extended_filter mode
|
| + // disabled.
|
| + for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
|
| + WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
|
| + EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
|
| + for (int da_aec = 0; da_aec <= 1; ++da_aec) {
|
| + WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
|
| + EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
|
| + if (extended_filter == 0 && da_aec == 1) {
|
| + continue;
|
| + }
|
| + for (size_t i = 0; i < kNumSampleRates; i++) {
|
| + Init(kSampleRateHz[i]);
|
| + RunStableStartup();
|
| + const int device_buf = MapBufferSizeToSamples(kDeviceBufMs,
|
| + extended_filter == 1);
|
| +
|
| + // Normal state. We are currently not in a non-causal state.
|
| + bool non_causal = false;
|
| +
|
| + // Loop through 100 frames (both render and capture), which equals 1 s
|
| + // of data. Every odd frame we set the device buffer size to
|
| + // 2 * |kDeviceBufMs| and even frames we set the device buffer size to
|
| + // zero.
|
| + for (int j = 0; j < 100; j++) {
|
| + int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
|
| + int device_buf_ms = 2 * (j % 2) * kDeviceBufMs;
|
| + RenderAndCapture(device_buf_ms);
|
| +
|
| + // Check for non-causality, compared with the average device buffer
|
| + // size.
|
| + non_causal |= (device_buf - WebRtcAec_system_delay(self_->aec) < 64);
|
| + EXPECT_GE(system_delay_before_calls,
|
| + WebRtcAec_system_delay(self_->aec));
|
| +
|
| + // Verify that the system delay is non-negative.
|
| + EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
|
| + }
|
| + // Verify we are not in a non-causal state.
|
| + EXPECT_FALSE(non_causal);
|
| + }
|
| }
|
| - // Verify we are not in a non-causal state.
|
| - EXPECT_FALSE(non_causal);
|
| }
|
| }
|
|
|
|
|