summaryrefslogtreecommitdiff
path: root/src/libfaad/is.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-12-16 18:59:50 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-12-16 18:59:50 +0000
commit94ef6649dd5f4e95337af00dcede2337ea7cfb49 (patch)
tree07d679ce92b4e4517815abc42394480eebf44904 /src/libfaad/is.c
parent48f4c5809db11a6df4a5e7285d5e60a2ed924e2a (diff)
downloadxine-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.c38
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];
}
}
}