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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
90 | 90 |
91 private: | 91 private: |
92 const Aec3Optimization optimization_; | 92 const Aec3Optimization optimization_; |
93 std::array<std::vector<std::vector<float>>, kRenderDelayBufferSize> buffer_; | 93 std::array<std::vector<std::vector<float>>, kRenderDelayBufferSize> buffer_; |
94 size_t delay_ = 0; | 94 size_t delay_ = 0; |
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 const std::vector<std::vector<float>> zero_block_; | |
100 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl); | 101 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl); |
101 }; | 102 }; |
102 | 103 |
103 RenderDelayBufferImpl::RenderDelayBufferImpl(size_t num_bands) | 104 RenderDelayBufferImpl::RenderDelayBufferImpl(size_t num_bands) |
104 : optimization_(DetectOptimization()), | 105 : optimization_(DetectOptimization()), |
105 fft_buffer_( | 106 fft_buffer_( |
106 optimization_, | 107 optimization_, |
107 num_bands, | 108 num_bands, |
108 std::max(kResidualEchoPowerRenderWindowSize, kAdaptiveFilterLength), | 109 std::max(kResidualEchoPowerRenderWindowSize, kAdaptiveFilterLength), |
109 std::vector<size_t>(1, kAdaptiveFilterLength)), | 110 std::vector<size_t>(1, kAdaptiveFilterLength)), |
110 api_call_jitter_buffer_(num_bands) { | 111 api_call_jitter_buffer_(num_bands), |
112 zero_block_(num_bands, std::vector<float>(kBlockSize, 0.f)) { | |
111 buffer_.fill(std::vector<std::vector<float>>( | 113 buffer_.fill(std::vector<std::vector<float>>( |
112 num_bands, std::vector<float>(kBlockSize, 0.f))); | 114 num_bands, std::vector<float>(kBlockSize, 0.f))); |
113 | 115 |
114 RTC_DCHECK_LT(buffer_.size(), downsampled_render_buffer_.buffer.size()); | 116 RTC_DCHECK_LT(buffer_.size(), downsampled_render_buffer_.buffer.size()); |
115 } | 117 } |
116 | 118 |
117 RenderDelayBufferImpl::~RenderDelayBufferImpl() = default; | 119 RenderDelayBufferImpl::~RenderDelayBufferImpl() = default; |
118 | 120 |
119 void RenderDelayBufferImpl::Reset() { | 121 void RenderDelayBufferImpl::Reset() { |
120 // Empty all data in the buffers. | 122 // Empty all data in the buffers. |
(...skipping 19 matching lines...) Expand all Loading... | |
140 // Report buffer overrun and let the caller handle the overrun. | 142 // Report buffer overrun and let the caller handle the overrun. |
141 return false; | 143 return false; |
142 } | 144 } |
143 api_call_jitter_buffer_.Insert(block); | 145 api_call_jitter_buffer_.Insert(block); |
144 | 146 |
145 return true; | 147 return true; |
146 } | 148 } |
147 | 149 |
148 bool RenderDelayBufferImpl::UpdateBuffers() { | 150 bool RenderDelayBufferImpl::UpdateBuffers() { |
149 bool underrun = true; | 151 bool underrun = true; |
150 // Update the buffers with a new block if such is available, otherwise repeat | 152 // Update the buffers with a new block if such is available, otherwise insert |
151 // the previous block. | 153 // a block of silence. |
152 if (api_call_jitter_buffer_.Size() > 0) { | 154 if (api_call_jitter_buffer_.Size() > 0) { |
153 last_insert_index_ = (last_insert_index_ + 1) % buffer_.size(); | 155 last_insert_index_ = (last_insert_index_ + 1) % buffer_.size(); |
154 api_call_jitter_buffer_.Remove(&buffer_[last_insert_index_]); | 156 api_call_jitter_buffer_.Remove(&buffer_[last_insert_index_]); |
155 | |
156 underrun = false; | 157 underrun = false; |
157 } | 158 } |
158 | 159 |
159 downsampled_render_buffer_.position = | 160 downsampled_render_buffer_.position = |
160 (downsampled_render_buffer_.position - kSubBlockSize + | 161 (downsampled_render_buffer_.position - kSubBlockSize + |
161 downsampled_render_buffer_.buffer.size()) % | 162 downsampled_render_buffer_.buffer.size()) % |
162 downsampled_render_buffer_.buffer.size(); | 163 downsampled_render_buffer_.buffer.size(); |
163 | 164 |
164 std::array<float, kSubBlockSize> render_downsampled; | 165 std::array<float, kSubBlockSize> render_downsampled; |
165 render_decimator_.Decimate(buffer_[last_insert_index_][0], | 166 if (!underrun) { |
aleloi
2017/05/03 11:23:39
I think if/else statements should check for the po
peah-webrtc
2017/05/03 11:31:23
I agree, good point! I prefer to have the most nor
| |
166 render_downsampled); | 167 render_decimator_.Decimate(buffer_[last_insert_index_][0], |
168 render_downsampled); | |
169 } else { | |
170 render_decimator_.Decimate(zero_block_[0], render_downsampled); | |
171 } | |
167 std::copy(render_downsampled.rbegin(), render_downsampled.rend(), | 172 std::copy(render_downsampled.rbegin(), render_downsampled.rend(), |
168 downsampled_render_buffer_.buffer.begin() + | 173 downsampled_render_buffer_.buffer.begin() + |
169 downsampled_render_buffer_.position); | 174 downsampled_render_buffer_.position); |
170 | 175 |
171 fft_buffer_.Insert( | 176 if (!underrun) { |
aleloi
2017/05/03 11:23:39
Same here.
peah-webrtc
2017/05/03 11:31:22
Done.
| |
172 buffer_[(last_insert_index_ - delay_ + buffer_.size()) % buffer_.size()]); | 177 fft_buffer_.Insert(buffer_[(last_insert_index_ - delay_ + buffer_.size()) % |
178 buffer_.size()]); | |
179 } else { | |
180 fft_buffer_.Insert(zero_block_); | |
181 } | |
173 return !underrun; | 182 return !underrun; |
174 } | 183 } |
175 | 184 |
176 void RenderDelayBufferImpl::SetDelay(size_t delay) { | 185 void RenderDelayBufferImpl::SetDelay(size_t delay) { |
177 if (delay_ == delay) { | 186 if (delay_ == delay) { |
178 return; | 187 return; |
179 } | 188 } |
180 | 189 |
181 // If there is a new delay set, clear the fft buffer. | 190 // If there is a new delay set, clear the fft buffer. |
182 fft_buffer_.Clear(); | 191 fft_buffer_.Clear(); |
(...skipping 16 matching lines...) Expand all Loading... | |
199 } | 208 } |
200 } | 209 } |
201 | 210 |
202 } // namespace | 211 } // namespace |
203 | 212 |
204 RenderDelayBuffer* RenderDelayBuffer::Create(size_t num_bands) { | 213 RenderDelayBuffer* RenderDelayBuffer::Create(size_t num_bands) { |
205 return new RenderDelayBufferImpl(num_bands); | 214 return new RenderDelayBufferImpl(num_bands); |
206 } | 215 } |
207 | 216 |
208 } // namespace webrtc | 217 } // namespace webrtc |
OLD | NEW |