diff options
Diffstat (limited to 'media/libstagefright/codecs/amrwbenc/src/math_op.c')
-rw-r--r-- | media/libstagefright/codecs/amrwbenc/src/math_op.c | 167 |
1 files changed, 86 insertions, 81 deletions
diff --git a/media/libstagefright/codecs/amrwbenc/src/math_op.c b/media/libstagefright/codecs/amrwbenc/src/math_op.c index 7affbb2..9d7c74e 100644 --- a/media/libstagefright/codecs/amrwbenc/src/math_op.c +++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c @@ -55,17 +55,17 @@ |___________________________________________________________________________| */ Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */ - Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ - ) + Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ + ) { - Word16 exp; - Word32 L_y; - exp = norm_l(L_x); - L_x = (L_x << exp); /* L_x is normalized */ - exp = (31 - exp); - Isqrt_n(&L_x, &exp); - L_y = (L_x << exp); /* denormalization */ - return (L_y); + Word16 exp; + Word32 L_y; + exp = norm_l(L_x); + L_x = (L_x << exp); /* L_x is normalized */ + exp = (31 - exp); + Isqrt_n(&L_x, &exp); + L_y = (L_x << exp); /* denormalization */ + return (L_y); } /*___________________________________________________________________________ @@ -90,43 +90,43 @@ Word32 Isqrt( /* (o) Q31 : output value (range: 0<= */ static Word16 table_isqrt[49] = { - 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214, - 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155, - 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539, - 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674, - 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384 + 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214, + 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155, + 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539, + 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674, + 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384 }; void Isqrt_n( - Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ - Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ - ) + Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ + Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ + ) { - Word16 i, a, tmp; - - if (*frac <= (Word32) 0) - { - *exp = 0; - *frac = 0x7fffffffL; - return; - } - - if((*exp & 1) == 1) /*If exponant odd -> shift right */ - *frac = (*frac) >> 1; - - *exp = negate((*exp - 1) >> 1); - - *frac = (*frac >> 9); - i = extract_h(*frac); /* Extract b25-b31 */ - *frac = (*frac >> 1); - a = (Word16)(*frac); /* Extract b10-b24 */ - a = (Word16) (a & (Word16) 0x7fff); - i -= 16; - *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */ - tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */ - *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */ - - return; + Word16 i, a, tmp; + + if (*frac <= (Word32) 0) + { + *exp = 0; + *frac = 0x7fffffffL; + return; + } + + if((*exp & 1) == 1) /*If exponant odd -> shift right */ + *frac = (*frac) >> 1; + + *exp = negate((*exp - 1) >> 1); + + *frac = (*frac >> 9); + i = extract_h(*frac); /* Extract b25-b31 */ + *frac = (*frac >> 1); + a = (Word16)(*frac); /* Extract b10-b24 */ + a = (Word16) (a & (Word16) 0x7fff); + i -= 16; + *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */ + tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */ + *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */ + + return; } /*___________________________________________________________________________ @@ -149,34 +149,34 @@ void Isqrt_n( */ static Word16 table_pow2[33] = { - 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, - 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, - 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, - 31379, 32066, 32767 + 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, + 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, + 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, + 31379, 32066, 32767 }; Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */ - Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ - Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ - ) + Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ + Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ + ) { - Word16 exp, i, a, tmp; - Word32 L_x; + Word16 exp, i, a, tmp; + Word32 L_x; - L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */ - i = extract_h(L_x); /* Extract b10-b16 of fraction */ - L_x =L_x >> 1; - a = (Word16)(L_x); /* Extract b0-b9 of fraction */ - a = (Word16) (a & (Word16) 0x7fff); + L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */ + i = extract_h(L_x); /* Extract b10-b16 of fraction */ + L_x =L_x >> 1; + a = (Word16)(L_x); /* Extract b0-b9 of fraction */ + a = (Word16) (a & (Word16) 0x7fff); - L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */ - tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */ - L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */ + L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */ + tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */ + L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */ - exp = vo_sub(30, exponant); - L_x = vo_L_shr_r(L_x, exp); + exp = vo_sub(30, exponant); + L_x = vo_L_shr_r(L_x, exp); - return (L_x); + return (L_x); } /*___________________________________________________________________________ @@ -194,25 +194,30 @@ Word32 Pow2( /* (o) Q0 : result (range: 0<= */ Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ - Word16 x[], /* (i) 12bits: x vector */ - Word16 y[], /* (i) 12bits: y vector */ - Word16 lg, /* (i) : vector length */ - Word16 * exp /* (o) : exponent of result (0..+30) */ - ) + Word16 x[], /* (i) 12bits: x vector */ + Word16 y[], /* (i) 12bits: y vector */ + Word16 lg, /* (i) : vector length */ + Word16 * exp /* (o) : exponent of result (0..+30) */ + ) { - Word16 sft; - Word32 i, L_sum; - L_sum = 0; - for (i = 0; i < lg; i++) - { - L_sum += x[i] * y[i]; - } - L_sum = (L_sum << 1) + 1; - /* Normalize acc in Q31 */ - sft = norm_l(L_sum); - L_sum = L_sum << sft; - *exp = 30 - sft; /* exponent = 0..30 */ - return (L_sum); + Word16 sft; + Word32 i, L_sum; + L_sum = 0; + for (i = 0; i < lg; i++) + { + Word32 tmp = (Word32) x[i] * (Word32) y[i]; + if (tmp == (Word32) 0x40000000L) { + tmp = MAX_32; + } + L_sum = L_add(L_sum, tmp); + } + L_sum = L_shl2(L_sum, 1); + L_sum = L_add(L_sum, 1); + /* Normalize acc in Q31 */ + sft = norm_l(L_sum); + L_sum = L_sum << sft; + *exp = 30 - sft; /* exponent = 0..30 */ + return (L_sum); } |