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 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 size_t last_insert_index_ = 0; | 95 size_t last_insert_index_ = 0; |
96 RenderBuffer fft_buffer_; | 96 RenderBuffer fft_buffer_; |
97 DownsampledRenderBuffer downsampled_render_buffer_; | 97 DownsampledRenderBuffer downsampled_render_buffer_; |
98 DecimatorBy4 render_decimator_; | 98 DecimatorBy4 render_decimator_; |
99 ApiCallJitterBuffer api_call_jitter_buffer_; | 99 ApiCallJitterBuffer api_call_jitter_buffer_; |
100 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl); | 100 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl); |
101 }; | 101 }; |
102 | 102 |
103 RenderDelayBufferImpl::RenderDelayBufferImpl(size_t num_bands) | 103 RenderDelayBufferImpl::RenderDelayBufferImpl(size_t num_bands) |
104 : optimization_(DetectOptimization()), | 104 : optimization_(DetectOptimization()), |
105 fft_buffer_(optimization_, | 105 fft_buffer_( |
106 num_bands, | 106 optimization_, |
107 std::max(30, kAdaptiveFilterLength), | 107 num_bands, |
108 std::vector<size_t>(1, kAdaptiveFilterLength)), | 108 std::max(kResidualEchoPowerRenderWindowSize, kAdaptiveFilterLength), |
| 109 std::vector<size_t>(1, kAdaptiveFilterLength)), |
109 api_call_jitter_buffer_(num_bands) { | 110 api_call_jitter_buffer_(num_bands) { |
110 buffer_.fill(std::vector<std::vector<float>>( | 111 buffer_.fill(std::vector<std::vector<float>>( |
111 num_bands, std::vector<float>(kBlockSize, 0.f))); | 112 num_bands, std::vector<float>(kBlockSize, 0.f))); |
112 | 113 |
113 RTC_DCHECK_LT(buffer_.size(), downsampled_render_buffer_.buffer.size()); | 114 RTC_DCHECK_LT(buffer_.size(), downsampled_render_buffer_.buffer.size()); |
114 } | 115 } |
115 | 116 |
116 RenderDelayBufferImpl::~RenderDelayBufferImpl() = default; | 117 RenderDelayBufferImpl::~RenderDelayBufferImpl() = default; |
117 | 118 |
118 void RenderDelayBufferImpl::Reset() { | 119 void RenderDelayBufferImpl::Reset() { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 } | 169 } |
169 | 170 |
170 void RenderDelayBufferImpl::SetDelay(size_t delay) { | 171 void RenderDelayBufferImpl::SetDelay(size_t delay) { |
171 if (delay_ == delay) { | 172 if (delay_ == delay) { |
172 return; | 173 return; |
173 } | 174 } |
174 | 175 |
175 // If there is a new delay set, clear the fft buffer. | 176 // If there is a new delay set, clear the fft buffer. |
176 fft_buffer_.Clear(); | 177 fft_buffer_.Clear(); |
177 | 178 |
178 const size_t max_delay = buffer_.size() - 1; | 179 if ((buffer_.size() - 1) < delay) { |
179 if (max_delay < delay) { | |
180 // If the desired delay is larger than the delay buffer, shorten the delay | 180 // If the desired delay is larger than the delay buffer, shorten the delay |
181 // buffer size to achieve the desired alignment with the available buffer | 181 // buffer size to achieve the desired alignment with the available buffer |
182 // size. | 182 // size. |
183 const size_t delay_decrease = delay - max_delay; | |
184 RTC_DCHECK_LT(delay_decrease, buffer_.size()); | |
185 | |
186 downsampled_render_buffer_.position = | 183 downsampled_render_buffer_.position = |
187 (downsampled_render_buffer_.position + kSubBlockSize * delay_decrease) % | 184 (downsampled_render_buffer_.position + |
| 185 kSubBlockSize * (delay - (buffer_.size() - 1))) % |
188 downsampled_render_buffer_.buffer.size(); | 186 downsampled_render_buffer_.buffer.size(); |
189 | 187 |
190 last_insert_index_ = | 188 last_insert_index_ = |
191 (last_insert_index_ + buffer_.size() - delay_decrease) % buffer_.size(); | 189 (last_insert_index_ - (delay - (buffer_.size() - 1)) + buffer_.size()) % |
192 | 190 buffer_.size(); |
193 RTC_DCHECK_EQ(max_delay, delay_ - delay_decrease); | 191 delay_ = buffer_.size() - 1; |
194 delay_ = max_delay; | |
195 } else { | 192 } else { |
196 delay_ = delay; | 193 delay_ = delay; |
197 } | 194 } |
198 } | 195 } |
199 | 196 |
200 } // namespace | 197 } // namespace |
201 | 198 |
202 RenderDelayBuffer* RenderDelayBuffer::Create(size_t num_bands) { | 199 RenderDelayBuffer* RenderDelayBuffer::Create(size_t num_bands) { |
203 return new RenderDelayBufferImpl(num_bands); | 200 return new RenderDelayBufferImpl(num_bands); |
204 } | 201 } |
205 | 202 |
206 } // namespace webrtc | 203 } // namespace webrtc |
OLD | NEW |