diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2002-12-16 18:59:50 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2002-12-16 18:59:50 +0000 |
commit | 94ef6649dd5f4e95337af00dcede2337ea7cfb49 (patch) | |
tree | 07d679ce92b4e4517815abc42394480eebf44904 /src/libfaad/is.c | |
parent | 48f4c5809db11a6df4a5e7285d5e60a2ed924e2a (diff) | |
download | xine-lib-94ef6649dd5f4e95337af00dcede2337ea7cfb49.tar.gz xine-lib-94ef6649dd5f4e95337af00dcede2337ea7cfb49.tar.bz2 |
updated libfaad
CVS patchset: 3560
CVS date: 2002/12/16 18:59:50
Diffstat (limited to 'src/libfaad/is.c')
-rw-r--r-- | src/libfaad/is.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/libfaad/is.c b/src/libfaad/is.c index f64c41859..8a4d50b5c 100644 --- a/src/libfaad/is.c +++ b/src/libfaad/is.c @@ -16,20 +16,37 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** -** $Id: is.c,v 1.1 2002/07/14 23:43:01 miguelfreitas Exp $ +** $Id: is.c,v 1.2 2002/12/16 19:00:26 miguelfreitas Exp $ **/ #include "common.h" +#include "structs.h" #include "syntax.h" #include "is.h" +#ifdef FIXED_POINT +static real_t pow05_table[] = { + COEF_CONST(1.68179283050743), /* 0.5^(-3/4) */ + COEF_CONST(1.41421356237310), /* 0.5^(-2/4) */ + COEF_CONST(1.18920711500272), /* 0.5^(-1/4) */ + COEF_CONST(1.0), /* 0.5^( 0/4) */ + COEF_CONST(0.84089641525371), /* 0.5^(+1/4) */ + COEF_CONST(0.70710678118655), /* 0.5^(+2/4) */ + COEF_CONST(0.59460355750136) /* 0.5^(+3/4) */ +}; +#endif + void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len) { uint8_t g, sfb, b; uint16_t i, k; +#ifndef FIXED_POINT real_t scale; +#else + int32_t exp, frac; +#endif uint16_t nshort = frame_len/8; uint8_t group = 0; @@ -50,16 +67,29 @@ void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, ics->pred.prediction_used[sfb] = 0; icsr->pred.prediction_used[sfb] = 0; - scale = MUL(is_intensity(icsr, g, sfb), - MUL(invert_intensity(ics, g, sfb), - (real_t)exp(LN05 * (0.25*icsr->scale_factors[g][sfb])))); +#ifndef FIXED_POINT + scale = (real_t)pow(0.5, (0.25*icsr->scale_factors[g][sfb])); +#else + exp = icsr->scale_factors[g][sfb] / 4; + frac = icsr->scale_factors[g][sfb] % 4; +#endif /* Scale from left to right channel, do not touch left channel */ for (i = icsr->swb_offset[sfb]; i < icsr->swb_offset[sfb+1]; i++) { k = (group*nshort)+i; +#ifndef FIXED_POINT r_spec[k] = MUL(l_spec[k], scale); +#else + if (exp < 0) + r_spec[k] = l_spec[k] << -exp; + else + r_spec[k] = l_spec[k] >> exp; + r_spec[k] = MUL_R_C(r_spec[k], pow05_table[frac + 3]); +#endif + if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) + r_spec[k] = -r_spec[k]; } } } |