diff options
Diffstat (limited to 'media/libspeex_resampler/integer-halving.patch')
-rw-r--r-- | media/libspeex_resampler/integer-halving.patch | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/media/libspeex_resampler/integer-halving.patch b/media/libspeex_resampler/integer-halving.patch new file mode 100644 index 0000000000..ea40cc0d66 --- /dev/null +++ b/media/libspeex_resampler/integer-halving.patch @@ -0,0 +1,95 @@ +diff --git a/media/libspeex_resampler/src/arch.h b/media/libspeex_resampler/src/arch.h +--- a/media/libspeex_resampler/src/arch.h ++++ b/media/libspeex_resampler/src/arch.h +@@ -172,26 +172,23 @@ typedef float spx_word32_t; + #define SHL(a,shift) (a) + #define SATURATE(x,a) (x) + + #define ADD16(a,b) ((a)+(b)) + #define SUB16(a,b) ((a)-(b)) + #define ADD32(a,b) ((a)+(b)) + #define SUB32(a,b) ((a)-(b)) + #define MULT16_16_16(a,b) ((a)*(b)) ++#define MULT16_32_32(a,b) ((a)*(b)) + #define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) + #define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) + +-#define MULT16_32_Q11(a,b) ((a)*(b)) +-#define MULT16_32_Q13(a,b) ((a)*(b)) +-#define MULT16_32_Q14(a,b) ((a)*(b)) + #define MULT16_32_Q15(a,b) ((a)*(b)) + #define MULT16_32_P15(a,b) ((a)*(b)) + +-#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) + #define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) + + #define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) + #define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) + #define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) + #define MULT16_16_Q11_32(a,b) ((a)*(b)) + #define MULT16_16_Q13(a,b) ((a)*(b)) + #define MULT16_16_Q14(a,b) ((a)*(b)) +diff --git a/media/libspeex_resampler/src/fixed_generic.h b/media/libspeex_resampler/src/fixed_generic.h +--- a/media/libspeex_resampler/src/fixed_generic.h ++++ b/media/libspeex_resampler/src/fixed_generic.h +@@ -64,32 +64,27 @@ + + #define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) + #define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) + #define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) + #define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) + + + /* result fits in 16 bits */ +-#define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) ++#define MULT16_16_16(a,b) (((spx_word16_t)(a))*((spx_word16_t)(b))) ++/* result fits in 32 bits */ ++#define MULT16_32_32(a,b) (((spx_word16_t)(a))*((spx_word32_t)(b))) + + /* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ + #define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) + + #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) +-#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) +-#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) +-#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) +- +-#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) +-#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) +- +-#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) +-#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) +-#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) ++#define MULT16_32_P15(a,b) ADD32(MULT16_32_32(a,SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) ++#define MULT16_32_Q15(a,b) ADD32(MULT16_32_32(a,SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) ++#define MAC16_32_Q15(c,a,b) ADD32(c,MULT16_32_Q15(a,b)) + + + #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) + #define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) + #define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) + + #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) + #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) +diff --git a/media/libspeex_resampler/src/resample.c b/media/libspeex_resampler/src/resample.c +--- a/media/libspeex_resampler/src/resample.c ++++ b/media/libspeex_resampler/src/resample.c +@@ -474,17 +474,17 @@ static int resampler_basic_interpolate_s + const spx_word16_t curr_in=iptr[j]; + accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]); + accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); + accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); + accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); + } + + cubic_coef(frac, interp); +- sum = MULT16_32_Q15(interp[0],SHR32(accum[0], 1)) + MULT16_32_Q15(interp[1],SHR32(accum[1], 1)) + MULT16_32_Q15(interp[2],SHR32(accum[2], 1)) + MULT16_32_Q15(interp[3],SHR32(accum[3], 1)); ++ sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); + sum = SATURATE32PSHR(sum, 15, 32767); + #ifdef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE + } else { + cubic_coef(frac, interp); + sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); + } + #endif + |