diff options
Diffstat (limited to 'huffinit.c')
-rw-r--r-- | huffinit.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/huffinit.c b/huffinit.c new file mode 100644 index 0000000..3fe2811 --- /dev/null +++ b/huffinit.c @@ -0,0 +1,121 @@ +/************************* MPEG-2 NBC Audio Decoder ************************** + * * +"This software module was originally developed by +AT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course of +development of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, +14496-1,2 and 3. This software module is an implementation of a part of one or more +MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 +Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio +standards free license to this software module or modifications thereof for use in +hardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4 +Audio standards. Those intending to use this software module in hardware or +software products are advised that this use may infringe existing patents. +The original developer of this software module and his/her company, the subsequent +editors and their companies, and ISO/IEC have no liability for use of this software +module or modifications thereof in an implementation. Copyright is not released for +non MPEG-2 NBC/MPEG-4 Audio conforming products.The original developer +retains full right to use the code for his/her own purpose, assign or donate the +code to a third party and to inhibit third party from using the code for non +MPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice must +be included in all copies or derivative works." +Copyright(c)1996. + * * + ****************************************************************************/ +#include <math.h> +#include "all.h" + +void huffbookinit(faacDecHandle hDecoder) +{ + int i; + + hufftab(&book[1], book1, 4, HUF1SGN); + hufftab(&book[2], book2, 4, HUF2SGN); + hufftab(&book[3], book3, 4, HUF3SGN); + hufftab(&book[4], book4, 4, HUF4SGN); + hufftab(&book[5], book5, 2, HUF5SGN); + hufftab(&book[6], book6, 2, HUF6SGN); + hufftab(&book[7], book7, 2, HUF7SGN); + hufftab(&book[8], book8, 2, HUF8SGN); + hufftab(&book[9], book9, 2, HUF9SGN); + hufftab(&book[10], book10, 2, HUF10SGN); + hufftab(&book[11], book11, 2, HUF11SGN); + + for(i = 0; i < TEXP; i++) + { + hDecoder->exptable[i] = (float)pow( 2.0, 0.25*i); + } + + for(i = 0; i < MAX_IQ_TBL; i++) + { + hDecoder->iq_exp_tbl[i] = (float)pow(i, 4./3.); + } + + infoinit(hDecoder, &samp_rate_info[hDecoder->mc_info.sampling_rate_idx]); +} + +void infoinit(faacDecHandle hDecoder, SR_Info *sip) +{ + int i, j, k, n, ws; + int *sfbands; + Info *ip; + + /* long block info */ + ip = &hDecoder->only_long_info; + hDecoder->win_seq_info[ONLY_LONG_WINDOW] = ip; + ip->islong = 1; + ip->nsbk = 1; + ip->bins_per_bk = LN2; + for (i=0; i<ip->nsbk; i++) { + ip->sfb_per_sbk[i] = sip->nsfb1024; + ip->sectbits[i] = LONG_SECT_BITS; + ip->sbk_sfb_top[i] = sip->SFbands1024; + } + ip->sfb_width_128 = NULL; + ip->num_groups = 1; + ip->group_len[0] = 1; + ip->group_offs[0] = 0; + + /* short block info */ + ip = &hDecoder->eight_short_info; + hDecoder->win_seq_info[EIGHT_SHORT_WINDOW] = ip; + ip->islong = 0; + ip->nsbk = NSHORT; + ip->bins_per_bk = LN2; + for (i=0; i<ip->nsbk; i++) { + ip->sfb_per_sbk[i] = sip->nsfb128; + ip->sectbits[i] = SHORT_SECT_BITS; + ip->sbk_sfb_top[i] = sip->SFbands128; + } + /* construct sfb width table */ + ip->sfb_width_128 = sfbwidth128; + for (i=0, j=0, n=sip->nsfb128; i<n; i++) { + k = sip->SFbands128[i]; + sfbwidth128[i] = k - j; + j = k; + } + + /* common to long and short */ + for (ws=0; ws<NUM_WIN_SEQ; ws++) { + if ((ip = hDecoder->win_seq_info[ws]) == NULL) + continue; + + ip->sfb_per_bk = 0; + k = 0; + n = 0; + for (i=0; i<ip->nsbk; i++) { + /* compute bins_per_sbk */ + ip->bins_per_sbk[i] = ip->bins_per_bk / ip->nsbk; + + /* compute sfb_per_bk */ + ip->sfb_per_bk += ip->sfb_per_sbk[i]; + + /* construct default (non-interleaved) bk_sfb_top[] */ + sfbands = ip->sbk_sfb_top[i]; + for (j=0; j < ip->sfb_per_sbk[i]; j++) + ip->bk_sfb_top[j+k] = sfbands[j] + n; + + n += ip->bins_per_sbk[i]; + k += ip->sfb_per_sbk[i]; + } + } +} |