📄 vld.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 + -