aboutsummaryrefslogtreecommitdiff
path: root/huffinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'huffinit.c')
-rw-r--r--huffinit.c121
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];
+ }
+ }
+}