summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-codec/speex/pseudofloat.h
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia-codec/speex/pseudofloat.h')
-rw-r--r--pjmedia/src/pjmedia-codec/speex/pseudofloat.h94
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