blob: cbdf61c7b25416ce8066121afe3007615203d358 [file] [log] [blame]
DRCa1135062014-01-31 17:22:15 +00001/*
DRCbf043162015-10-09 20:02:31 -05002 * 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.
DRC7e3acc02015-10-10 10:25:46 -05008 * For conditions of distribution and use, see the accompanying README.ijg
9 * file.
DRCbf043162015-10-09 20:02:31 -050010 *
11 * This file contains routines to set the default Huffman tables, if they are
12 * not already set.
13 */
DRCa1135062014-01-31 17:22:15 +000014
15/*
16 * Huffman table setup routines
17 */
18
19LOCAL(void)
20add_huff_table (j_common_ptr cinfo,
DRCe5eaf372014-05-09 18:00:32 +000021 JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
DRCa1135062014-01-31 17:22:15 +000022/* Define a Huffman table */
23{
24 int nsymbols, len;
25
26 if (*htblptr == NULL)
27 *htblptr = jpeg_alloc_huff_table(cinfo);
28 else
29 return;
30
31 /* Copy the number-of-symbols-of-each-code-length counts */
DRC5de454b2014-05-18 19:04:03 +000032 MEMCOPY((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
DRCa1135062014-01-31 17:22:15 +000033
34 /* Validate the counts. We do this here mainly so we can copy the right
35 * number of symbols from the val[] array, without risking marching off
36 * the end of memory. jchuff.c will do a more thorough test later.
37 */
38 nsymbols = 0;
39 for (len = 1; len <= 16; len++)
40 nsymbols += bits[len];
41 if (nsymbols < 1 || nsymbols > 256)
42 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
43
DRC5de454b2014-05-18 19:04:03 +000044 MEMCOPY((*htblptr)->huffval, val, nsymbols * sizeof(UINT8));
DRCa1135062014-01-31 17:22:15 +000045
46 /* Initialize sent_table FALSE so table will be written to JPEG file. */
47 (*htblptr)->sent_table = FALSE;
48}
49
50
51LOCAL(void)
52std_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 };
DRCcc0733a2014-02-01 06:17:31 +000062
DRCa1135062014-01-31 17:22:15 +000063 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 };
DRCcc0733a2014-02-01 06:17:31 +000067
DRCa1135062014-01-31 17:22:15 +000068 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 };
DRCcc0733a2014-02-01 06:17:31 +000092
DRCa1135062014-01-31 17:22:15 +000093 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}