Index: celt/mips/celt_mipsr1.h |
diff --git a/celt/celt.c b/celt/mips/celt_mipsr1.h |
similarity index 53% |
copy from celt/celt.c |
copy to celt/mips/celt_mipsr1.h |
index 3e0ce6e6a550768ea603e05b6ac740b029fd55c6..03915d8817c6f0bab1ccb31a563d02658d795ebe 100644 |
--- a/celt/celt.c |
+++ b/celt/mips/celt_mipsr1.h |
@@ -27,6 +27,9 @@ |
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
+#ifndef __CELT_MIPSR1_H__ |
+#define __CELT_MIPSR1_H__ |
+ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
@@ -50,75 +53,16 @@ |
#include "celt_lpc.h" |
#include "vq.h" |
-#ifndef PACKAGE_VERSION |
-#define PACKAGE_VERSION "unknown" |
-#endif |
- |
- |
-int resampling_factor(opus_int32 rate) |
-{ |
- int ret; |
- switch (rate) |
- { |
- case 48000: |
- ret = 1; |
- break; |
- case 24000: |
- ret = 2; |
- break; |
- case 16000: |
- ret = 3; |
- break; |
- case 12000: |
- ret = 4; |
- break; |
- case 8000: |
- ret = 6; |
- break; |
- default: |
-#ifndef CUSTOM_MODES |
- celt_assert(0); |
-#endif |
- ret = 0; |
- break; |
- } |
- return ret; |
-} |
- |
-#ifndef OVERRIDE_COMB_FILTER_CONST |
-static void comb_filter_const(opus_val32 *y, opus_val32 *x, int T, int N, |
- opus_val16 g10, opus_val16 g11, opus_val16 g12) |
-{ |
- opus_val32 x0, x1, x2, x3, x4; |
- int i; |
- x4 = x[-T-2]; |
- x3 = x[-T-1]; |
- x2 = x[-T]; |
- x1 = x[-T+1]; |
- for (i=0;i<N;i++) |
- { |
- x0=x[i-T+2]; |
- y[i] = x[i] |
- + MULT16_32_Q15(g10,x2) |
- + MULT16_32_Q15(g11,ADD32(x1,x3)) |
- + MULT16_32_Q15(g12,ADD32(x0,x4)); |
- x4=x3; |
- x3=x2; |
- x2=x1; |
- x1=x0; |
- } |
- |
-} |
-#endif |
- |
+#define OVERRIDE_comb_filter |
void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, |
opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, |
const opus_val16 *window, int overlap) |
{ |
int i; |
+ opus_val32 x0, x1, x2, x3, x4; |
+ |
/* printf ("%d %d %f %f\n", T0, T1, g0, g1); */ |
opus_val16 g00, g01, g02, g10, g11, g12; |
- opus_val32 x0, x1, x2, x3, x4; |
static const opus_val16 gains[3][3] = { |
{QCONST16(0.3066406250f, 15), QCONST16(0.2170410156f, 15), QCONST16(0.1296386719f, 15)}, |
{QCONST16(0.4638671875f, 15), QCONST16(0.2680664062f, 15), QCONST16(0.f, 15)}, |
@@ -131,34 +75,51 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, |
OPUS_MOVE(y, x, N); |
return; |
} |
- g00 = MULT16_16_Q15(g0, gains[tapset0][0]); |
- g01 = MULT16_16_Q15(g0, gains[tapset0][1]); |
- g02 = MULT16_16_Q15(g0, gains[tapset0][2]); |
- g10 = MULT16_16_Q15(g1, gains[tapset1][0]); |
- g11 = MULT16_16_Q15(g1, gains[tapset1][1]); |
- g12 = MULT16_16_Q15(g1, gains[tapset1][2]); |
+ |
+ g00 = MULT16_16_P15(g0, gains[tapset0][0]); |
+ g01 = MULT16_16_P15(g0, gains[tapset0][1]); |
+ g02 = MULT16_16_P15(g0, gains[tapset0][2]); |
+ g10 = MULT16_16_P15(g1, gains[tapset1][0]); |
+ g11 = MULT16_16_P15(g1, gains[tapset1][1]); |
+ g12 = MULT16_16_P15(g1, gains[tapset1][2]); |
x1 = x[-T1+1]; |
x2 = x[-T1 ]; |
x3 = x[-T1-1]; |
x4 = x[-T1-2]; |
+ /* If the filter didn't change, we don't need the overlap */ |
+ if (g0==g1 && T0==T1 && tapset0==tapset1) |
+ overlap=0; |
+ |
for (i=0;i<overlap;i++) |
{ |
opus_val16 f; |
- x0=x[i-T1+2]; |
+ opus_val32 res; |
f = MULT16_16_Q15(window[i],window[i]); |
- y[i] = x[i] |
- + MULT16_32_Q15(MULT16_16_Q15((Q15ONE-f),g00),x[i-T0]) |
- + MULT16_32_Q15(MULT16_16_Q15((Q15ONE-f),g01),ADD32(x[i-T0+1],x[i-T0-1])) |
- + MULT16_32_Q15(MULT16_16_Q15((Q15ONE-f),g02),ADD32(x[i-T0+2],x[i-T0-2])) |
- + MULT16_32_Q15(MULT16_16_Q15(f,g10),x2) |
- + MULT16_32_Q15(MULT16_16_Q15(f,g11),ADD32(x1,x3)) |
- + MULT16_32_Q15(MULT16_16_Q15(f,g12),ADD32(x0,x4)); |
+ x0= x[i-T1+2]; |
+ |
+ asm volatile("MULT $ac1, %0, %1" : : "r" ((int)MULT16_16_Q15((Q15ONE-f),g00)), "r" ((int)x[i-T0])); |
+ |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)MULT16_16_Q15((Q15ONE-f),g01)), "r" ((int)ADD32(x[i-T0-1],x[i-T0+1]))); |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)MULT16_16_Q15((Q15ONE-f),g02)), "r" ((int)ADD32(x[i-T0-2],x[i-T0+2]))); |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)MULT16_16_Q15(f,g10)), "r" ((int)x2)); |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)MULT16_16_Q15(f,g11)), "r" ((int)ADD32(x3,x1))); |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)MULT16_16_Q15(f,g12)), "r" ((int)ADD32(x4,x0))); |
+ |
+ asm volatile("EXTR.W %0,$ac1, %1" : "=r" (res): "i" (15)); |
+ |
+ y[i] = x[i] + res; |
+ |
x4=x3; |
x3=x2; |
x2=x1; |
x1=x0; |
- |
} |
+ |
+ x4 = x[i-T1-2]; |
+ x3 = x[i-T1-1]; |
+ x2 = x[i-T1]; |
+ x1 = x[i-T1+1]; |
+ |
if (g1==0) |
{ |
/* OPT: Happens to work without the OPUS_MOVE(), but only because the current encoder already copies x to y */ |
@@ -167,57 +128,22 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, |
return; |
} |
- /* Compute the part with the constant filter. */ |
- comb_filter_const(y+i, x+i, T1, N-i, g10, g11, g12); |
-} |
- |
-const signed char tf_select_table[4][8] = { |
- {0, -1, 0, -1, 0,-1, 0,-1}, |
- {0, -1, 0, -2, 1, 0, 1,-1}, |
- {0, -2, 0, -3, 2, 0, 1,-1}, |
- {0, -2, 0, -3, 3, 0, 1,-1}, |
-}; |
- |
- |
-void init_caps(const CELTMode *m,int *cap,int LM,int C) |
-{ |
- int i; |
- for (i=0;i<m->nbEBands;i++) |
+ for (i=overlap;i<N;i++) |
{ |
- int N; |
- N=(m->eBands[i+1]-m->eBands[i])<<LM; |
- cap[i] = (m->cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; |
- } |
-} |
- |
+ opus_val32 res; |
+ x0=x[i-T1+2]; |
+ asm volatile("MULT $ac1, %0, %1" : : "r" ((int)g10), "r" ((int)x2)); |
-const char *opus_strerror(int error) |
-{ |
- static const char * const error_strings[8] = { |
- "success", |
- "invalid argument", |
- "buffer too small", |
- "internal error", |
- "corrupted stream", |
- "request not implemented", |
- "invalid state", |
- "memory allocation failed" |
- }; |
- if (error > 0 || error < -7) |
- return "unknown error"; |
- else |
- return error_strings[-error]; |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)g11), "r" ((int)ADD32(x3,x1))); |
+ asm volatile("MADD $ac1, %0, %1" : : "r" ((int)g12), "r" ((int)ADD32(x4,x0))); |
+ asm volatile("EXTR.W %0,$ac1, %1" : "=r" (res): "i" (15)); |
+ y[i] = x[i] + res; |
+ x4=x3; |
+ x3=x2; |
+ x2=x1; |
+ x1=x0; |
+ } |
} |
-const char *opus_get_version_string(void) |
-{ |
- return "libopus " PACKAGE_VERSION |
-#ifdef FIXED_POINT |
- "-fixed" |
-#endif |
-#ifdef FUZZING |
- "-fuzzing" |
-#endif |
- ; |
-} |
+#endif /* __CELT_MIPSR1_H__ */ |