| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/modules/audio_processing/aec3/render_delay_controller.h" | 11 #include "webrtc/modules/audio_processing/aec3/render_delay_controller.h" |
| 12 | 12 |
| 13 #include <algorithm> | 13 #include <algorithm> |
| 14 #include <memory> | 14 #include <memory> |
| 15 #include <sstream> | 15 #include <sstream> |
| 16 #include <string> | 16 #include <string> |
| 17 #include <vector> | 17 #include <vector> |
| 18 | 18 |
| 19 #include "webrtc/base/random.h" | 19 #include "webrtc/base/random.h" |
| 20 #include "webrtc/modules/audio_processing/aec3/aec3_common.h" | 20 #include "webrtc/modules/audio_processing/aec3/aec3_common.h" |
| 21 #include "webrtc/modules/audio_processing/aec3/block_processor.h" |
| 22 #include "webrtc/modules/audio_processing/aec3/decimator_by_4.h" |
| 21 #include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h" | 23 #include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h" |
| 22 #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h" | 24 #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h" |
| 23 #include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h" | 25 #include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h" |
| 24 #include "webrtc/test/gtest.h" | 26 #include "webrtc/test/gtest.h" |
| 25 | 27 |
| 26 namespace webrtc { | 28 namespace webrtc { |
| 27 namespace { | 29 namespace { |
| 28 | 30 |
| 29 std::string ProduceDebugText(int sample_rate_hz) { | 31 std::string ProduceDebugText(int sample_rate_hz) { |
| 30 std::ostringstream ss; | 32 std::ostringstream ss; |
| 31 ss << "Sample rate: " << sample_rate_hz; | 33 ss << "Sample rate: " << sample_rate_hz; |
| 32 return ss.str(); | 34 return ss.str(); |
| 33 } | 35 } |
| 34 | 36 |
| 35 std::string ProduceDebugText(int sample_rate_hz, size_t delay) { | 37 std::string ProduceDebugText(int sample_rate_hz, size_t delay) { |
| 36 std::ostringstream ss; | 38 std::ostringstream ss; |
| 37 ss << ProduceDebugText(sample_rate_hz) << ", Delay: " << delay; | 39 ss << ProduceDebugText(sample_rate_hz) << ", Delay: " << delay; |
| 38 return ss.str(); | 40 return ss.str(); |
| 39 } | 41 } |
| 40 | 42 |
| 41 std::string ProduceDebugText(int sample_rate_hz, | |
| 42 size_t delay, | |
| 43 size_t max_jitter) { | |
| 44 std::ostringstream ss; | |
| 45 ss << ProduceDebugText(sample_rate_hz, delay) | |
| 46 << ", Max Api call jitter: " << max_jitter; | |
| 47 return ss.str(); | |
| 48 } | |
| 49 | |
| 50 constexpr size_t kMaxApiCallJitter = 30; | |
| 51 | |
| 52 } // namespace | 43 } // namespace |
| 53 | 44 |
| 54 // Verifies the output of GetDelay when there are no AnalyzeRender calls. | 45 // Verifies the output of GetDelay when there are no AnalyzeRender calls. |
| 55 TEST(RenderDelayController, NoRenderSignal) { | 46 TEST(RenderDelayController, NoRenderSignal) { |
| 56 std::vector<float> block(kBlockSize, 0.f); | 47 std::vector<float> block(kBlockSize, 0.f); |
| 57 for (auto rate : {8000, 16000, 32000, 48000}) { | 48 for (auto rate : {8000, 16000, 32000, 48000}) { |
| 58 SCOPED_TRACE(ProduceDebugText(rate)); | 49 SCOPED_TRACE(ProduceDebugText(rate)); |
| 59 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | 50 std::unique_ptr<RenderDelayBuffer> delay_buffer( |
| 60 250, NumBandsForRate(rate), kMaxApiCallJitter)); | 51 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 61 std::unique_ptr<RenderDelayController> delay_controller( | 52 std::unique_ptr<RenderDelayController> delay_controller( |
| 62 RenderDelayController::Create(rate, *delay_buffer)); | 53 RenderDelayController::Create(rate)); |
| 63 for (size_t k = 0; k < 100; ++k) { | 54 for (size_t k = 0; k < 100; ++k) { |
| 64 EXPECT_EQ(0u, delay_controller->GetDelay(block)); | 55 EXPECT_EQ(0u, delay_controller->GetDelay( |
| 56 delay_buffer->GetDownsampledRenderBuffer(), block)); |
| 65 } | 57 } |
| 66 } | 58 } |
| 67 } | 59 } |
| 68 | 60 |
| 69 // Verifies the behavior when there are too many AnalyzeRender calls. | |
| 70 TEST(RenderDelayController, RenderOverflow) { | |
| 71 std::vector<float> block(kBlockSize, 0.f); | |
| 72 for (auto rate : {8000, 16000, 32000, 48000}) { | |
| 73 SCOPED_TRACE(ProduceDebugText(rate)); | |
| 74 std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create( | |
| 75 250, NumBandsForRate(rate), kMaxApiCallJitter)); | |
| 76 std::unique_ptr<RenderDelayController> delay_controller( | |
| 77 RenderDelayController::Create(rate, *delay_buffer)); | |
| 78 for (size_t k = 0; k < kMaxApiCallJitter; ++k) { | |
| 79 EXPECT_TRUE(delay_controller->AnalyzeRender(block)); | |
| 80 } | |
| 81 EXPECT_FALSE(delay_controller->AnalyzeRender(block)); | |
| 82 delay_controller->GetDelay(block); | |
| 83 EXPECT_TRUE(delay_controller->AnalyzeRender(block)); | |
| 84 } | |
| 85 } | |
| 86 | |
| 87 // Verifies the basic API call sequence. | 61 // Verifies the basic API call sequence. |
| 88 TEST(RenderDelayController, BasicApiCalls) { | 62 TEST(RenderDelayController, BasicApiCalls) { |
| 89 std::vector<float> render_block(kBlockSize, 0.f); | |
| 90 std::vector<float> capture_block(kBlockSize, 0.f); | 63 std::vector<float> capture_block(kBlockSize, 0.f); |
| 91 size_t delay_blocks = 0; | 64 size_t delay_blocks = 0; |
| 92 for (auto rate : {8000, 16000, 32000, 48000}) { | 65 for (auto rate : {8000, 16000, 32000, 48000}) { |
| 66 std::vector<std::vector<float>> render_block( |
| 67 NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
| 93 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 68 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
| 94 RenderDelayBuffer::Create(50, NumBandsForRate(rate), | 69 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 95 kMaxApiCallJitter)); | |
| 96 std::unique_ptr<RenderDelayController> delay_controller( | 70 std::unique_ptr<RenderDelayController> delay_controller( |
| 97 RenderDelayController::Create(rate, *render_delay_buffer)); | 71 RenderDelayController::Create(rate)); |
| 98 for (size_t k = 0; k < 10; ++k) { | 72 for (size_t k = 0; k < 10; ++k) { |
| 99 EXPECT_TRUE(delay_controller->AnalyzeRender(render_block)); | 73 render_delay_buffer->Insert(render_block); |
| 100 delay_blocks = delay_controller->GetDelay(capture_block); | 74 render_delay_buffer->UpdateBuffers(); |
| 75 delay_blocks = delay_controller->GetDelay( |
| 76 render_delay_buffer->GetDownsampledRenderBuffer(), capture_block); |
| 101 } | 77 } |
| 102 EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples()); | 78 EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples()); |
| 103 EXPECT_EQ(0u, delay_blocks); | 79 EXPECT_EQ(0u, delay_blocks); |
| 104 } | 80 } |
| 105 } | 81 } |
| 106 | 82 |
| 107 // Verifies that the RenderDelayController is able to align the signals for | 83 // Verifies that the RenderDelayController is able to align the signals for |
| 108 // simple timeshifts between the signals. | 84 // simple timeshifts between the signals. |
| 109 TEST(RenderDelayController, Alignment) { | 85 TEST(RenderDelayController, Alignment) { |
| 110 Random random_generator(42U); | 86 Random random_generator(42U); |
| 111 std::vector<float> render_block(kBlockSize, 0.f); | |
| 112 std::vector<float> capture_block(kBlockSize, 0.f); | 87 std::vector<float> capture_block(kBlockSize, 0.f); |
| 113 size_t delay_blocks = 0; | 88 size_t delay_blocks = 0; |
| 114 for (auto rate : {8000, 16000, 32000, 48000}) { | 89 for (auto rate : {8000, 16000, 32000, 48000}) { |
| 90 std::vector<std::vector<float>> render_block( |
| 91 NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
| 92 |
| 115 for (size_t delay_samples : {15, 50, 150, 200, 800, 4000}) { | 93 for (size_t delay_samples : {15, 50, 150, 200, 800, 4000}) { |
| 116 SCOPED_TRACE(ProduceDebugText(rate, delay_samples)); | 94 SCOPED_TRACE(ProduceDebugText(rate, delay_samples)); |
| 117 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 95 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
| 118 RenderDelayBuffer::Create(250, NumBandsForRate(rate), | 96 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 119 kMaxApiCallJitter)); | |
| 120 std::unique_ptr<RenderDelayController> delay_controller( | 97 std::unique_ptr<RenderDelayController> delay_controller( |
| 121 RenderDelayController::Create(rate, *render_delay_buffer)); | 98 RenderDelayController::Create(rate)); |
| 122 DelayBuffer<float> signal_delay_buffer(delay_samples); | 99 DelayBuffer<float> signal_delay_buffer(delay_samples); |
| 123 for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) { | 100 for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) { |
| 124 RandomizeSampleVector(&random_generator, render_block); | 101 RandomizeSampleVector(&random_generator, render_block[0]); |
| 125 signal_delay_buffer.Delay(render_block, capture_block); | 102 signal_delay_buffer.Delay(render_block[0], capture_block); |
| 126 EXPECT_TRUE(delay_controller->AnalyzeRender(render_block)); | 103 render_delay_buffer->Insert(render_block); |
| 127 delay_blocks = delay_controller->GetDelay(capture_block); | 104 render_delay_buffer->UpdateBuffers(); |
| 105 delay_blocks = delay_controller->GetDelay( |
| 106 render_delay_buffer->GetDownsampledRenderBuffer(), capture_block); |
| 128 } | 107 } |
| 129 | 108 |
| 130 constexpr int kDelayHeadroomBlocks = 1; | 109 constexpr int kDelayHeadroomBlocks = 1; |
| 131 size_t expected_delay_blocks = | 110 size_t expected_delay_blocks = |
| 132 std::max(0, static_cast<int>(delay_samples / kBlockSize) - | 111 std::max(0, static_cast<int>(delay_samples / kBlockSize) - |
| 133 kDelayHeadroomBlocks); | 112 kDelayHeadroomBlocks); |
| 134 if (expected_delay_blocks < 2) { | 113 if (expected_delay_blocks < 2) { |
| 135 expected_delay_blocks = 0; | 114 expected_delay_blocks = 0; |
| 136 } | 115 } |
| 137 | 116 |
| 138 EXPECT_EQ(expected_delay_blocks, delay_blocks); | 117 EXPECT_EQ(expected_delay_blocks, delay_blocks); |
| 139 | 118 |
| 140 const rtc::Optional<size_t> headroom_samples = | 119 const rtc::Optional<size_t> headroom_samples = |
| 141 delay_controller->AlignmentHeadroomSamples(); | 120 delay_controller->AlignmentHeadroomSamples(); |
| 142 ASSERT_TRUE(headroom_samples); | 121 ASSERT_TRUE(headroom_samples); |
| 143 EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, *headroom_samples, | 122 EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, *headroom_samples, |
| 144 4); | 123 4); |
| 145 } | 124 } |
| 146 } | 125 } |
| 147 } | 126 } |
| 148 | 127 |
| 149 // Verifies that the RenderDelayController is able to align the signals for | 128 // Verifies that the RenderDelayController is able to align the signals for |
| 150 // simple timeshifts between the signals when there is jitter in the API calls. | 129 // simple timeshifts between the signals when there is jitter in the API calls. |
| 151 TEST(RenderDelayController, AlignmentWithJitter) { | 130 TEST(RenderDelayController, AlignmentWithJitter) { |
| 152 Random random_generator(42U); | 131 Random random_generator(42U); |
| 153 std::vector<float> render_block(kBlockSize, 0.f); | |
| 154 std::vector<float> capture_block(kBlockSize, 0.f); | 132 std::vector<float> capture_block(kBlockSize, 0.f); |
| 155 for (auto rate : {8000, 16000, 32000, 48000}) { | 133 for (auto rate : {8000, 16000, 32000, 48000}) { |
| 156 for (size_t delay_samples : {15, 50, 800}) { | 134 std::vector<std::vector<float>> render_block( |
| 157 for (size_t max_jitter : {1, 9, 20}) { | 135 NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f)); |
| 158 size_t delay_blocks = 0; | 136 for (size_t delay_samples : {15, 50, 300, 800}) { |
| 159 SCOPED_TRACE(ProduceDebugText(rate, delay_samples, max_jitter)); | 137 size_t delay_blocks = 0; |
| 160 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 138 SCOPED_TRACE(ProduceDebugText(rate, delay_samples)); |
| 161 RenderDelayBuffer::Create(250, NumBandsForRate(rate), max_jitter)); | 139 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
| 162 std::unique_ptr<RenderDelayController> delay_controller( | 140 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 163 RenderDelayController::Create(rate, *render_delay_buffer)); | 141 std::unique_ptr<RenderDelayController> delay_controller( |
| 164 DelayBuffer<float> signal_delay_buffer(delay_samples); | 142 RenderDelayController::Create(rate)); |
| 165 for (size_t j = 0; | 143 DelayBuffer<float> signal_delay_buffer(delay_samples); |
| 166 j < (300 + delay_samples / kBlockSize) / max_jitter + 1; ++j) { | 144 for (size_t j = 0; |
| 167 std::vector<std::vector<float>> capture_block_buffer; | 145 j < |
| 168 for (size_t k = 0; k < max_jitter; ++k) { | 146 (1000 + delay_samples / kBlockSize) / kMaxApiCallsJitterBlocks + 1; |
| 169 RandomizeSampleVector(&random_generator, render_block); | 147 ++j) { |
| 170 signal_delay_buffer.Delay(render_block, capture_block); | 148 std::vector<std::vector<float>> capture_block_buffer; |
| 171 capture_block_buffer.push_back(capture_block); | 149 for (size_t k = 0; k < (kMaxApiCallsJitterBlocks - 1); ++k) { |
| 172 EXPECT_TRUE(delay_controller->AnalyzeRender(render_block)); | 150 RandomizeSampleVector(&random_generator, render_block[0]); |
| 173 } | 151 signal_delay_buffer.Delay(render_block[0], capture_block); |
| 174 for (size_t k = 0; k < max_jitter; ++k) { | 152 capture_block_buffer.push_back(capture_block); |
| 175 delay_blocks = delay_controller->GetDelay(capture_block_buffer[k]); | 153 render_delay_buffer->Insert(render_block); |
| 176 } | |
| 177 } | 154 } |
| 155 for (size_t k = 0; k < (kMaxApiCallsJitterBlocks - 1); ++k) { |
| 156 render_delay_buffer->UpdateBuffers(); |
| 157 delay_blocks = delay_controller->GetDelay( |
| 158 render_delay_buffer->GetDownsampledRenderBuffer(), |
| 159 capture_block_buffer[k]); |
| 160 } |
| 161 } |
| 178 | 162 |
| 179 constexpr int kDelayHeadroomBlocks = 1; | 163 constexpr int kDelayHeadroomBlocks = 1; |
| 180 size_t expected_delay_blocks = | 164 size_t expected_delay_blocks = |
| 181 std::max(0, static_cast<int>(delay_samples / kBlockSize) - | 165 std::max(0, static_cast<int>(delay_samples / kBlockSize) - |
| 182 kDelayHeadroomBlocks); | 166 kDelayHeadroomBlocks); |
| 183 if (expected_delay_blocks < 2) { | 167 if (expected_delay_blocks < 2) { |
| 184 expected_delay_blocks = 0; | 168 expected_delay_blocks = 0; |
| 185 } | 169 } |
| 186 | 170 |
| 187 EXPECT_EQ(expected_delay_blocks, delay_blocks); | 171 EXPECT_EQ(expected_delay_blocks, delay_blocks); |
| 188 | 172 |
| 189 const rtc::Optional<size_t> headroom_samples = | 173 const rtc::Optional<size_t> headroom_samples = |
| 190 delay_controller->AlignmentHeadroomSamples(); | 174 delay_controller->AlignmentHeadroomSamples(); |
| 191 ASSERT_TRUE(headroom_samples); | 175 ASSERT_TRUE(headroom_samples); |
| 192 EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, | 176 EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, *headroom_samples, |
| 193 *headroom_samples, 4); | 177 4); |
| 194 } | 178 } |
| 195 } | 179 } |
| 196 } | 180 } |
| 197 } | |
| 198 | 181 |
| 199 // Verifies the initial value for the AlignmentHeadroomSamples. | 182 // Verifies the initial value for the AlignmentHeadroomSamples. |
| 200 TEST(RenderDelayController, InitialHeadroom) { | 183 TEST(RenderDelayController, InitialHeadroom) { |
| 201 std::vector<float> render_block(kBlockSize, 0.f); | 184 std::vector<float> render_block(kBlockSize, 0.f); |
| 202 std::vector<float> capture_block(kBlockSize, 0.f); | 185 std::vector<float> capture_block(kBlockSize, 0.f); |
| 203 for (auto rate : {8000, 16000, 32000, 48000}) { | 186 for (auto rate : {8000, 16000, 32000, 48000}) { |
| 204 SCOPED_TRACE(ProduceDebugText(rate)); | 187 SCOPED_TRACE(ProduceDebugText(rate)); |
| 205 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 188 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
| 206 RenderDelayBuffer::Create(250, NumBandsForRate(rate), | 189 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 207 kMaxApiCallJitter)); | |
| 208 std::unique_ptr<RenderDelayController> delay_controller( | 190 std::unique_ptr<RenderDelayController> delay_controller( |
| 209 RenderDelayController::Create(rate, *render_delay_buffer)); | 191 RenderDelayController::Create(rate)); |
| 210 EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples()); | 192 EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples()); |
| 211 } | 193 } |
| 212 } | 194 } |
| 213 | 195 |
| 214 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 196 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
| 215 | 197 |
| 216 // Verifies the check for the capture signal block size. | 198 // Verifies the check for the capture signal block size. |
| 217 TEST(RenderDelayController, WrongCaptureSize) { | 199 TEST(RenderDelayController, WrongCaptureSize) { |
| 218 std::vector<float> block(kBlockSize - 1, 0.f); | 200 std::vector<float> block(kBlockSize - 1, 0.f); |
| 219 for (auto rate : {8000, 16000, 32000, 48000}) { | 201 for (auto rate : {8000, 16000, 32000, 48000}) { |
| 220 SCOPED_TRACE(ProduceDebugText(rate)); | 202 SCOPED_TRACE(ProduceDebugText(rate)); |
| 221 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 203 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
| 222 RenderDelayBuffer::Create(250, NumBandsForRate(rate), | 204 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 223 kMaxApiCallJitter)); | 205 EXPECT_DEATH( |
| 224 EXPECT_DEATH(std::unique_ptr<RenderDelayController>( | 206 std::unique_ptr<RenderDelayController>( |
| 225 RenderDelayController::Create(rate, *render_delay_buffer)) | 207 RenderDelayController::Create(rate)) |
| 226 ->GetDelay(block), | 208 ->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(), |
| 227 ""); | 209 block), |
| 228 } | 210 ""); |
| 229 } | |
| 230 | |
| 231 // Verifies the check for the render signal block size. | |
| 232 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH | |
| 233 // tests on test bots has been fixed. | |
| 234 TEST(RenderDelayController, DISABLED_WrongRenderSize) { | |
| 235 std::vector<float> block(kBlockSize - 1, 0.f); | |
| 236 for (auto rate : {8000, 16000, 32000, 48000}) { | |
| 237 SCOPED_TRACE(ProduceDebugText(rate)); | |
| 238 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | |
| 239 RenderDelayBuffer::Create(250, NumBandsForRate(rate), | |
| 240 kMaxApiCallJitter)); | |
| 241 EXPECT_DEATH(std::unique_ptr<RenderDelayController>( | |
| 242 RenderDelayController::Create(rate, *render_delay_buffer)) | |
| 243 ->AnalyzeRender(block), | |
| 244 ""); | |
| 245 } | 211 } |
| 246 } | 212 } |
| 247 | 213 |
| 248 // Verifies the check for correct sample rate. | 214 // Verifies the check for correct sample rate. |
| 249 TEST(RenderDelayController, WrongSampleRate) { | 215 // TODO(peah): Re-enable the test once the issue with memory leaks during DEATH |
| 216 // tests on test bots has been fixed. |
| 217 TEST(RenderDelayController, DISABLED_WrongSampleRate) { |
| 250 for (auto rate : {-1, 0, 8001, 16001}) { | 218 for (auto rate : {-1, 0, 8001, 16001}) { |
| 251 SCOPED_TRACE(ProduceDebugText(rate)); | 219 SCOPED_TRACE(ProduceDebugText(rate)); |
| 252 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 220 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
| 253 RenderDelayBuffer::Create(10, NumBandsForRate(rate), | 221 RenderDelayBuffer::Create(NumBandsForRate(rate))); |
| 254 kMaxApiCallJitter)); | |
| 255 EXPECT_DEATH(std::unique_ptr<RenderDelayController>( | 222 EXPECT_DEATH(std::unique_ptr<RenderDelayController>( |
| 256 RenderDelayController::Create(rate, *render_delay_buffer)), | 223 RenderDelayController::Create(rate)), |
| 257 ""); | 224 ""); |
| 258 } | 225 } |
| 259 } | 226 } |
| 260 | 227 |
| 261 #endif | 228 #endif |
| 262 | 229 |
| 263 } // namespace webrtc | 230 } // namespace webrtc |
| OLD | NEW |