summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libopus/celt/pitch.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/pitch.c')
-rw-r--r--lib/rbcodec/codecs/libopus/celt/pitch.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/pitch.c b/lib/rbcodec/codecs/libopus/celt/pitch.c
index c28857297a..ee56a434f0 100644
--- a/lib/rbcodec/codecs/libopus/celt/pitch.c
+++ b/lib/rbcodec/codecs/libopus/celt/pitch.c
@@ -252,15 +252,15 @@ void
252#endif 252#endif
253celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch) 253celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch)
254{ 254{
255 int i,j; 255 int i;
256 /*The EDSP version requires that max_pitch is at least 1, and that _x is 256 /*The EDSP version requires that max_pitch is at least 1, and that _x is
257 32-bit aligned. 257 32-bit aligned.
258 Since it's hard to put asserts in assembly, put them here.*/ 258 Since it's hard to put asserts in assembly, put them here.*/
259 celt_assert(max_pitch>0);
260 celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
261#ifdef FIXED_POINT 259#ifdef FIXED_POINT
262 opus_val32 maxcorr=1; 260 opus_val32 maxcorr=1;
263#endif 261#endif
262 celt_assert(max_pitch>0);
263 celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
264 for (i=0;i<max_pitch-3;i+=4) 264 for (i=0;i<max_pitch-3;i+=4)
265 { 265 {
266 opus_val32 sum[4]={0,0,0,0}; 266 opus_val32 sum[4]={0,0,0,0};
@@ -279,9 +279,8 @@ celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr
279 /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */ 279 /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
280 for (;i<max_pitch;i++) 280 for (;i<max_pitch;i++)
281 { 281 {
282 opus_val32 sum = 0; 282 opus_val32 sum;
283 for (j=0;j<len;j++) 283 sum = celt_inner_prod(_x, _y+i, len);
284 sum = MAC16_16(sum, _x[j],_y[i+j]);
285 xcorr[i] = sum; 284 xcorr[i] = sum;
286#ifdef FIXED_POINT 285#ifdef FIXED_POINT
287 maxcorr = MAX32(maxcorr, sum); 286 maxcorr = MAX32(maxcorr, sum);
@@ -361,12 +360,17 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR
361#endif 360#endif
362 for (i=0;i<max_pitch>>1;i++) 361 for (i=0;i<max_pitch>>1;i++)
363 { 362 {
364 opus_val32 sum=0; 363 opus_val32 sum;
365 xcorr[i] = 0; 364 xcorr[i] = 0;
366 if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) 365 if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
367 continue; 366 continue;
367#ifdef FIXED_POINT
368 sum = 0;
368 for (j=0;j<len>>1;j++) 369 for (j=0;j<len>>1;j++)
369 sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); 370 sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
371#else
372 sum = celt_inner_prod(x_lp, y+i, len>>1);
373#endif
370 xcorr[i] = MAX32(-1, sum); 374 xcorr[i] = MAX32(-1, sum);
371#ifdef FIXED_POINT 375#ifdef FIXED_POINT
372 maxcorr = MAX32(maxcorr, sum); 376 maxcorr = MAX32(maxcorr, sum);
@@ -457,7 +461,7 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
457 opus_val16 g1; 461 opus_val16 g1;
458 opus_val16 cont=0; 462 opus_val16 cont=0;
459 opus_val16 thresh; 463 opus_val16 thresh;
460 T1 = (2*T0+k)/(2*k); 464 T1 = celt_udiv(2*T0+k, 2*k);
461 if (T1 < minperiod) 465 if (T1 < minperiod)
462 break; 466 break;
463 /* Look for another strong correlation at T1b */ 467 /* Look for another strong correlation at T1b */
@@ -469,7 +473,7 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
469 T1b = T0+T1; 473 T1b = T0+T1;
470 } else 474 } else
471 { 475 {
472 T1b = (2*second_check[k]*T0+k)/(2*k); 476 T1b = celt_udiv(2*second_check[k]*T0+k, 2*k);
473 } 477 }
474 dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2); 478 dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2);
475 xy += xy2; 479 xy += xy2;
@@ -514,13 +518,7 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
514 pg = SHR32(frac_div32(best_xy,best_yy+1),16); 518 pg = SHR32(frac_div32(best_xy,best_yy+1),16);
515 519
516 for (k=0;k<3;k++) 520 for (k=0;k<3;k++)
517 { 521 xcorr[k] = celt_inner_prod(x, x-(T+k-1), N);
518 int T1 = T+k-1;
519 xy = 0;
520 for (i=0;i<N;i++)
521 xy = MAC16_16(xy, x[i], x[i-T1]);
522 xcorr[k] = xy;
523 }
524 if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0])) 522 if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
525 offset = 1; 523 offset = 1;
526 else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2])) 524 else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))