author | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
---|---|---|
committer | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
commit | 15318cad33835e4e2dc620d033e43cd930676cdd (patch) (side-by-side diff) | |
tree | c2fa0399a2c47fda8e2cd0092c73a809d17f68eb /core/multimedia/opieplayer/libmpeg3/audio/uncouple.c | |
download | opie-15318cad33835e4e2dc620d033e43cd930676cdd.zip opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.gz opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.bz2 |
Initial revision
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/audio/uncouple.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/libmpeg3/audio/uncouple.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/audio/uncouple.c b/core/multimedia/opieplayer/libmpeg3/audio/uncouple.c new file mode 100644 index 0000000..d87a078 --- a/dev/null +++ b/core/multimedia/opieplayer/libmpeg3/audio/uncouple.c @@ -0,0 +1,135 @@ +/* + * + * uncouple.c Copyright (C) Aaron Holtzman - May 1999 + * + * This file is part of libmpeg3 + * + * libmpeg3 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * libmpeg3 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include "../bitstream.h" +#include "mpeg3audio.h" + +static unsigned char mpeg3_first_bit_lut[256] = +{ + 0, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +/* Converts an unsigned exponent in the range of 0-24 and a 16 bit mantissa + * to an IEEE single precision floating point value */ +static inline void mpeg3audio_ac3_convert_to_float(unsigned short exp, + unsigned short mantissa, + unsigned MPEG3_INT32 *dest) +{ + int num; + short exponent; + int i; + +/* If the mantissa is zero we can simply return zero */ + if(mantissa == 0) + { + *dest = 0; + return; + } + +/* Exponent is offset by 127 in IEEE format minus the shift to + * align the mantissa to 1.f (subtracted in the final result) */ + exponent = 127 - exp; + +/* Take care of the one asymmetric negative number */ + if(mantissa == 0x8000) + mantissa++; + +/* Extract the sign bit, invert the mantissa if it's negative, and + shift out the sign bit */ + if(mantissa & 0x8000) + { + mantissa *= -1; + num = 0x80000000 + (exponent << 23); + } + else + { + mantissa *= 1; + num = exponent << 23; + } + +/* Find the index of the most significant one bit */ + i = mpeg3_first_bit_lut[mantissa >> 8]; + + if(i == 0) + i = mpeg3_first_bit_lut[mantissa & 0xff] + 8; + + *dest = num - (i << 23) + (mantissa << (7 + i)); + return; +} + + +int mpeg3audio_ac3_uncouple(mpeg3audio_t *audio, + mpeg3_ac3bsi_t *bsi, + mpeg3_ac3audblk_t *audblk, + mpeg3_stream_coeffs_t *coeffs) +{ + int i, j; + + for(i = 0; i < bsi->nfchans; i++) + { + for(j = 0; j < audblk->endmant[i]; j++) + mpeg3audio_ac3_convert_to_float(audblk->fbw_exp[i][j], + audblk->chmant[i][j], + (unsigned MPEG3_INT32*)&coeffs->fbw[i][j]); + } + + if(audblk->cplinu) + { + for(i = 0; i < bsi->nfchans; i++) + { + if(audblk->chincpl[i]) + { + mpeg3audio_ac3_uncouple_channel(audio, + coeffs, + audblk, + i); + } + } + + } + + if(bsi->lfeon) + { +/* There are always 7 mantissas for lfe */ + for(j = 0; j < 7 ; j++) + mpeg3audio_ac3_convert_to_float(audblk->lfe_exp[j], + audblk->lfemant[j], + (unsigned MPEG3_INT32*)&coeffs->lfe[j]); + + } + return 0; +} |