⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vld.h

📁 基于ti c55x序列dsp的jpeg算法中的哈夫解码的实现
💻 H
字号:
typedef struct {
           int bit_ptr;              /* bit counter for current word (MSB-16) */
           int buf_ptr;              /* buffer counter for data buffer (*databuf) */
           int bits_count;           /* Reserved */
           int *databuf;    /* pointer to current data buffer */
                              } huff_t;
struct vlccode {
    unsigned int len;
    unsigned int word;
    unsigned int pattern;
    };

struct control {
  unsigned int th_lower;
  int shift;
  int offset;
};    
typedef struct {
  int UvldTabDC[2][32];         /* 32 may NOT be enough */
 int UvldCtlTabDC[2][17];
  int UvldTabAC[2][256];        /* 256 may NOT be enough */
  int UvldCtlTabAC[2][17];
  int UvldLenMaxDC[2];
  int UvldLenMaxAC[2];
} vldvar_t;

struct vlccode hufftable[348]={ 
0x0002,0x0000,0x0000,0x0003,0x0002,0x0001,0x0003,0x0003,0x0002,
0x0003,0x0004,0x0003,0x0003,0x0005,0x0004,0x0003,0x0006,0x0005,
0x0004,0x000E,0x0006,0x0005,0x001E,0x0007,0x0006,0x003E,0x0008,
0x0007,0x007E,0x0009,0x0008,0x00FE,0x000A,0x0009,0x01FE,0x000B,
0x0002,0x0000,0x0000,0x0002,0x0001,0x0001,0x0002,0x0002,0x0002,
0x0003,0x0006,0x0003,0x0004,0x000E,0x0004,0x0005,0x001E,0x0005,
0x0006,0x003E,0x0006,0x0007,0x007E,0x0007,0x0008,0x00FE,0x0008,
0x0009,0x01FE,0x0009,0x000A,0x03FE,0x000A,0x000B,0x07FE,0x000B,
0x0002,0x0000,0x0001,0x0002,0x0001,0x0002,0x0003,0x0004,0x0003,
0x0004,0x000A,0x0000,0x0004,0x000B,0x0004,0x0004,0x000C,0x0011,
0x0005,0x001A,0x0005,0x0005,0x001B,0x0012,0x0005,0x001C,0x0021,
0x0006,0x003A,0x0031,0x0006,0x003B,0x0041,0x0007,0x0078,0x0006,
0x0007,0x0079,0x0013,0x0007,0x007A,0x0051,0x0007,0x007B,0x0061,
0x0008,0x00F8,0x0007,0x0008,0x00F9,0x0022,0x0008,0x00FA,0x0071,
0x0009,0x01F6,0x0014,0x0009,0x01F7,0x0032,0x0009,0x01F8,0x0081,
0x0009,0x01F9,0x0091,0x0009,0x01FA,0x00A1,0x000A,0x03F6,0x0008,
0x000A,0x03F7,0x0023,0x000A,0x03F8,0x0042,0x000A,0x03F9,0x00B1,
0x000A,0x03FA,0x00C1,0x000B,0x07F6,0x0015,0x000B,0x07F7,0x0052,
0x000B,0x07F8,0x00D1,0x000B,0x07F9,0x00F0,0x000C,0x0FF4,0x0024,
0x000C,0x0FF5,0x0033,0x000C,0x0FF6,0x0062,0x000C,0x0FF7,0x0072,
0x0010,0xFF80,0x0082,0x0010,0xFF81,0x0009,0x0010,0xFF82,0x000A,
0x0010,0xFF83,0x0016,0x0010,0xFF84,0x0017,0x0010,0xFF85,0x0018,
0x0010,0xFF86,0x0019,0x0010,0xFF87,0x001A,0x0010,0xFF88,0x0025,
0x0010,0xFF89,0x0026,0x0010,0xFF8A,0x0027,0x0010,0xFF8B,0x0028,
0x0010,0xFF8C,0x0029,0x0010,0xFF8D,0x002A,0x0010,0xFF8E,0x0034,
0x0010,0xFF8F,0x0035,0x0010,0xFF90,0x0036,0x0010,0xFF91,0x0037,
0x0010,0xFF92,0x0038,0x0010,0xFF93,0x0039,0x0010,0xFF94,0x003A,
0x0010,0xFF95,0x0043,0x0010,0xFF96,0x0044,0x0010,0xFF97,0x0045,
0x0010,0xFF98,0x0046,0x0010,0xFF99,0x0047,0x0010,0xFF9A,0x0048,
0x0010,0xFF9B,0x0049,0x0010,0xFF9C,0x004A,0x0010,0xFF9D,0x0053,
0x0010,0xFF9E,0x0054,0x0010,0xFF9F,0x0055,0x0010,0xFFA0,0x0056,
0x0010,0xFFA1,0x0057,0x0010,0xFFA2,0x0058,0x0010,0xFFA3,0x0059,
0x0010,0xFFA4,0x005A,0x0010,0xFFA5,0x0063,0x0010,0xFFA6,0x0064,
0x0010,0xFFA7,0x0065,0x0010,0xFFA8,0x0066,0x0010,0xFFA9,0x0067,
0x0010,0xFFAA,0x0068,0x0010,0xFFAB,0x0069,0x0010,0xFFAC,0x006A,
0x0010,0xFFAD,0x0073,0x0010,0xFFAE,0x0074,0x0010,0xFFAF,0x0075,
0x0010,0xFFB0,0x0076,0x0010,0xFFB1,0x0077,0x0010,0xFFB2,0x0078,
0x0010,0xFFB3,0x0079,0x0010,0xFFB4,0x007A,0x0010,0xFFB5,0x0083,
0x0010,0xFFB6,0x0084,0x0010,0xFFB7,0x0085,0x0010,0xFFB8,0x0086,
0x0010,0xFFB9,0x0087,0x0010,0xFFBA,0x0088,0x0010,0xFFBB,0x0089,
0x0010,0xFFBC,0x008A,0x0010,0xFFBD,0x0092,0x0010,0xFFBE,0x0093,
0x0010,0xFFBF,0x0094,0x0010,0xFFC0,0x0095,0x0010,0xFFC1,0x0096,
0x0010,0xFFC2,0x0097,0x0010,0xFFC3,0x0098,0x0010,0xFFC4,0x0099,
0x0010,0xFFC5,0x009A,0x0010,0xFFC6,0x00A2,0x0010,0xFFC7,0x00A3,
0x0010,0xFFC8,0x00A4,0x0010,0xFFC9,0x00A5,0x0010,0xFFCA,0x00A6,
0x0010,0xFFCB,0x00A7,0x0010,0xFFCC,0x00A8,0x0010,0xFFCD,0x00A9,
0x0010,0xFFCE,0x00AA,0x0010,0xFFCF,0x00B2,0x0010,0xFFD0,0x00B3,
0x0010,0xFFD1,0x00B4,0x0010,0xFFD2,0x00B5,0x0010,0xFFD3,0x00B6,
0x0010,0xFFD4,0x00B7,0x0010,0xFFD5,0x00B8,0x0010,0xFFD6,0x00B9,
0x0010,0xFFD7,0x00BA,0x0010,0xFFD8,0x00C2,0x0010,0xFFD9,0x00C3,
0x0010,0xFFDA,0x00C4,0x0010,0xFFDB,0x00C5,0x0010,0xFFDC,0x00C6,
0x0010,0xFFDD,0x00C7,0x0010,0xFFDE,0x00C8,0x0010,0xFFDF,0x00C9,
0x0010,0xFFE0,0x00CA,0x0010,0xFFE1,0x00D2,0x0010,0xFFE2,0x00D3,
0x0010,0xFFE3,0x00D4,0x0010,0xFFE4,0x00D5,0x0010,0xFFE5,0x00D6,
0x0010,0xFFE6,0x00D7,0x0010,0xFFE7,0x00D8,0x0010,0xFFE8,0x00D9,
0x0010,0xFFE9,0x00DA,0x0010,0xFFEA,0x00E1,0x0010,0xFFEB,0x00E2,
0x0010,0xFFEC,0x00E3,0x0010,0xFFED,0x00E4,0x0010,0xFFEE,0x00E5,
0x0010,0xFFEF,0x00E6,0x0010,0xFFF0,0x00E7,0x0010,0xFFF1,0x00E8,
0x0010,0xFFF2,0x00E9,0x0010,0xFFF3,0x00EA,0x0010,0xFFF4,0x00F1,
0x0010,0xFFF5,0x00F2,0x0010,0xFFF6,0x00F3,0x0010,0xFFF7,0x00F4,
0x0010,0xFFF8,0x00F5,0x0010,0xFFF9,0x00F6,0x0010,0xFFFA,0x00F7,
0x0010,0xFFFB,0x00F8,0x0010,0xFFFC,0x00F9,0x0010,0xFFFD,0x00FA,
0x0002,0x0000,0x0000,0x0002,0x0001,0x0001,0x0003,0x0004,0x0002,
0x0004,0x000A,0x0003,0x0004,0x000B,0x0011,0x0005,0x0018,0x0004,
0x0005,0x0019,0x0005,0x0005,0x001A,0x0021,0x0005,0x001B,0x0031,
0x0006,0x0038,0x0006,0x0006,0x0039,0x0012,0x0006,0x003A,0x0041,
0x0006,0x003B,0x0051,0x0007,0x0078,0x0007,0x0007,0x0079,0x0061,
0x0007,0x007A,0x0071,0x0008,0x00F6,0x0013,0x0008,0x00F7,0x0022,
0x0008,0x00F8,0x0032,0x0008,0x00F9,0x0081,0x0009,0x01F4,0x0008,
0x0009,0x01F5,0x0014,0x0009,0x01F6,0x0042,0x0009,0x01F7,0x0091,
0x0009,0x01F8,0x00A1,0x0009,0x01F9,0x00B1,0x0009,0x01FA,0x00C1,
0x000A,0x03F6,0x0009,0x000A,0x03F7,0x0023,0x000A,0x03F8,0x0033,
0x000A,0x03F9,0x0052,0x000A,0x03FA,0x00F0,0x000B,0x07F6,0x0015,
0x000B,0x07F7,0x0062,0x000B,0x07F8,0x0072,0x000B,0x07F9,0x00D1,
0x000C,0x0FF4,0x000A,0x000C,0x0FF5,0x0016,0x000C,0x0FF6,0x0024,
0x000C,0x0FF7,0x0034,0x0010,0xFF80,0x00E1,0x0010,0xFF81,0x0025,
0x0010,0xFF82,0x00F1,0x0010,0xFF83,0x0017,0x0010,0xFF84,0x0018,
0x0010,0xFF85,0x0019,0x0010,0xFF86,0x001A,0x0010,0xFF87,0x0026,
0x0010,0xFF88,0x0027,0x0010,0xFF89,0x0028,0x0010,0xFF8A,0x0029,
0x0010,0xFF8B,0x002A,0x0010,0xFF8C,0x0035,0x0010, 0xFF8D,0x0036,
0x0010,0xFF8E,0x0037,0x0010,0xFF8F,0x0038,0x0010,0xFF90,0x0039,
0x0010,0xFF91,0x003A,0x0010,0xFF92,0x0043,0x0010,0xFF93,0x0044,
0x0010,0xFF94,0x0045,0x0010,0xFF95,0x0046,0x0010,0xFF96,0x0047,
0x0010,0xFF97,0x0048,0x0010,0xFF98,0x0049,0x0010,0xFF99,0x004A,
0x0010,0xFF9A,0x0053,0x0010,0xFF9B,0x0054,0x0010,0xFF9C,0x0055,
0x0010,0xFF9D,0x0056,0x0010,0xFF9E,0x0057,0x0010,0xFF9F,0x0058,
0x0010,0xFFA0,0x0059,0x0010,0xFFA1,0x005A,0x0010,0xFFA2,0x0063,
0x0010,0xFFA3,0x0064,0x0010,0xFFA4,0x0065,0x0010,0xFFA5,0x0066,
0x0010,0xFFA6,0x0067,0x0010,0xFFA7,0x0068,0x0010,0xFFA8,0x0069,
0x0010,0xFFA9,0x006A,0x0010,0xFFAA,0x0073,0x0010,0xFFAB,0x0074,
0x0010,0xFFAC,0x0075,0x0010,0xFFAD,0x0076,0x0010,0xFFAE,0x0077,
0x0010,0xFFAF,0x0078,0x0010,0xFFB0,0x0079,0x0010,0xFFB1,0x007A,
0x0010,0xFFB2,0x0082,0x0010,0xFFB3,0x0083,0x0010,0xFFB4,0x0084,
0x0010,0xFFB5,0x0085,0x0010,0xFFB6,0x0086,0x0010,0xFFB7,0x0087,
0x0010,0xFFB8,0x0088,0x0010,0xFFB9,0x0089,0x0010,0xFFBA,0x008A,
0x0010,0xFFBB,0x0092,0x0010,0xFFBC,0x0093,0x0010,0xFFBD,0x0094,
0x0010,0xFFBE,0x0095,0x0010,0xFFBF,0x0096,0x0010,0xFFC0,0x0097,
0x0010,0xFFC1,0x0098,0x0010,0xFFC2,0x0099,0x0010,0xFFC3,0x009A,
0x0010,0xFFC4,0x00A2,0x0010,0xFFC5,0x00A3,0x0010,0xFFC6,0x00A4,
0x0010,0xFFC7,0x00A5,0x0010,0xFFC8,0x00A6,0x0010,0xFFC9,0x00A7,
0x0010,0xFFCA,0x00A8,0x0010,0xFFCB,0x00A9,0x0010,0xFFCC,0x00AA,
0x0010,0xFFCD,0x00B2,0x0010,0xFFCE,0x00B3,0x0010,0xFFCF,0x00B4,
0x0010,0xFFD0,0x00B5,0x0010,0xFFD1,0x00B6,0x0010,0xFFD2,0x00B7,
0x0010,0xFFD3,0x00B8,0x0010,0xFFD4,0x00B9,0x0010,0xFFD5,0x00BA,
0x0010,0xFFD6,0x00C2,0x0010,0xFFD7,0x00C3,0x0010,0xFFD8,0x00C4,
0x0010,0xFFD9,0x00C5,0x0010,0xFFDA,0x00C6,0x0010,0xFFDB,0x00C7,
0x0010,0xFFDC,0x00C8,0x0010,0xFFDD,0x00C9,0x0010,0xFFDE,0x00CA,
0x0010,0xFFDF,0x00D2,0x0010,0xFFE0,0x00D3,0x0010,0xFFE1,0x00D4,
0x0010,0xFFE2,0x00D5,0x0010,0xFFE3,0x00D6,0x0010,0xFFE4,0x00D7,
0x0010,0xFFE5,0x00D8,0x0010,0xFFE6,0x00D9,0x0010,0xFFE7,0x00DA,
0x0010,0xFFE8,0x00E2,0x0010,0xFFE9,0x00E3,0x0010,0xFFEA,0x00E4,
0x0010,0xFFEB,0x00E5,0x0010,0xFFEC,0x00E6,0x0010,0xFFED,0x00E7,
0x0010,0xFFEE,0x00E8,0x0010,0xFFEF,0x00E9,0x0010,0xFFF0,0x00EA,
0x0010,0xFFF1,0x00F2,0x0010,0xFFF2,0x00F3,0x0010,0xFFF3,0x00F4,
0x0010,0xFFF4,0x00F5,0x0010,0xFFF5,0x00F6,0x0010,0xFFF6,0x00F7,
0x0010,0xFFF7,0x00F8,0x0010,0xFFF8,0x00F9,0x0010,0xFFF9,0x00FA
};


