diff options
Diffstat (limited to 'pjmedia/src/pjmedia-codec/speex/pseudofloat.h')
-rw-r--r-- | pjmedia/src/pjmedia-codec/speex/pseudofloat.h | 94 |
1 files changed, 74 insertions, 20 deletions
diff --git a/pjmedia/src/pjmedia-codec/speex/pseudofloat.h b/pjmedia/src/pjmedia-codec/speex/pseudofloat.h index 8642bf0c..e85f60e4 100644 --- a/pjmedia/src/pjmedia-codec/speex/pseudofloat.h +++ b/pjmedia/src/pjmedia-codec/speex/pseudofloat.h @@ -45,9 +45,9 @@ typedef struct { spx_int16_t e; } spx_float_t; -#define FLOAT_ZERO ((spx_float_t){0,0}) -#define FLOAT_ONE ((spx_float_t){16384,-14}) -#define FLOAT_HALF ((spx_float_t){16384,-15}) +static const spx_float_t FLOAT_ZERO = {0,0}; +static const spx_float_t FLOAT_ONE = {16384,-14}; +static const spx_float_t FLOAT_HALF = {16384,-15}; #define MIN(a,b) ((a)<(b)?(a):(b)) static inline spx_float_t PSEUDOFLOAT(spx_int32_t x) @@ -60,7 +60,10 @@ static inline spx_float_t PSEUDOFLOAT(spx_int32_t x) x = -x; } if (x==0) - return (spx_float_t) {0,0}; + { + spx_float_t r = {0,0}; + return r; + } while (x>32767) { x >>= 1; @@ -74,9 +77,19 @@ static inline spx_float_t PSEUDOFLOAT(spx_int32_t x) e--; } if (sign) - return (spx_float_t) {-x,e}; + { + spx_float_t r; + r.m = -x; + r.e = e; + return r; + } else - return (spx_float_t) {x,e}; + { + spx_float_t r; + r.m = x; + r.e = e; + return r; + } } @@ -87,7 +100,16 @@ static inline spx_float_t FLOAT_ADD(spx_float_t a, spx_float_t b) return b; else if (b.m==0) return a; - r = (a).e > (b).e ? (spx_float_t) {((a).m>>1) + ((b).m>>MIN(15,(a).e-(b).e+1)),(a).e+1} : (spx_float_t) {((b).m>>1) + ((a).m>>MIN(15,(b).e-(a).e+1)),(b).e+1}; + if ((a).e > (b).e) + { + r.m = ((a).m>>1) + ((b).m>>MIN(15,(a).e-(b).e+1)); + r.e = (a).e+1; + } + else + { + r.m = ((b).m>>1) + ((a).m>>MIN(15,(b).e-(a).e+1)); + r.e = (b).e+1; + } if (r.m>0) { if (r.m<16384) @@ -113,7 +135,16 @@ static inline spx_float_t FLOAT_SUB(spx_float_t a, spx_float_t b) return b; else if (b.m==0) return a; - r = (a).e > (b).e ? (spx_float_t) {((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)),(a).e+1} : (spx_float_t) {((a).m>>MIN(15,(b).e-(a).e+1)) - ((b).m>>1) ,(b).e+1}; + if ((a).e > (b).e) + { + r.m = ((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)); + r.e = (a).e+1; + } + else + { + r.m = ((a).m>>MIN(15,(b).e-(a).e+1)) - ((b).m>>1); + r.e = (b).e+1; + } if (r.m>0) { if (r.m<16384) @@ -152,7 +183,9 @@ static inline int FLOAT_GT(spx_float_t a, spx_float_t b) static inline spx_float_t FLOAT_MULT(spx_float_t a, spx_float_t b) { - spx_float_t r = (spx_float_t) {(spx_int16_t)((spx_int32_t)(a).m*(b).m>>15), (a).e+(b).e+15}; + spx_float_t r; + r.m = (spx_int16_t)((spx_int32_t)(a).m*(b).m>>15); + r.e = (a).e+(b).e+15; if (r.m>0) { if (r.m<16384) @@ -174,13 +207,16 @@ static inline spx_float_t FLOAT_MULT(spx_float_t a, spx_float_t b) static inline spx_float_t FLOAT_SHL(spx_float_t a, int b) { - return (spx_float_t) {a.m,a.e+b}; + spx_float_t r; + r.m = a.m; + r.e = a.e+b; + return r; } static inline spx_int16_t FLOAT_EXTRACT16(spx_float_t a) { if (a.e<0) - return (a.m+(1<<(-a.e-1)))>>-a.e; + return EXTRACT16((EXTEND32(a.m)+(1<<(-a.e-1)))>>-a.e); else return a.m<<a.e; } @@ -196,9 +232,12 @@ static inline spx_int32_t FLOAT_MUL32(spx_float_t a, spx_word32_t b) static inline spx_float_t FLOAT_MUL32U(spx_word32_t a, spx_word32_t b) { int e=0; + spx_float_t r; /* FIXME: Handle the sign */ if (a==0) - return (spx_float_t) {0,0}; + { + return FLOAT_ZERO; + } while (a>32767) { a >>= 1; @@ -219,35 +258,45 @@ static inline spx_float_t FLOAT_MUL32U(spx_word32_t a, spx_word32_t b) b <<= 1; e--; } - return (spx_float_t) {MULT16_16_Q15(a,b),e+15}; + r.m = MULT16_16_Q15(a,b); + r.e = e+15; + return r; } static inline spx_float_t FLOAT_DIV32_FLOAT(spx_word32_t a, spx_float_t b) { int e=0; + spx_float_t r; /* FIXME: Handle the sign */ if (a==0) - return (spx_float_t) {0,0}; - while (a<SHL32(b.m,14)) + { + return FLOAT_ZERO; + } + while (a<SHL32(EXTEND32(b.m),14)) { a <<= 1; e--; } - while (a>=SHL32(b.m-1,15)) + while (a>=SHL32(EXTEND32(b.m-1),15)) { a >>= 1; e++; } - return (spx_float_t) {DIV32_16(a,b.m),e-b.e}; + r.m = DIV32_16(a,b.m); + r.e = e-b.e; + return r; } static inline spx_float_t FLOAT_DIV32(spx_word32_t a, spx_word32_t b) { int e=0; + spx_float_t r; /* FIXME: Handle the sign */ if (a==0) - return (spx_float_t) {0,0}; + { + return FLOAT_ZERO; + } while (b>32767) { b >>= 1; @@ -263,13 +312,16 @@ static inline spx_float_t FLOAT_DIV32(spx_word32_t a, spx_word32_t b) a >>= 1; e++; } - return (spx_float_t) {DIV32_16(a,b),e}; + r.m = DIV32_16(a,b); + r.e = e; + return r; } static inline spx_float_t FLOAT_DIVU(spx_float_t a, spx_float_t b) { int e=0; spx_int32_t num; + spx_float_t r; num = a.m; while (a.m >= b.m) { @@ -277,7 +329,9 @@ static inline spx_float_t FLOAT_DIVU(spx_float_t a, spx_float_t b) a.m >>= 1; } num = num << (15-e); - return (spx_float_t) {DIV32_16(num,b.m),a.e-b.e-15+e}; + r.m = DIV32_16(num,b.m); + r.e = a.e-b.e-15+e; + return r; } #else |