summaryrefslogtreecommitdiffstats
path: root/media/libspeex_resampler/integer-halving.patch
diff options
context:
space:
mode:
Diffstat (limited to 'media/libspeex_resampler/integer-halving.patch')
-rw-r--r--media/libspeex_resampler/integer-halving.patch95
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
+