www.pudn.com > mp3_source.rar > huffman.c
/********************************************************************** Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserved huffman.c **********************************************************************/ /********************************************************************** * MPEG/audio coding/decoding software, work in progress * * NOT for public distribution until verified and approved by the * * MPEG/audio committee. For further information, please contact * * Chad Fogg email:* * * * VERSION 2.10 * * changes made since last update: * * date programmers comment * *27.2.92 F.O.Witte (ITT Intermetall) * * email: otto.witte@itt-sc.de * * tel: ++49 (761)517-125 * * fax: ++49 (761)517-880 * *12.6.92 J. Pineda Added sign bit to decoder. * * 08/24/93 M. Iwadare Changed for 1 pass decoding. * *--------------------------------------------------------------------* * 7/14/94 Juergen Koller Bug fixes in Layer III code * *********************************************************************/ #include #include #include "common.h" #include "huffman.h" HUFFBITS dmask = 1 << (sizeof(HUFFBITS)*8-1); struct huffcodetab ht[HTN]; /* array of all huffcodtable headers */ /* 0..31 Huffman code table 0..31 */ /* 32,33 count1-tables */ /* read the huffman decoder table */ int read_decoder_table(FILE *fi) { int n,i,nn,t; unsigned int v0,v1; char command[100],line[100]; for (n=0;n val == NULL) return 2; /* table 0 needs no bits */ if ( h->treelen == 0) { *x = *y = 0; return 0; } /* Lookup in Huffman table. */ do { if (h->val[point][0]==0) { /*end of tree*/ *x = h->val[point][1] >> 4; *y = h->val[point][1] & 0xf; error = 0; break; } if (hget1bit()) { while (h->val[point][1] >= MXOFF) point += h->val[point][1]; point += h->val[point][1]; } else { while (h->val[point][0] >= MXOFF) point += h->val[point][0]; point += h->val[point][0]; } level >>= 1; } while (level || (point < ht->treelen) ); /* Check for error. */ if (error) { /* set x and y to a medium value as a simple concealment */ printf("Illegal Huffman code in data.\n"); *x = (h->xlen-1 << 1); *y = (h->ylen-1 << 1); } /* Process sign encodings for quadruples tables. */ if (h->tablename[0] == '3' && (h->tablename[1] == '2' || h->tablename[1] == '3')) { *v = (*y>>3) & 1; *w = (*y>>2) & 1; *x = (*y>>1) & 1; *y = *y & 1; /* v, w, x and y are reversed in the bitstream. switch them around to make test bistream work. */ /* {int i=*v; *v=*y; *y=i; i=*w; *w=*x; *x=i;} MI */ if (*v) if (hget1bit() == 1) *v = -*v; if (*w) if (hget1bit() == 1) *w = -*w; if (*x) if (hget1bit() == 1) *x = -*x; if (*y) if (hget1bit() == 1) *y = -*y; } /* Process sign and escape encodings for dual tables. */ else { /* x and y are reversed in the test bitstream. Reverse x and y here to make test bitstream work. */ /* removed 11/11/92 -ag {int i=*x; *x=*y; *y=i;} */ if (h->linbits) if ((h->xlen-1) == *x) *x += hgetbits(h->linbits); if (*x) if (hget1bit() == 1) *x = -*x; if (h->linbits) if ((h->ylen-1) == *y) *y += hgetbits(h->linbits); if (*y) if (hget1bit() == 1) *y = -*y; } return error; }