| Index: celt/pitch.h
|
| diff --git a/celt/pitch.h b/celt/pitch.h
|
| index 2757071a6fbfaace2ec77bcdc2de5128b0d2feb7..caffd24bc45e8f80c5b94a31789d1d14dd611a96 100644
|
| --- a/celt/pitch.h
|
| +++ b/celt/pitch.h
|
| @@ -36,6 +36,10 @@
|
|
|
| #include "modes.h"
|
|
|
| +#if defined(__SSE__) && !defined(FIXED_POINT)
|
| +#include "x86/pitch_sse.h"
|
| +#endif
|
| +
|
| void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
|
| int len, int C);
|
|
|
| @@ -45,4 +49,97 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR
|
| opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
|
| int N, int *T0, int prev_period, opus_val16 prev_gain);
|
|
|
| +/* OPT: This is the kernel you really want to optimize. It gets used a lot
|
| + by the prefilter and by the PLC. */
|
| +#ifndef OVERRIDE_XCORR_KERNEL
|
| +static inline void xcorr_kernel(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len)
|
| +{
|
| + int j;
|
| + opus_val16 y_0, y_1, y_2, y_3;
|
| + y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */
|
| + y_0=*y++;
|
| + y_1=*y++;
|
| + y_2=*y++;
|
| + for (j=0;j<len-3;j+=4)
|
| + {
|
| + opus_val16 tmp;
|
| + tmp = *x++;
|
| + y_3=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_0);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_1);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_2);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_3);
|
| + tmp=*x++;
|
| + y_0=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_1);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_2);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_3);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_0);
|
| + tmp=*x++;
|
| + y_1=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_2);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_3);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_0);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_1);
|
| + tmp=*x++;
|
| + y_2=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_3);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_0);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_1);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_2);
|
| + }
|
| + if (j++<len)
|
| + {
|
| + opus_val16 tmp = *x++;
|
| + y_3=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_0);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_1);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_2);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_3);
|
| + }
|
| + if (j++<len)
|
| + {
|
| + opus_val16 tmp=*x++;
|
| + y_0=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_1);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_2);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_3);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_0);
|
| + }
|
| + if (j<len)
|
| + {
|
| + opus_val16 tmp=*x++;
|
| + y_1=*y++;
|
| + sum[0] = MAC16_16(sum[0],tmp,y_2);
|
| + sum[1] = MAC16_16(sum[1],tmp,y_3);
|
| + sum[2] = MAC16_16(sum[2],tmp,y_0);
|
| + sum[3] = MAC16_16(sum[3],tmp,y_1);
|
| + }
|
| +}
|
| +#endif /* OVERRIDE_XCORR_KERNEL */
|
| +
|
| +#ifndef OVERRIDE_DUAL_INNER_PROD
|
| +static inline void dual_inner_prod(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
|
| + int N, opus_val32 *xy1, opus_val32 *xy2)
|
| +{
|
| + int i;
|
| + opus_val32 xy01=0;
|
| + opus_val32 xy02=0;
|
| + for (i=0;i<N;i++)
|
| + {
|
| + xy01 = MAC16_16(xy01, x[i], y01[i]);
|
| + xy02 = MAC16_16(xy02, x[i], y02[i]);
|
| + }
|
| + *xy1 = xy01;
|
| + *xy2 = xy02;
|
| +}
|
| +#endif
|
| +
|
| +#ifdef FIXED_POINT
|
| +opus_val32
|
| +#else
|
| +void
|
| +#endif
|
| +celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch);
|
| +
|
| #endif
|
|
|