Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Side by Side Diff: webrtc/modules/audio_coding/neteq/normal.cc

Issue 2763273003: Changed OLA window for neteq. Old code didnt work well with 48khz (Closed)
Patch Set: updated hash values for Android and win64 Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/audio_coding/neteq/normal.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 // Shift 14 with proper rounding. 123 // Shift 14 with proper rounding.
124 (*output)[channel_ix][i] = 124 (*output)[channel_ix][i] =
125 static_cast<int16_t>((scaled_signal + 8192) >> 14); 125 static_cast<int16_t>((scaled_signal + 8192) >> 14);
126 // Increase mute_factor towards 16384. 126 // Increase mute_factor towards 16384.
127 external_mute_factor_array[channel_ix] = static_cast<int16_t>(std::min( 127 external_mute_factor_array[channel_ix] = static_cast<int16_t>(std::min(
128 external_mute_factor_array[channel_ix] + increment, 16384)); 128 external_mute_factor_array[channel_ix] + increment, 16384));
129 } 129 }
130 130
131 // Interpolate the expanded data into the new vector. 131 // Interpolate the expanded data into the new vector.
132 // (NB/WB/SWB32/SWB48 8/16/32/48 samples.) 132 // (NB/WB/SWB32/SWB48 8/16/32/48 samples.)
133 RTC_DCHECK_LT(fs_shift, 3); // Will always be 0, 1, or, 2. 133 size_t win_length = samples_per_ms_;
134 increment = 4 >> fs_shift; 134 int16_t win_slope_Q14 = default_win_slope_Q14_;
135 int fraction = increment; 135 RTC_DCHECK_LT(channel_ix, output->Channels());
136 // Don't interpolate over more samples than what is in output. When this 136 if (win_length > output->Size()) {
137 // cap strikes, the interpolation will likely sound worse, but this is an 137 win_length = output->Size();
138 // emergency operation in response to unexpected input. 138 win_slope_Q14 = (1 << 14) / static_cast<int16_t>(win_length);
139 const size_t interp_len_samples = 139 }
140 std::min(static_cast<size_t>(8 * fs_mult), output->Size()); 140 int16_t win_up_Q14 = 0;
141 for (size_t i = 0; i < interp_len_samples; ++i) { 141 for (size_t i = 0; i < win_length; i++) {
142 // TODO(hlundin): Add 16 instead of 8 for correct rounding. Keeping 8 142 win_up_Q14 += win_slope_Q14;
143 // now for legacy bit-exactness.
144 RTC_DCHECK_LT(channel_ix, output->Channels());
145 RTC_DCHECK_LT(i, output->Size());
146 (*output)[channel_ix][i] = 143 (*output)[channel_ix][i] =
147 static_cast<int16_t>((fraction * (*output)[channel_ix][i] + 144 (win_up_Q14 * (*output)[channel_ix][i] +
148 (32 - fraction) * expanded[channel_ix][i] + 8) >> 5); 145 ((1 << 14) - win_up_Q14) * expanded[channel_ix][i] + (1 << 13)) >>
149 fraction += increment; 146 14;
147 }
148 if (fs_hz_ == 48000) {
149 RTC_DCHECK_EQ(win_up_Q14, (1 << 14) - 16);
150 } else {
151 RTC_DCHECK_EQ(win_up_Q14, 1 << 14);
150 } 152 }
151 } 153 }
152 } else if (last_mode == kModeRfc3389Cng) { 154 } else if (last_mode == kModeRfc3389Cng) {
153 RTC_DCHECK_EQ(output->Channels(), 1); // Not adapted for multi-channel yet. 155 RTC_DCHECK_EQ(output->Channels(), 1); // Not adapted for multi-channel yet.
154 static const size_t kCngLength = 48; 156 static const size_t kCngLength = 48;
155 RTC_DCHECK_LE(8 * fs_mult, kCngLength); 157 RTC_DCHECK_LE(8 * fs_mult, kCngLength);
156 int16_t cng_output[kCngLength]; 158 int16_t cng_output[kCngLength];
157 // Reset mute factor and start up fresh. 159 // Reset mute factor and start up fresh.
158 external_mute_factor_array[0] = 16384; 160 external_mute_factor_array[0] = 16384;
159 ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); 161 ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
160 162
161 if (cng_decoder) { 163 if (cng_decoder) {
162 // Generate long enough for 48kHz. 164 // Generate long enough for 48kHz.
163 if (!cng_decoder->Generate(cng_output, 0)) { 165 if (!cng_decoder->Generate(cng_output, 0)) {
164 // Error returned; set return vector to all zeros. 166 // Error returned; set return vector to all zeros.
165 memset(cng_output, 0, sizeof(cng_output)); 167 memset(cng_output, 0, sizeof(cng_output));
166 } 168 }
167 } else { 169 } else {
168 // If no CNG instance is defined, just copy from the decoded data. 170 // If no CNG instance is defined, just copy from the decoded data.
169 // (This will result in interpolating the decoded with itself.) 171 // (This will result in interpolating the decoded with itself.)
170 (*output)[0].CopyTo(fs_mult * 8, 0, cng_output); 172 (*output)[0].CopyTo(fs_mult * 8, 0, cng_output);
171 } 173 }
172 // Interpolate the CNG into the new vector. 174 // Interpolate the CNG into the new vector.
173 // (NB/WB/SWB32/SWB48 8/16/32/48 samples.) 175 // (NB/WB/SWB32/SWB48 8/16/32/48 samples.)
174 RTC_DCHECK_LT(fs_shift, 3); // Will always be 0, 1, or, 2. 176 size_t win_length = samples_per_ms_;
175 int16_t increment = 4 >> fs_shift; 177 int16_t win_slope_Q14 = default_win_slope_Q14_;
176 int16_t fraction = increment; 178 if (win_length > kCngLength) {
177 for (size_t i = 0; i < static_cast<size_t>(8 * fs_mult); i++) { 179 win_length = kCngLength;
178 // TODO(hlundin): Add 16 instead of 8 for correct rounding. Keeping 8 now 180 win_slope_Q14 = (1 << 14) / static_cast<int16_t>(win_length);
179 // for legacy bit-exactness. 181 }
180 (*output)[0][i] = (fraction * (*output)[0][i] + 182 int16_t win_up_Q14 = 0;
181 (32 - fraction) * cng_output[i] + 8) >> 5; 183 for (size_t i = 0; i < win_length; i++) {
182 fraction += increment; 184 win_up_Q14 += win_slope_Q14;
185 (*output)[0][i] =
186 (win_up_Q14 * (*output)[0][i] +
187 ((1 << 14) - win_up_Q14) * cng_output[i] + (1 << 13)) >>
188 14;
189 }
190 if (fs_hz_ == 48000) {
191 RTC_DCHECK_EQ(win_up_Q14, (1 << 14) - 16);
192 } else {
193 RTC_DCHECK_EQ(win_up_Q14, 1 << 14);
183 } 194 }
184 } else if (external_mute_factor_array[0] < 16384) { 195 } else if (external_mute_factor_array[0] < 16384) {
185 // Previous was neither of Expand, FadeToBGN or RFC3389_CNG, but we are 196 // Previous was neither of Expand, FadeToBGN or RFC3389_CNG, but we are
186 // still ramping up from previous muting. 197 // still ramping up from previous muting.
187 // If muted increase by 0.64 for every 20 ms (NB/WB 0.0040/0.0020 in Q14). 198 // If muted increase by 0.64 for every 20 ms (NB/WB 0.0040/0.0020 in Q14).
188 int increment = 64 / fs_mult; 199 int increment = 64 / fs_mult;
189 size_t length_per_channel = length / output->Channels(); 200 size_t length_per_channel = length / output->Channels();
190 for (size_t i = 0; i < length_per_channel; i++) { 201 for (size_t i = 0; i < length_per_channel; i++) {
191 for (size_t channel_ix = 0; channel_ix < output->Channels(); 202 for (size_t channel_ix = 0; channel_ix < output->Channels();
192 ++channel_ix) { 203 ++channel_ix) {
193 // Scale with mute factor. 204 // Scale with mute factor.
194 RTC_DCHECK_LT(channel_ix, output->Channels()); 205 RTC_DCHECK_LT(channel_ix, output->Channels());
195 RTC_DCHECK_LT(i, output->Size()); 206 RTC_DCHECK_LT(i, output->Size());
196 int32_t scaled_signal = (*output)[channel_ix][i] * 207 int32_t scaled_signal = (*output)[channel_ix][i] *
197 external_mute_factor_array[channel_ix]; 208 external_mute_factor_array[channel_ix];
198 // Shift 14 with proper rounding. 209 // Shift 14 with proper rounding.
199 (*output)[channel_ix][i] = 210 (*output)[channel_ix][i] =
200 static_cast<int16_t>((scaled_signal + 8192) >> 14); 211 static_cast<int16_t>((scaled_signal + 8192) >> 14);
201 // Increase mute_factor towards 16384. 212 // Increase mute_factor towards 16384.
202 external_mute_factor_array[channel_ix] = static_cast<int16_t>(std::min( 213 external_mute_factor_array[channel_ix] = static_cast<int16_t>(std::min(
203 16384, external_mute_factor_array[channel_ix] + increment)); 214 16384, external_mute_factor_array[channel_ix] + increment));
204 } 215 }
205 } 216 }
206 } 217 }
207 218
208 return static_cast<int>(length); 219 return static_cast<int>(length);
209 } 220 }
210 221
211 } // namespace webrtc 222 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/normal.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698