1 /*
2 * jstdhuff.c
3 *
4 * This file was part of the Independent JPEG Group's software:
5 * Copyright (C) 1991-1998, Thomas G. Lane.
6 * libjpeg-turbo Modifications:
7 * Copyright (C) 2013, D. R. Commander.
8 * For conditions of distribution and use, see the accompanying README file.
9 *
10 * This file contains routines to set the default Huffman tables, if they are
11 * not already set.
12 */
13
14 /*
15 * Huffman table setup routines
16 */
17
18 LOCAL(void)
add_huff_table(j_common_ptr cinfo,JHUFF_TBL ** htblptr,const UINT8 * bits,const UINT8 * val)19 add_huff_table (j_common_ptr cinfo,
20 JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
21 /* Define a Huffman table */
22 {
23 int nsymbols, len;
24
25 if (*htblptr == NULL)
26 *htblptr = jpeg_alloc_huff_table(cinfo);
27 else
28 return;
29
30 /* Copy the number-of-symbols-of-each-code-length counts */
31 MEMCOPY((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
32
33 /* Validate the counts. We do this here mainly so we can copy the right
34 * number of symbols from the val[] array, without risking marching off
35 * the end of memory. jchuff.c will do a more thorough test later.
36 */
37 nsymbols = 0;
38 for (len = 1; len <= 16; len++)
39 nsymbols += bits[len];
40 if (nsymbols < 1 || nsymbols > 256)
41 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
42
43 MEMCOPY((*htblptr)->huffval, val, nsymbols * sizeof(UINT8));
44 MEMZERO(&((*htblptr)->huffval[nsymbols]), (256 - nsymbols) * sizeof(UINT8));
45
46 /* Initialize sent_table FALSE so table will be written to JPEG file. */
47 (*htblptr)->sent_table = FALSE;
48 }
49
50
51 LOCAL(void)
std_huff_tables(j_common_ptr cinfo)52 std_huff_tables (j_common_ptr cinfo)
53 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
54 /* IMPORTANT: these are only valid for 8-bit data precision! */
55 {
56 JHUFF_TBL **dc_huff_tbl_ptrs, **ac_huff_tbl_ptrs;
57
58 static const UINT8 bits_dc_luminance[17] =
59 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
60 static const UINT8 val_dc_luminance[] =
61 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
62
63 static const UINT8 bits_dc_chrominance[17] =
64 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
65 static const UINT8 val_dc_chrominance[] =
66 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
67
68 static const UINT8 bits_ac_luminance[17] =
69 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
70 static const UINT8 val_ac_luminance[] =
71 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
72 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
73 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
74 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
75 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
76 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
77 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
78 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
79 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
80 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
81 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
82 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
83 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
84 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
85 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
86 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
87 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
88 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
89 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
90 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
91 0xf9, 0xfa };
92
93 static const UINT8 bits_ac_chrominance[17] =
94 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
95 static const UINT8 val_ac_chrominance[] =
96 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
97 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
98 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
99 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
100 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
101 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
102 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
103 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
104 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
105 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
106 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
107 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
108 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
109 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
110 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
111 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
112 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
113 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
114 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
115 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
116 0xf9, 0xfa };
117
118 if (cinfo->is_decompressor) {
119 dc_huff_tbl_ptrs = ((j_decompress_ptr)cinfo)->dc_huff_tbl_ptrs;
120 ac_huff_tbl_ptrs = ((j_decompress_ptr)cinfo)->ac_huff_tbl_ptrs;
121 } else {
122 dc_huff_tbl_ptrs = ((j_compress_ptr)cinfo)->dc_huff_tbl_ptrs;
123 ac_huff_tbl_ptrs = ((j_compress_ptr)cinfo)->ac_huff_tbl_ptrs;
124 }
125
126 add_huff_table(cinfo, &dc_huff_tbl_ptrs[0], bits_dc_luminance,
127 val_dc_luminance);
128 add_huff_table(cinfo, &ac_huff_tbl_ptrs[0], bits_ac_luminance,
129 val_ac_luminance);
130 add_huff_table(cinfo, &dc_huff_tbl_ptrs[1], bits_dc_chrominance,
131 val_dc_chrominance);
132 add_huff_table(cinfo, &ac_huff_tbl_ptrs[1], bits_ac_chrominance,
133 val_ac_chrominance);
134 }
135