int bitmask[17] = {0x0000, 
				   0x0001, 0x0002, 0x0004, 0x0008, 
				   0x0010, 0x0020, 0x0040, 0x0080,
				   0x0100, 0x0200, 0x0400, 0x0800,
				   0x1000, 0x2000, 0x4000, 0x8000};

int unzigzag[64] = { 0,  1,  8, 16,  9,  2,  3, 10,
					 17, 24, 32, 25, 18, 11,  4,  5,
					 12, 19, 26, 33, 40, 48, 41, 34,
					 27, 20, 13,  6,  7, 14, 21, 28,
					 35, 42, 49, 56, 57, 50, 43, 36,
					 29, 22, 15, 23, 30, 37, 44, 51,
					 58, 59, 52, 45, 38, 31, 39, 46,
					 53, 60, 61, 54, 47, 55, 62, 63};

int lowmask[17] = {0x0000, 
				   0x0001, 0x0003, 0x0007, 0x000f, 
				   0x001f, 0x003f, 0x007f, 0x00ff, 
				   0x01ff, 0x03ff, 0x07ff, 0x0fff, 
				   0x1fff, 0x3fff, 0x7fff, 0xffff};
				   
vldvar_t hufvar; // Global variable


 
int InstallUvldTable(struct vlccode *, int, int, int *, int *);
void makevldtab();
/* global variable declarations */
//extern int unzigzag[];               /* jpgd_fun.c */



