huffman.c
上传用户:bjsgzm
上传日期:2007-01-08
资源大小:256k
文件大小:5k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression, and might
  6. contain smaller or larger sections that are directly taken
  7. from ISO's reference code.
  8. All changes to the ISO reference code herein are either
  9. copyrighted by Tord Jansson (tord.jansson@swipnet.se)
  10. or sublicensed to Tord Jansson by a third party.
  11. BladeEnc is free software; you can redistribute this file
  12. and/or modify it under the terms of the GNU Lesser General Public
  13. License as published by the Free Software Foundation; either
  14. version 2.1 of the License, or (at your option) any later version.
  15. */
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include "system.h"
  19. #include "common.h"
  20. #include "huffman.h"
  21. HUFFBITS dmask = 1 << (sizeof(HUFFBITS)*8-1);
  22. unsigned int hs = sizeof(HUFFBITS)*8;
  23. struct huffcodetab ht[HTN];     /* array of all huffcodtable headers    */
  24.                                 /* 0..31 Huffman code table 0..31       */
  25.                                 /* 32,33 count1-tables                  */
  26. /* read the huffman encode table */
  27. int read_huffcodetab( void )
  28. {
  29.         int             index = 0;
  30.   char line[100],command[40],huffdata[40];
  31.   unsigned int t,i,j,k,nn,x,y,n=0;
  32.   unsigned int xl, yl, len;
  33.   HUFFBITS h;
  34.   int   hsize;
  35.   hsize = sizeof(HUFFBITS)*8;
  36.   do
  37.         {
  38.     strcpy( line, aHuffcode[index++] );
  39. /*      fgets(line,99,fi); */
  40.   } while ((line[0] == '#') || (line[0] < ' ') );
  41.   do
  42.         {
  43.     while ((line[0]=='#') || (line[0] < ' '))
  44.                 {
  45.             strcpy( line, aHuffcode[index++] );
  46. /*      fgets(line,99,fi); */
  47.     }
  48.     sscanf(line,"%s %s %u %u %u",command,ht[n].tablename,
  49.                                  &xl,&yl,&ht[n].linbits);
  50.     if (strcmp(command,".end")==0)
  51.       return n;
  52.     else if (strcmp(command,".table")!=0) {
  53.       fprintf(stderr,"huffman table %u data corruptedn",n);
  54.       return -1;
  55.     }
  56.     ht[n].linmax = (1<<ht[n].linbits)-1;
  57.     sscanf(ht[n].tablename,"%u",&nn);
  58.     if (nn != n) {
  59.       fprintf(stderr,"wrong table number %un",n);
  60.       return(-2);
  61.     }
  62.     ht[n].xlen = xl;
  63.     ht[n].ylen = yl;
  64.     do {
  65.             strcpy( line, aHuffcode[index++] );
  66. /*      fgets(line,99,fi); */
  67.     } while ((line[0] == '#') || (line[0] < ' '));
  68.     sscanf(line,"%s %u",command,&t);
  69.     if (strcmp(command,".reference")==0) {
  70.       ht[n].ref   = t;
  71.       ht[n].table = ht[t].table;
  72.       ht[n].hlen  = ht[t].hlen;
  73.       if ( (xl != ht[t].xlen) ||
  74.            (yl != ht[t].ylen)  ) {
  75.         fprintf(stderr,"wrong table %u referencen",n);
  76.         return (-3);
  77.       };
  78.       do {
  79.             strcpy( line, aHuffcode[index++] );
  80. /*                      fgets(line,99,fi); */
  81.       } while ((line[0] == '#') || (line[0] < ' ') );
  82.     }
  83.     else {
  84.         ht[n].ref  = -1;
  85. #ifdef NO_ZERO_CALLOC
  86.       ht[n].table=(HUFFBITS *) calloc((xl*yl)+1,sizeof(HUFFBITS));
  87. #else
  88.       ht[n].table=(HUFFBITS *) calloc(xl*yl,sizeof(HUFFBITS));
  89. #endif
  90.       if (ht[n].table == NULL) {
  91.          fprintf(stderr,"unsufficient heap errorn");
  92.          return (-4);
  93.       }
  94. #ifdef NO_ZERO_CALLOC
  95.       ht[n].hlen=(unsigned char *) calloc((xl*yl)+1,sizeof(unsigned char));
  96. #else
  97.       ht[n].hlen=(unsigned char *) calloc(xl*yl,sizeof(unsigned char));
  98. #endif
  99.       if (ht[n].hlen == NULL) {
  100.          fprintf(stderr,"unsufficient heap errorn");
  101.          return (-4);
  102.       }
  103.       for (i=0; i<xl; i++) {
  104.         for (j=0;j<yl; j++) {
  105.           if (xl>1)
  106.             sscanf(line,"%u %u %u %s",&x, &y, &len,huffdata);
  107.           else
  108.             sscanf(line,"%u %u %s",&x,&len,huffdata);
  109.           h=0;k=0;
  110.           while (huffdata[k]) {
  111.             h <<= 1;
  112.             if (huffdata[k] == '1')
  113.               h++;
  114.             else if (huffdata[k] != '0'){
  115.               fprintf(stderr,"huffman-table %u bit errorn",n);
  116.               return (-5);
  117.             };
  118.             k++;
  119.           };
  120.           if (k != len) {
  121.            fprintf(stderr,
  122.               "warning: wrong codelen in table %u, pos [%2u][%2u]n",
  123.                n,i,j);
  124.           };
  125.           ht[n].table[i*xl+j] = h;
  126.           ht[n].hlen[i*xl+j] = (unsigned char) len;
  127.           do {
  128.             strcpy( line, aHuffcode[index++] );
  129. /*                                      fgets(line,99,fi); */
  130.           } while ((line[0] == '#') || (line[0] < ' '));
  131.         }
  132.       }
  133.     }
  134.     n++;
  135.   } while (1);
  136. }