HUFFMAN.C
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:11k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
  4.  *
  5.  * $Id: huffman.c,v 1.2 1996/03/28 03:13:37 rowlands Exp $
  6.  *
  7.  * $Log: huffman.c,v $
  8.  * Revision 1.2  1996/03/28 03:13:37  rowlands
  9.  * Merged layers 1-2 and layer 3 revisions
  10.  *
  11.  * Revision 1.1  1996/02/14 03:45:52  rowlands
  12.  * Initial revision
  13.  *
  14.  * Received from FhG
  15.  **********************************************************************/
  16. /**********************************************************************
  17.  *   date   programmers                comment                        *
  18.  *27.2.92   F.O.Witte                  (ITT Intermetall)              *
  19.  *        email: otto.witte@itt-sc.de    *
  20.  *        tel:   ++49 (761)517-125       *
  21.  *        fax:   ++49 (761)517-880       *
  22.  *12.6.92   J. Pineda                  Added sign bit to decoder.     *
  23.  * 08/24/93 M. Iwadare                 Changed for 1 pass decoding.   *
  24.  *--------------------------------------------------------------------*
  25.  *  7/14/94 Juergen Koller      Bug fixes in Layer III code           *
  26.  *********************************************************************/
  27. #include "common.h"
  28. #include "huffman.h"
  29. #include "stdlib.h"
  30.      
  31. HUFFBITS dmask = 1 << (sizeof(HUFFBITS)*8-1);
  32. unsigned int hs = sizeof(HUFFBITS)*8;
  33. struct huffcodetab ht[HTN]; /* array of all huffcodtable headers */
  34. /* 0..31 Huffman code table 0..31 */
  35. /* 32,33 count1-tables */
  36. /* read the huffman encode table */
  37. int read_huffcodetab(fi) 
  38. FILE *fi;
  39. {
  40.   char line[100],command[40],huffdata[40];
  41.   unsigned int t,i,j,k,nn,x,y,n=0;
  42.   unsigned int xl, yl, len;
  43.   HUFFBITS h;
  44.   int hsize;
  45.   
  46.   hsize = sizeof(HUFFBITS)*8; 
  47.   do {
  48.       fgets(line,99,fi);
  49.   } while ((line[0] == '#') || (line[0] < ' ') );
  50.   
  51.   do {    
  52.     while ((line[0]=='#') || (line[0] < ' ')) {
  53.       fgets(line,99,fi);
  54.     } 
  55.     sscanf(line,"%s %s %u %u %u",command,ht[n].tablename,
  56.          &xl,&yl,&ht[n].linbits);
  57.     if (strcmp(command,".end")==0)
  58.       return n;
  59.     else if (strcmp(command,".table")!=0) {
  60.       fprintf(stderr,"huffman table %u data corruptedn",n);
  61.       return -1;
  62.     }
  63.     ht[n].linmax = (1<<ht[n].linbits)-1;
  64.    
  65.     sscanf(ht[n].tablename,"%u",&nn);
  66.     if (nn != n) {
  67.       fprintf(stderr,"wrong table number %un",n);
  68.       return(-2);
  69.     } 
  70.     ht[n].xlen = xl;
  71.     ht[n].ylen = yl;
  72.     do {
  73.       fgets(line,99,fi);
  74.     } while ((line[0] == '#') || (line[0] < ' '));
  75.     sscanf(line,"%s %u",command,&t);
  76.     if (strcmp(command,".reference")==0) {
  77.       ht[n].ref   = t;
  78.       ht[n].table = ht[t].table;
  79.       ht[n].hlen  = ht[t].hlen;
  80.       if ( (xl != ht[t].xlen) ||
  81.            (yl != ht[t].ylen)  ) {
  82.         fprintf(stderr,"wrong table %u referencen",n);
  83.         return (-3);
  84.       };
  85.       do {
  86.         fgets(line,99,fi);
  87.       } while ((line[0] == '#') || (line[0] < ' ') );
  88.     } 
  89.     else {
  90.       ht[n].ref  = -1;
  91.       ht[n].table=(HUFFBITS *) calloc(xl*yl,sizeof(HUFFBITS));
  92.       if (ht[n].table == NULL) {
  93.          fprintf(stderr,"unsufficient heap errorn");
  94.          return (-4);
  95.       }
  96.       ht[n].hlen=(unsigned char *) calloc(xl*yl,sizeof(unsigned char));
  97.       if (ht[n].hlen == NULL) {
  98.          fprintf(stderr,"unsufficient heap errorn");
  99.          return (-4);
  100.       }
  101.       for (i=0; i<xl; i++) {
  102.         for (j=0;j<yl; j++) {
  103.   if (xl>1) 
  104.             sscanf(line,"%u %u %u %s",&x, &y, &len,huffdata);
  105.   else 
  106.             sscanf(line,"%u %u %s",&x,&len,huffdata);
  107.           h=0;k=0;
  108.   while (huffdata[k]) {
  109.             h <<= 1;
  110.             if (huffdata[k] == '1')
  111.               h++;
  112.             else if (huffdata[k] != '0'){
  113.               fprintf(stderr,"huffman-table %u bit errorn",n);
  114.               return (-5);
  115.             };
  116.             k++;
  117.           };
  118.           if (k != len) {
  119.            fprintf(stderr,
  120.               "warning: wrong codelen in table %u, pos [%2u][%2u]n",
  121.        n,i,j);
  122.           };
  123.           ht[n].table[i*xl+j] = h;
  124.           ht[n].hlen[i*xl+j] = (unsigned char) len;
  125.   do {
  126.             fgets(line,99,fi);
  127.           } while ((line[0] == '#') || (line[0] < ' '));
  128.         }
  129.       }
  130.     }
  131.     n++;
  132.   } while (1);
  133. }
  134. /* read the huffman decoder table */
  135. int read_decoder_table(fi) 
  136. FILE *fi;
  137. {
  138.   int n,i,nn,t;
  139.   unsigned int v0,v1;
  140.   char command[100],line[100];
  141.   for (n=0;n<HTN;n++) {
  142.     /* .table number treelen xlen ylen linbits */ 
  143.     do {
  144.       fgets(line,99,fi);
  145.     } while ((line[0] == '#') || (line[0] < ' '));
  146.      
  147.     sscanf(line,"%s %s %u %u %u %u",command,ht[n].tablename,
  148.            &ht[n].treelen, &ht[n].xlen, &ht[n].ylen, &ht[n].linbits);
  149.     if (strcmp(command,".end")==0)
  150.       return n;
  151.     else if (strcmp(command,".table")!=0) {
  152.       fprintf(stderr,"huffman table %u data corruptedn",n);
  153.       return -1;
  154.     }
  155.     ht[n].linmax = (1<<ht[n].linbits)-1;
  156.    
  157.     sscanf(ht[n].tablename,"%u",&nn);
  158.     if (nn != n) {
  159.       fprintf(stderr,"wrong table number %un",n);
  160.       return(-2);
  161.     } 
  162.     do {
  163.       fgets(line,99,fi);
  164.     } while ((line[0] == '#') || (line[0] < ' '));
  165.     sscanf(line,"%s %u",command,&t);
  166.     if (strcmp(command,".reference")==0) {
  167.       ht[n].ref   = t;
  168.       ht[n].val   = ht[t].val;
  169.       ht[n].treelen  = ht[t].treelen;
  170.       if ( (ht[n].xlen != ht[t].xlen) ||
  171.            (ht[n].ylen != ht[t].ylen)  ) {
  172.         fprintf(stderr,"wrong table %u referencen",n);
  173.         return (-3);
  174.       };
  175.       while ((line[0] == '#') || (line[0] < ' ') ) {
  176.         fgets(line,99,fi);
  177.       }
  178.     }    
  179.     else if (strcmp(command,".treedata")==0) {
  180.       ht[n].ref  = -1;
  181.       ht[n].val = (unsigned char (*)[2]) 
  182.         calloc(2*(ht[n].treelen),sizeof(unsigned char));
  183.       if (ht[n].val == NULL) {
  184.      fprintf(stderr, "heaperror at table %dn",n);
  185.      exit (-10);
  186.       }
  187.       for (i=0;i<ht[n].treelen; i++) {
  188.         fscanf(fi,"%x %x",&v0, &v1);
  189.         ht[n].val[i][0]=(unsigned char)v0;
  190.         ht[n].val[i][1]=(unsigned char)v1;
  191.       }
  192.       fgets(line,99,fi); /* read the rest of the line */
  193.     }
  194.     else {
  195.       fprintf(stderr,"huffman decodertable error at table %dn",n);
  196.     }
  197.   }
  198.   return n;
  199. }
  200. /* do the huffman coding,  */
  201. /* note! for counta,countb - the 4 bit value is passed in y, set x to 0 */
  202. /* return value: 0-no error, 1 decode error */
  203. void huffman_coder( x, y, h, bs)
  204. unsigned int x;  /* x-value */
  205. unsigned int y;  /* y-value */
  206. struct huffcodetab *h;  /* pointer to huffman code record  */
  207. Bit_stream_struc *bs;   /* pointer to open write bitstream  */
  208. {
  209.   HUFFBITS huffbits; /* data left aligned */
  210.   HUFFBITS linbitsX; 
  211.   HUFFBITS linbitsY;
  212.   unsigned int len;
  213.   unsigned int xl1 = h->xlen-1;
  214.   unsigned int yl1 = h->ylen-1;
  215.   linbitsX = 0;
  216.   linbitsY = 0;
  217.   if (h->table == NULL) return;
  218.   if (((x < xl1) || (xl1==0)) && (y < yl1)) {
  219.     huffbits = h->table[x*(h->xlen)+y];
  220.     len = h->hlen[x*(h->xlen)+y];
  221.     putbits(bs,huffbits,len);
  222.     return;
  223.   }  
  224.   else if (x >= xl1) {
  225.     linbitsX = x-xl1;
  226.     if (linbitsX > h->linmax) {
  227.       fprintf(stderr,"warning: Huffman X table overflown");
  228.       linbitsX= h->linmax;
  229.     };
  230.     if (y >= yl1) {
  231.       huffbits = h->table[(h->ylen)*(h->xlen)-1];
  232.       len = h->hlen[(h->ylen)*(h->xlen)-1];
  233.       putbits(bs,huffbits,len);
  234.       linbitsY = y-yl1;
  235.       if (linbitsY > h->linmax) {
  236.         fprintf(stderr,"warning: Huffman Y table overflown");
  237.         linbitsY = h->linmax;
  238.       };
  239.       if (h->linbits) {
  240.         putbits(bs,linbitsX,h->linbits);
  241.         putbits(bs,linbitsY,h->linbits);
  242.       }
  243.     } 
  244.     else { /* x>= h->xlen, y<h->ylen */
  245.       huffbits = h->table[(h->ylen)*xl1+y];
  246.       len = h->hlen[(h->ylen)*xl1+y];
  247.       putbits(bs,huffbits,len);
  248.       if (h->linbits) {
  249.         putbits(bs,linbitsX,h->linbits);
  250.       }
  251.     }
  252.   }
  253.   else  { /* ((x < h->xlen) && (y>=h->ylen)) */
  254.     huffbits = h->table[(h->ylen)*x+yl1];
  255.     len = h->hlen[(h->ylen)*x+yl1];
  256.     putbits(bs,huffbits,len);
  257.     linbitsY = y-yl1;
  258.     if (linbitsY > h->linmax) {
  259.       fprintf(stderr,"warning: Huffman Y table overflown");
  260.       linbitsY = h->linmax;
  261.     };
  262.     if (h->linbits) {
  263.        putbits(bs,linbitsY,h->linbits);
  264.     }
  265.   }
  266. }
  267. /* do the huffman-decoding  */
  268. /* note! for counta,countb -the 4 bit value is returned in y, discard x */
  269. int huffman_decoder(h, x, y, v, w)
  270. struct huffcodetab *h; /* pointer to huffman code record */
  271. /* unsigned */ int *x;  /* returns decoded x value  */
  272. /* unsigned */ int *y; /* returns decoded y value */
  273. int *v;
  274. int *w;
  275. {  
  276.   HUFFBITS level;
  277.   int point = 0;
  278.   int error = 1;
  279.   level     = dmask;
  280.   if (h->val == NULL) return 2;
  281.   /* table 0 needs no bits */
  282.   if ( h->treelen == 0)
  283.   {  *x = *y = 0;
  284.      return 0;
  285.   }
  286.   /* Lookup in Huffman table. */
  287.   do {
  288.     if (h->val[point][0]==0) {   /*end of tree*/
  289.       *x = h->val[point][1] >> 4;
  290.       *y = h->val[point][1] & 0xf;
  291.       error = 0;
  292.       break;
  293.     } 
  294.     if (hget1bit()) {
  295.       while (h->val[point][1] >= MXOFF) point += h->val[point][1]; 
  296.       point += h->val[point][1];
  297.     }
  298.     else {
  299.       while (h->val[point][0] >= MXOFF) point += h->val[point][0]; 
  300.       point += h->val[point][0];
  301.     }
  302.     level >>= 1;
  303.   } while (level  || (point < ht->treelen) );
  304.   
  305.   /* Check for error. */
  306.   
  307.   if (error) { /* set x and y to a medium value as a simple concealment */
  308.     printf("Illegal Huffman code in data.n");
  309.     *x = (h->xlen-1 << 1);
  310.     *y = (h->ylen-1 << 1);
  311.   }
  312.   /* Process sign encodings for quadruples tables. */
  313.   if (h->tablename[0] == '3'
  314.       && (h->tablename[1] == '2' || h->tablename[1] == '3')) {
  315.      *v = (*y>>3) & 1;
  316.      *w = (*y>>2) & 1;
  317.      *x = (*y>>1) & 1;
  318.      *y = *y & 1;
  319.      /* v, w, x and y are reversed in the bitstream. 
  320.         switch them around to make test bistream work. */
  321.      
  322. /*   {int i=*v; *v=*y; *y=i; i=*w; *w=*x; *x=i;}  MI */
  323.      if (*v)
  324.         if (hget1bit() == 1) *v = -*v;
  325.      if (*w)
  326.         if (hget1bit() == 1) *w = -*w;
  327.      if (*x)
  328.         if (hget1bit() == 1) *x = -*x;
  329.      if (*y)
  330.         if (hget1bit() == 1) *y = -*y;
  331.      }
  332.      
  333.   /* Process sign and escape encodings for dual tables. */
  334.   
  335.   else {
  336.   
  337.       /* x and y are reversed in the test bitstream.
  338.          Reverse x and y here to make test bitstream work. */
  339.  
  340. /*    removed 11/11/92 -ag  
  341. {int i=*x; *x=*y; *y=i;} 
  342. */      
  343.      if (h->linbits)
  344.        if ((h->xlen-1) == *x) 
  345.          *x += hgetbits(h->linbits);
  346.      if (*x)
  347.         if (hget1bit() == 1) *x = -*x;
  348.      if (h->linbits)   
  349.        if ((h->ylen-1) == *y)
  350.          *y += hgetbits(h->linbits);
  351.      if (*y)
  352.         if (hget1bit() == 1) *y = -*y;
  353.      }
  354.   
  355.   return error;  
  356. }