OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 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 22 matching lines...) Expand all Loading... |
33 * Search routine for codebook encoding and gain quantization. | 33 * Search routine for codebook encoding and gain quantization. |
34 *----------------------------------------------------------------*/ | 34 *----------------------------------------------------------------*/ |
35 | 35 |
36 void WebRtcIlbcfix_CbSearch( | 36 void WebRtcIlbcfix_CbSearch( |
37 IlbcEncoder *iLBCenc_inst, | 37 IlbcEncoder *iLBCenc_inst, |
38 /* (i) the encoder state structure */ | 38 /* (i) the encoder state structure */ |
39 int16_t *index, /* (o) Codebook indices */ | 39 int16_t *index, /* (o) Codebook indices */ |
40 int16_t *gain_index, /* (o) Gain quantization indices */ | 40 int16_t *gain_index, /* (o) Gain quantization indices */ |
41 int16_t *intarget, /* (i) Target vector for encoding */ | 41 int16_t *intarget, /* (i) Target vector for encoding */ |
42 int16_t *decResidual,/* (i) Decoded residual for codebook construction */ | 42 int16_t *decResidual,/* (i) Decoded residual for codebook construction */ |
43 int16_t lMem, /* (i) Length of buffer */ | 43 size_t lMem, /* (i) Length of buffer */ |
44 int16_t lTarget, /* (i) Length of vector */ | 44 size_t lTarget, /* (i) Length of vector */ |
45 int16_t *weightDenum,/* (i) weighting filter coefficients in Q12 */ | 45 int16_t *weightDenum,/* (i) weighting filter coefficients in Q12 */ |
46 int16_t block /* (i) the subblock number */ | 46 size_t block /* (i) the subblock number */ |
47 ) { | 47 ) { |
48 int16_t i, j, stage, range; | 48 size_t i, range; |
| 49 int16_t ii, j, stage; |
49 int16_t *pp; | 50 int16_t *pp; |
50 int16_t tmp; | 51 int16_t tmp; |
51 int scale; | 52 int scale; |
52 int16_t bits, temp1, temp2; | 53 int16_t bits, temp1, temp2; |
53 int16_t base_size; | 54 size_t base_size; |
54 int32_t codedEner, targetEner; | 55 int32_t codedEner, targetEner; |
55 int16_t gains[CB_NSTAGES+1]; | 56 int16_t gains[CB_NSTAGES+1]; |
56 int16_t *cb_vecPtr; | 57 int16_t *cb_vecPtr; |
57 int16_t indexOffset, sInd, eInd; | 58 size_t indexOffset, sInd, eInd; |
58 int32_t CritMax=0; | 59 int32_t CritMax=0; |
59 int16_t shTotMax=WEBRTC_SPL_WORD16_MIN; | 60 int16_t shTotMax=WEBRTC_SPL_WORD16_MIN; |
60 int16_t bestIndex=0; | 61 size_t bestIndex=0; |
61 int16_t bestGain=0; | 62 int16_t bestGain=0; |
62 int16_t indexNew, CritNewSh; | 63 size_t indexNew; |
| 64 int16_t CritNewSh; |
63 int32_t CritNew; | 65 int32_t CritNew; |
64 int32_t *cDotPtr; | 66 int32_t *cDotPtr; |
65 int16_t noOfZeros; | 67 size_t noOfZeros; |
66 int16_t *gainPtr; | 68 int16_t *gainPtr; |
67 int32_t t32, tmpW32; | 69 int32_t t32, tmpW32; |
68 int16_t *WebRtcIlbcfix_kGainSq5_ptr; | 70 int16_t *WebRtcIlbcfix_kGainSq5_ptr; |
69 /* Stack based */ | 71 /* Stack based */ |
70 int16_t CBbuf[CB_MEML+LPC_FILTERORDER+CB_HALFFILTERLEN]; | 72 int16_t CBbuf[CB_MEML+LPC_FILTERORDER+CB_HALFFILTERLEN]; |
71 int32_t cDot[128]; | 73 int32_t cDot[128]; |
72 int32_t Crit[128]; | 74 int32_t Crit[128]; |
73 int16_t targetVec[SUBL+LPC_FILTERORDER]; | 75 int16_t targetVec[SUBL+LPC_FILTERORDER]; |
74 int16_t cbvectors[CB_MEML + 1]; /* Adding one extra position for | 76 int16_t cbvectors[CB_MEML + 1]; /* Adding one extra position for |
75 Coverity warnings. */ | 77 Coverity warnings. */ |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 WebRtcIlbcfix_InterpolateSamples(interpSamples, buf, lMem); | 143 WebRtcIlbcfix_InterpolateSamples(interpSamples, buf, lMem); |
142 | 144 |
143 /* Second section, filtered half of the cb */ | 145 /* Second section, filtered half of the cb */ |
144 WebRtcIlbcfix_InterpolateSamples(interpSamplesFilt, cbvectors, lMem); | 146 WebRtcIlbcfix_InterpolateSamples(interpSamplesFilt, cbvectors, lMem); |
145 | 147 |
146 /* Compute the CB vectors' energies for the first cb section (non-filtered)
*/ | 148 /* Compute the CB vectors' energies for the first cb section (non-filtered)
*/ |
147 WebRtcIlbcfix_CbMemEnergyAugmentation(interpSamples, buf, | 149 WebRtcIlbcfix_CbMemEnergyAugmentation(interpSamples, buf, |
148 scale, 20, energyW16, energyShifts); | 150 scale, 20, energyW16, energyShifts); |
149 | 151 |
150 /* Compute the CB vectors' energies for the second cb section (filtered cb)
*/ | 152 /* Compute the CB vectors' energies for the second cb section (filtered cb)
*/ |
151 WebRtcIlbcfix_CbMemEnergyAugmentation(interpSamplesFilt, cbvectors, | 153 WebRtcIlbcfix_CbMemEnergyAugmentation(interpSamplesFilt, cbvectors, scale, |
152 scale, (int16_t)(base_size + 20), | 154 base_size + 20, energyW16, |
153 energyW16, energyShifts); | 155 energyShifts); |
154 | 156 |
155 /* Compute the CB vectors' energies and store them in the vector | 157 /* Compute the CB vectors' energies and store them in the vector |
156 * energyW16. Also the corresponding shift values are stored. The | 158 * energyW16. Also the corresponding shift values are stored. The |
157 * energy values are used in all three stages. */ | 159 * energy values are used in all three stages. */ |
158 WebRtcIlbcfix_CbMemEnergy(range, buf, cbvectors, lMem, | 160 WebRtcIlbcfix_CbMemEnergy(range, buf, cbvectors, lMem, |
159 lTarget, energyW16+20, energyShifts+20, scale, bas
e_size); | 161 lTarget, energyW16+20, energyShifts+20, scale, bas
e_size); |
160 | 162 |
161 } else { | 163 } else { |
162 /* Compute the CB vectors' energies and store them in the vector | 164 /* Compute the CB vectors' energies and store them in the vector |
163 * energyW16. Also the corresponding shift values are stored. The | 165 * energyW16. Also the corresponding shift values are stored. The |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 indexOffset=0; | 219 indexOffset=0; |
218 | 220 |
219 /* Search for best index in this part of the vector */ | 221 /* Search for best index in this part of the vector */ |
220 WebRtcIlbcfix_CbSearchCore( | 222 WebRtcIlbcfix_CbSearchCore( |
221 cDot, range, stage, inverseEnergy, | 223 cDot, range, stage, inverseEnergy, |
222 inverseEnergyShifts, Crit, | 224 inverseEnergyShifts, Crit, |
223 &indexNew, &CritNew, &CritNewSh); | 225 &indexNew, &CritNew, &CritNewSh); |
224 | 226 |
225 /* Update the global best index and the corresponding gain */ | 227 /* Update the global best index and the corresponding gain */ |
226 WebRtcIlbcfix_CbUpdateBestIndex( | 228 WebRtcIlbcfix_CbUpdateBestIndex( |
227 CritNew, CritNewSh, (int16_t)(indexNew+indexOffset), cDot[indexNew+index
Offset], | 229 CritNew, CritNewSh, indexNew+indexOffset, cDot[indexNew+indexOffset], |
228 inverseEnergy[indexNew+indexOffset], inverseEnergyShifts[indexNew+indexO
ffset], | 230 inverseEnergy[indexNew+indexOffset], inverseEnergyShifts[indexNew+indexO
ffset], |
229 &CritMax, &shTotMax, &bestIndex, &bestGain); | 231 &CritMax, &shTotMax, &bestIndex, &bestGain); |
230 | 232 |
231 sInd = ((CB_RESRANGE >> 1) > bestIndex) ? | 233 sInd = ((CB_RESRANGE >> 1) > bestIndex) ? |
232 0 : (bestIndex - (CB_RESRANGE >> 1)); | 234 0 : (bestIndex - (CB_RESRANGE >> 1)); |
233 eInd=sInd+CB_RESRANGE; | 235 eInd=sInd+CB_RESRANGE; |
234 if (eInd>=range) { | 236 if (eInd>=range) { |
235 eInd=range-1; | 237 eInd=range-1; |
236 sInd=eInd-CB_RESRANGE; | 238 sInd=eInd-CB_RESRANGE; |
237 } | 239 } |
238 | 240 |
239 range = WebRtcIlbcfix_kSearchRange[block][stage]; | 241 range = WebRtcIlbcfix_kSearchRange[block][stage]; |
240 | 242 |
241 if (lTarget==SUBL) { | 243 if (lTarget==SUBL) { |
242 i=sInd; | 244 i=sInd; |
243 if (sInd<20) { | 245 if (sInd<20) { |
244 WebRtcIlbcfix_AugmentedCbCorr(target, cbvectors + lMem, | 246 WebRtcIlbcfix_AugmentedCbCorr(target, cbvectors + lMem, |
245 interpSamplesFilt, cDot, | 247 interpSamplesFilt, cDot, sInd + 20, |
246 (int16_t)(sInd + 20), | 248 WEBRTC_SPL_MIN(39, (eInd + 20)), scale); |
247 (int16_t)(WEBRTC_SPL_MIN(39, | |
248 (eInd + 20))), | |
249 scale); | |
250 i=20; | 249 i=20; |
251 cDotPtr = &cDot[20 - sInd]; | 250 cDotPtr = &cDot[20 - sInd]; |
252 } else { | 251 } else { |
253 cDotPtr = cDot; | 252 cDotPtr = cDot; |
254 } | 253 } |
255 | 254 |
256 cb_vecPtr = cbvectors+lMem-20-i; | 255 cb_vecPtr = cbvectors+lMem-20-i; |
257 | 256 |
258 /* Calculate the cross correlations (main part of the filtered CB) */ | 257 /* Calculate the cross correlations (main part of the filtered CB) */ |
259 WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget, | 258 WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget, |
260 (int16_t)(eInd - i + 1), scale, -1); | 259 eInd - i + 1, scale, -1); |
261 | 260 |
262 } else { | 261 } else { |
263 cDotPtr = cDot; | 262 cDotPtr = cDot; |
264 cb_vecPtr = cbvectors+lMem-lTarget-sInd; | 263 cb_vecPtr = cbvectors+lMem-lTarget-sInd; |
265 | 264 |
266 /* Calculate the cross correlations (main part of the filtered CB) */ | 265 /* Calculate the cross correlations (main part of the filtered CB) */ |
267 WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget, | 266 WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget, |
268 (int16_t)(eInd - sInd + 1), scale, -1); | 267 eInd - sInd + 1, scale, -1); |
269 | 268 |
270 } | 269 } |
271 | 270 |
272 /* Adjust the search range for the augmented vectors */ | 271 /* Adjust the search range for the augmented vectors */ |
273 indexOffset=base_size+sInd; | 272 indexOffset=base_size+sInd; |
274 | 273 |
275 /* Search for best index in this part of the vector */ | 274 /* Search for best index in this part of the vector */ |
276 WebRtcIlbcfix_CbSearchCore( | 275 WebRtcIlbcfix_CbSearchCore( |
277 cDot, (int16_t)(eInd-sInd+1), stage, inverseEnergy+indexOffset, | 276 cDot, eInd-sInd+1, stage, inverseEnergy+indexOffset, |
278 inverseEnergyShifts+indexOffset, Crit, | 277 inverseEnergyShifts+indexOffset, Crit, |
279 &indexNew, &CritNew, &CritNewSh); | 278 &indexNew, &CritNew, &CritNewSh); |
280 | 279 |
281 /* Update the global best index and the corresponding gain */ | 280 /* Update the global best index and the corresponding gain */ |
282 WebRtcIlbcfix_CbUpdateBestIndex( | 281 WebRtcIlbcfix_CbUpdateBestIndex( |
283 CritNew, CritNewSh, (int16_t)(indexNew+indexOffset), cDot[indexNew], | 282 CritNew, CritNewSh, indexNew+indexOffset, cDot[indexNew], |
284 inverseEnergy[indexNew+indexOffset], inverseEnergyShifts[indexNew+indexO
ffset], | 283 inverseEnergy[indexNew+indexOffset], inverseEnergyShifts[indexNew+indexO
ffset], |
285 &CritMax, &shTotMax, &bestIndex, &bestGain); | 284 &CritMax, &shTotMax, &bestIndex, &bestGain); |
286 | 285 |
287 index[stage] = bestIndex; | 286 index[stage] = (int16_t)bestIndex; |
288 | 287 |
289 | 288 |
290 bestGain = WebRtcIlbcfix_GainQuant(bestGain, | 289 bestGain = WebRtcIlbcfix_GainQuant(bestGain, |
291 (int16_t)WEBRTC_SPL_ABS_W16(gains[stage])
, stage, &gain_index[stage]); | 290 (int16_t)WEBRTC_SPL_ABS_W16(gains[stage])
, stage, &gain_index[stage]); |
292 | 291 |
293 /* Extract the best (according to measure) codebook vector | 292 /* Extract the best (according to measure) codebook vector |
294 Also adjust the index, so that the augmented vectors are last. | 293 Also adjust the index, so that the augmented vectors are last. |
295 Above these vectors were first... | 294 Above these vectors were first... |
296 */ | 295 */ |
297 | 296 |
298 if(lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) { | 297 if(lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) { |
299 | 298 |
300 if(index[stage]<base_size) { | 299 if((size_t)index[stage]<base_size) { |
301 pp=buf+lMem-lTarget-index[stage]; | 300 pp=buf+lMem-lTarget-index[stage]; |
302 } else { | 301 } else { |
303 pp=cbvectors+lMem-lTarget- | 302 pp=cbvectors+lMem-lTarget- |
304 index[stage]+base_size; | 303 index[stage]+base_size; |
305 } | 304 } |
306 | 305 |
307 } else { | 306 } else { |
308 | 307 |
309 if (index[stage]<base_size) { | 308 if ((size_t)index[stage]<base_size) { |
310 if (index[stage]>=20) { | 309 if (index[stage]>=20) { |
311 /* Adjust index and extract vector */ | 310 /* Adjust index and extract vector */ |
312 index[stage]-=20; | 311 index[stage]-=20; |
313 pp=buf+lMem-lTarget-index[stage]; | 312 pp=buf+lMem-lTarget-index[stage]; |
314 } else { | 313 } else { |
315 /* Adjust index and extract vector */ | 314 /* Adjust index and extract vector */ |
316 index[stage]+=(base_size-20); | 315 index[stage]+=(int16_t)(base_size-20); |
317 | 316 |
318 WebRtcIlbcfix_CreateAugmentedVec((int16_t)(index[stage]-base_size+40), | 317 WebRtcIlbcfix_CreateAugmentedVec(index[stage]-base_size+40, |
319 buf+lMem, aug_vec); | 318 buf+lMem, aug_vec); |
320 pp = aug_vec; | 319 pp = aug_vec; |
321 | 320 |
322 } | 321 } |
323 } else { | 322 } else { |
324 | 323 |
325 if ((index[stage] - base_size) >= 20) { | 324 if ((index[stage] - base_size) >= 20) { |
326 /* Adjust index and extract vector */ | 325 /* Adjust index and extract vector */ |
327 index[stage]-=20; | 326 index[stage]-=20; |
328 pp=cbvectors+lMem-lTarget- | 327 pp=cbvectors+lMem-lTarget- |
329 index[stage]+base_size; | 328 index[stage]+base_size; |
330 } else { | 329 } else { |
331 /* Adjust index and extract vector */ | 330 /* Adjust index and extract vector */ |
332 index[stage]+=(base_size-20); | 331 index[stage]+=(int16_t)(base_size-20); |
333 WebRtcIlbcfix_CreateAugmentedVec((int16_t)(index[stage]-2*base_size+40
), | 332 WebRtcIlbcfix_CreateAugmentedVec(index[stage]-2*base_size+40, |
334 cbvectors+lMem, aug_vec); | 333 cbvectors+lMem, aug_vec); |
335 pp = aug_vec; | 334 pp = aug_vec; |
336 } | 335 } |
337 } | 336 } |
338 } | 337 } |
339 | 338 |
340 /* Subtract the best codebook vector, according | 339 /* Subtract the best codebook vector, according |
341 to measure, from the target vector */ | 340 to measure, from the target vector */ |
342 | 341 |
343 WebRtcSpl_AddAffineVectorToVector(target, pp, (int16_t)(-bestGain), | 342 WebRtcSpl_AddAffineVectorToVector(target, pp, (int16_t)(-bestGain), |
(...skipping 30 matching lines...) Expand all Loading... |
374 tmpW32 = ((int32_t)(gains[1]-1))<<1; | 373 tmpW32 = ((int32_t)(gains[1]-1))<<1; |
375 | 374 |
376 /* Pointer to the table that contains | 375 /* Pointer to the table that contains |
377 gain_sq5TblFIX * gain_sq5TblFIX in Q14 */ | 376 gain_sq5TblFIX * gain_sq5TblFIX in Q14 */ |
378 gainPtr=(int16_t*)WebRtcIlbcfix_kGainSq5Sq+gain_index[0]; | 377 gainPtr=(int16_t*)WebRtcIlbcfix_kGainSq5Sq+gain_index[0]; |
379 temp1 = (int16_t)WEBRTC_SPL_SHIFT_W32(codedEner, -bits); | 378 temp1 = (int16_t)WEBRTC_SPL_SHIFT_W32(codedEner, -bits); |
380 | 379 |
381 WebRtcIlbcfix_kGainSq5_ptr = (int16_t*)&WebRtcIlbcfix_kGainSq5[j]; | 380 WebRtcIlbcfix_kGainSq5_ptr = (int16_t*)&WebRtcIlbcfix_kGainSq5[j]; |
382 | 381 |
383 /* targetEner and codedEner are in Q(-2*scale) */ | 382 /* targetEner and codedEner are in Q(-2*scale) */ |
384 for (i=gain_index[0];i<32;i++) { | 383 for (ii=gain_index[0];ii<32;ii++) { |
385 | 384 |
386 /* Change the index if | 385 /* Change the index if |
387 (codedEnergy*gainTbl[i]*gainTbl[i])<(targetEn*gain[0]*gain[0]) AND | 386 (codedEnergy*gainTbl[i]*gainTbl[i])<(targetEn*gain[0]*gain[0]) AND |
388 gainTbl[i] < 2*gain[0] | 387 gainTbl[i] < 2*gain[0] |
389 */ | 388 */ |
390 | 389 |
391 t32 = temp1 * *gainPtr; | 390 t32 = temp1 * *gainPtr; |
392 t32 = t32 - targetEner; | 391 t32 = t32 - targetEner; |
393 if (t32 < 0) { | 392 if (t32 < 0) { |
394 if ((*WebRtcIlbcfix_kGainSq5_ptr) < tmpW32) { | 393 if ((*WebRtcIlbcfix_kGainSq5_ptr) < tmpW32) { |
395 j=i; | 394 j=ii; |
396 WebRtcIlbcfix_kGainSq5_ptr = (int16_t*)&WebRtcIlbcfix_kGainSq5[i]; | 395 WebRtcIlbcfix_kGainSq5_ptr = (int16_t*)&WebRtcIlbcfix_kGainSq5[ii]; |
397 } | 396 } |
398 } | 397 } |
399 gainPtr++; | 398 gainPtr++; |
400 } | 399 } |
401 gain_index[0]=j; | 400 gain_index[0]=j; |
402 | 401 |
403 return; | 402 return; |
404 } | 403 } |
OLD | NEW |