/* 
   InstallUvldTable(): Huffman table conversion utility for Universal VLD
   -- based on Minhua's read_cod_table()
*/
int InstallUvldTable(
  struct vlccode * ctable,  /* codebook structure */
  int nb_codes,                /* # codewords */
  int sign,                    /* polarity of leading cword bit */
  int *vldtab_p,               /* pointer to (output) UVLD table */
  int *ctltab_p)               /* pointer to (output) UVLD control table */
{
  int i, j;
  unsigned int len_max, len_max0;
  int num[12] = {1,2,4,8,16,32,64,128,256,512,1024,2048}; 
  struct control codectl[18]; /* codectl[40] */
  unsigned int i_min, i_max, pattern_num, interval;
  long Thred;
  unsigned int utemp;
  int temp;

  /* find the maximum codeword length */
  len_max=ctable[nb_codes-1].len;

  /* left-align the codeword and invert the bits */
  for (i=0;i<nb_codes;i++) {  /* BUG in the original code!!! (Yoo, 012300) */
	if (sign)
	  ctable[i].word = (1<<ctable[i].len) - ctable[i].word - 1;
    ctable[i].word = (ctable[i].word<<(len_max-ctable[i].len));
  } 

  /* sort ctable[] such that codewords are in increasing order */
  for (i=0;i<nb_codes;i++) {   /* other more efficient sorting routine? */
	i_min = i;
	for (j=i+1;j<nb_codes;j++) 
	  if (ctable[i].word > ctable[j].word)
		i_min = j;
	if (i_min != i) {
	  utemp = ctable[i].word;
	  ctable[i].word = ctable[i_min].word;
	  ctable[i_min].word = utemp;
	  utemp = ctable[i].len;
	  ctable[i].len = ctable[i_min].len;
	  ctable[i_min].len = utemp;
	  utemp = ctable[i].pattern;
	  ctable[i].pattern = ctable[i_min].pattern;
	  ctable[i_min].pattern = utemp;
	}
  }

  /* make VLD table and control table */
  i_min=0;i_max=0; 
  codectl[0].offset=0;
  codectl[0].th_lower=0;
  codectl[0].shift =0;
  interval =0;
  
  Thred=1;
  while (Thred<ctable[0].word) {
    interval++; 
    codectl[interval].offset=Thred;
    codectl[interval].shift=0;
    codectl[interval].th_lower=Thred;
    Thred <<=1; 
  } 

  if (Thred == ctable[0].word) {
    interval++;
    codectl[interval].offset=Thred;
    Thred <<=1; 
  } 

  do {
    while ((ctable[i_max].word<Thred)&&(i_max<nb_codes)) i_max++;
    codectl[interval].th_lower = Thred>>1;
    
    len_max0=0;
    for (i=i_min;i<i_max;i++)
      if (ctable[i].len>len_max0) len_max0 = ctable[i].len; 

    codectl[interval].shift = len_max-len_max0;

    pattern_num=0;
    for (i=i_min;i<i_max;i++) {
      if (i==0)
		for (j=0;j<codectl[interval].th_lower;j++)
		  *vldtab_p++ = 0;

      if (i==i_min) {
		temp = (ctable[i].word-codectl[interval].th_lower);
		temp >>= codectl[interval].shift;
        for (j=0;j<temp;j++) {
		  *vldtab_p++ = 0;
		  pattern_num++;
		}
	  }

	  temp = num[len_max-ctable[i].len-codectl[interval].shift];
      for (j=0;j<temp;j++) {
		*vldtab_p++ = (ctable[i].len<<11) | ctable[i].pattern;
		pattern_num++;
      } 
	  
      if (i<i_max-1) {
		temp = ((ctable[i+1].word-ctable[i].word)>>codectl[interval].shift)
		  - num[len_max-ctable[i].len-codectl[interval].shift];
		for (j=0;j<temp;j++) {
		  *vldtab_p++ = 0;
		  pattern_num++;
		}
      }
      if (i==i_max-1) {
		temp = ((Thred-ctable[i].word)>>codectl[interval].shift)
		  - num[len_max-ctable[i].len-codectl[interval].shift];
        for (j=0;j<temp;j++) {
		  *vldtab_p++ = 0;
		  pattern_num++;
		}
	  }
    }
	
    i_min = i_max;
	Thred <<= 1;
    interval++;
	codectl[interval].offset = codectl[interval-1].offset + pattern_num;
  } while (i_max<nb_codes);
 
  for (i=0;i<interval;i++) 
    codectl[i].offset -= codectl[i].th_lower >> codectl[i].shift;

  /* install VLD code control table */
  for (i=0;i<interval;i++)
	*ctltab_p++ = (codectl[i].shift<<11) | codectl[i].offset;

  return(len_max); /* return max codeword size */
} /* end of void InstallHuffmanDec() */


void makevldtab()
{ int *lenmax;
 int *vldtab, *ctltab;
vldtab=hufvar.UvldTabDC[0];
ctltab=hufvar.UvldCtlTabDC[0];
lenmax=hufvar.UvldLenMaxDC;
*lenmax = InstallUvldTable(hufftable, 12, 1, vldtab, ctltab);
 	
vldtab=hufvar.UvldTabDC[1];
ctltab=hufvar.UvldCtlTabDC[1];
lenmax=hufvar.UvldLenMaxDC+1;
 *lenmax=InstallUvldTable(hufftable+12, 12, 1, vldtab, ctltab);

vldtab=hufvar.UvldTabAC[0];
ctltab=hufvar.UvldCtlTabAC[0];
lenmax=hufvar.UvldLenMaxAC;
  *lenmax = InstallUvldTable(hufftable+24, 162, 1, vldtab, ctltab);

vldtab=hufvar.UvldTabAC[1];
ctltab=hufvar.UvldCtlTabAC[1];
lenmax=hufvar.UvldLenMaxAC+1;
*lenmax = InstallUvldTable(hufftable+186, 162, 1, vldtab, ctltab);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -