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

mpeg/mp3

开发平台:

Unix_Linux

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