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