JPEG标准中推荐的缺省huffman编码表(二)

2014-11-24 11:33:06 · 作者: · 浏览: 47
0x08,0x14,0x42,0x91,0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
0xf9,0xfa
};
/* the following are huffman tables derived from above DHT data by using algorithms
given in "ISO/IEC 10918-1, 1993(e), Annex C".
given: BITS (a 16 byte list giving the nr of codes for each code length from 1 to 16 )
HUFFVAL (a list of 8-bit symbol values, each of which is assigned a huffman
code, the symbol values are placed in the list in the order of increasing
code length. code lengths greater then 16 are not allowed.)
to create:
HUFFSIZE (a list of code lengths, the list size is the sum of 16 byte in BITS)
HUFFCODE (the huffman codes corresponding to those lengths in HUFFSIZE)
the following code fragment could be used to create HUFFSIZE table:
k = 0;
for(i = 0; i < 16; i ++)
for(j = 0; j < BITS[i]; j ++){
HUFFSIZE[k++] = i + 1;
}
huffsize_table_size = k;
the following code fragment could be used to create HUFFCODE table:
code = 0x00;
for(i = 0; i < huffsize_table_size; i ++){
if(i == 0 || (HUFFCODE[i] == HUFFCODE[i - 1])){
HUFFCODE[i] = code;
code ++;
}
else{
code <<= (HUFFSIZE[i] - HUFFSIZE[i - 1]);
HUFFCODE[i] = code;
code ++;
}
}
the following code fragment coould be used to check validity of the given BITS,
in case one need to check a given BITS:
bool check_bits(unsigned char bits[16]){
int i;
int c = 0xffff;
for(i = 0; i < 16; i ++){
printf("i=%d, c=%d\n", i, c);
if((c = c - bits[i] * pow(2, (15 - i))) < 0){
printf("error at %d, bits[%d]=%d\n", i, i, bits[i]);
return false;
}
}
return true;
}
in the following 4 generated huffman tables, the array index is symbol values (HUFFVAL),
while each element contains the code length (HUFFSIZE) and the code (HUFFCODE) for
the corresponding symbol value (also the "code word" is illustrated in the comments
for each element).
be noted that in AC tables, for those symbol values do not included the huffman table,
it's HUFFSIZE and HUFFCODE been set to 0.
*/
static HUFF_ENTRY s_lumin_dc[12] = {
{ 2, 0x0000}, /* 00 */
{ 3, 0x0002}, /* 010 */
{ 3, 0x0003}, /* 011 */
{ 3, 0x0004}, /* 100 */
{ 3, 0x0005}, /* 101 */
{ 3, 0x0006}, /* 110 */