blob: 24e9c554213b65a1b68655ed55a1a87c2422a62c [file] [log] [blame]
Ed Tanous93f987d2017-04-17 17:52:36 -07001
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6static unsigned char zigzag[64] = {
7 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42,
8 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53,
9 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60,
10 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63};
11
12static unsigned char dezigzag[64 + 15] = {
13 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40,
14 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36,
15 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61,
16 54, 47, 55, 62, 63,
17 // let corrupt input sample past end
18 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63};
19
20static unsigned char *std_luminance_qt;
21static unsigned char *std_chrominance_qt;
22
23// Standard Huffman tables (cf. JPEG standard section K.3) */
24
25static unsigned char std_dc_luminance_nrcodes[17] = {0, 0, 1, 5, 1, 1, 1, 1, 1,
26 1, 0, 0, 0, 0, 0, 0, 0};
27static unsigned char std_dc_luminance_values[12] = {0, 1, 2, 3, 4, 5,
28 6, 7, 8, 9, 10, 11};
29
30static unsigned char std_dc_chrominance_nrcodes[17] = {
31 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
32static unsigned char std_dc_chrominance_values[12] = {0, 1, 2, 3, 4, 5,
33 6, 7, 8, 9, 10, 11};
34
35static unsigned char std_ac_luminance_nrcodes[17] = {
36 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d};
37static unsigned char std_ac_luminance_values[162] = {
38 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
39 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
40 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72,
41 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
42 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45,
43 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
44 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75,
45 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
46 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3,
47 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
48 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
49 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
50 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4,
51 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa};
52
53static unsigned char std_ac_chrominance_nrcodes[17] = {
54 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77};
55static unsigned char std_ac_chrominance_values[162] = {
56 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41,
57 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
58 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1,
59 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
60 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44,
61 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
62 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74,
63 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
64 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a,
65 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
66 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
67 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
68 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
69 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa};
70
71unsigned short int DC_LUMINANCE_HUFFMANCODE[13 * 2] = {
72 /* 0 */ 0x0000, 0,
73 /* 1 */ 0x4000, 2,
74 /* 2 */ 0x6000, 3,
75 /* 3 */ 0x8000, 3,
76 /* 4 */ 0xA000, 3,
77 /* 5 */ 0xC000, 3,
78 /* 6 */ 0xE000, 3,
79 /* 7 */ 0xF000, 4,
80 /* 8 */ 0xF800, 5,
81 /* 9 */ 0xFC00, 6,
82 /* 10 */ 0xFE00, 7,
83 /* 11 */ 0xFF00, 8,
84 /* 12 */ 0xFFFF, 9,
85};
86
87unsigned short int DC_CHROMINANCE_HUFFMANCODE[13 * 2] = {
88 /* 0 */ 0x0000, 0,
89 /* 1 */ 0x4000, 2,
90 /* 2 */ 0x8000, 2,
91 /* 3 */ 0xC000, 2,
92 /* 4 */ 0xE000, 3,
93 /* 5 */ 0xF000, 4,
94 /* 6 */ 0xF800, 5,
95 /* 7 */ 0xFC00, 6,
96 /* 8 */ 0xFE00, 7,
97 /* 9 */ 0xFF00, 8,
98 /* 10 */ 0xFF80, 9,
99 /* 11 */ 0xFFC0, 10,
100 /* 12 */ 0xFFFF, 11,
101};
102
103unsigned short int AC_LUMINANCE_HUFFMANCODE[39 * 2] = {
104 /* 0 */ 0x0000, 0,
105 /* 1 */ 0x4000, 2,
106 /* 2 */ 0x8000, 2,
107 /* 3 */ 0xA000, 3,
108 /* 4 */ 0xB000, 4,
109 /* 5 */ 0xC000, 4,
110 /* 6 */ 0xD000, 4,
111 /* 7 */ 0xD800, 5,
112 /* 8 */ 0xE000, 5,
113 /* 9 */ 0xE800, 5,
114 /* 10 */ 0xEC00, 6,
115 /* 11 */ 0xF000, 6,
116 /* 12 */ 0xF200, 7,
117 /* 13 */ 0xF400, 7,
118 /* 14 */ 0xF600, 7,
119 /* 15 */ 0xF800, 7,
120 /* 16 */ 0xF900, 8,
121 /* 17 */ 0xFA00, 8,
122 /* 18 */ 0xFB00, 8,
123 /* 19 */ 0xFB80, 9,
124 /* 20 */ 0xFC00, 9,
125 /* 21 */ 0xFC80, 9,
126 /* 22 */ 0xFD00, 9,
127 /* 23 */ 0xFD80, 9,
128 /* 24 */ 0xFDC0, 10,
129 /* 25 */ 0xFE00, 10,
130 /* 26 */ 0xFE40, 10,
131 /* 27 */ 0xFE80, 10,
132 /* 28 */ 0xFEC0, 10,
133 /* 29 */ 0xFEE0, 11,
134 /* 30 */ 0xFF00, 11,
135 /* 31 */ 0xFF20, 11,
136 /* 32 */ 0xFF40, 11,
137 /* 33 */ 0xFF50, 12,
138 /* 34 */ 0xFF60, 12,
139 /* 35 */ 0xFF70, 12,
140 /* 36 */ 0xFF80, 12,
141 /* 37 */ 0xFF82, 15,
142 /* 38 */ 0xFFFF, 16,
143};
144
145unsigned short int AC_CHROMINANCE_HUFFMANCODE[45 * 2] = {
146 /* 0 */ 0x0000, 0,
147 /* 1 */ 0x4000, 2,
148 /* 2 */ 0x8000, 2,
149 /* 3 */ 0xA000, 3,
150 /* 4 */ 0xB000, 4,
151 /* 5 */ 0xC000, 4,
152 /* 6 */ 0xC800, 5,
153 /* 7 */ 0xD000, 5,
154 /* 8 */ 0xD800, 5,
155 /* 9 */ 0xE000, 5,
156 /* 10 */ 0xE400, 6,
157 /* 11 */ 0xE800, 6,
158 /* 12 */ 0xEC00, 6,
159 /* 13 */ 0xF000, 6,
160 /* 14 */ 0xF200, 7,
161 /* 15 */ 0xF400, 7,
162 /* 16 */ 0xF600, 7,
163 /* 17 */ 0xF700, 8,
164 /* 18 */ 0xF800, 8,
165 /* 19 */ 0xF900, 8,
166 /* 20 */ 0xFA00, 8,
167 /* 21 */ 0xFA80, 9,
168 /* 22 */ 0xFB00, 9,
169 /* 23 */ 0xFB80, 9,
170 /* 24 */ 0xFC00, 9,
171 /* 25 */ 0xFC80, 9,
172 /* 26 */ 0xFD00, 9,
173 /* 27 */ 0xFD80, 9,
174 /* 28 */ 0xFDC0, 10,
175 /* 29 */ 0xFE00, 10,
176 /* 30 */ 0xFE40, 10,
177 /* 31 */ 0xFE80, 10,
178 /* 32 */ 0xFEC0, 10,
179 /* 33 */ 0xFEE0, 11,
180 /* 34 */ 0xFF00, 11,
181 /* 35 */ 0xFF20, 11,
182 /* 36 */ 0xFF40, 11,
183 /* 37 */ 0xFF50, 12,
184 /* 38 */ 0xFF60, 12,
185 /* 39 */ 0xFF70, 12,
186 /* 40 */ 0xFF80, 12,
187 /* 41 */ 0xFF84, 14,
188 /* 42 */ 0xFF86, 15,
189 /* 43 */ 0xFF88, 15,
190 /* 44 */ 0xFFFF, 16,
191};
192
193//[100]=========================
194static unsigned char Tbl_100Y[64] = {
195 2, 1, 1, 2, 3, 5, 6, 7, 1, 1, 1, 2, 3, 7, 7, 6,
196 1, 1, 2, 3, 5, 7, 8, 7, 1, 2, 2, 3, 6, 10, 10, 7,
197 2, 2, 4, 7, 8, 13, 12, 9, 3, 4, 6, 8, 10, 13, 14, 11,
198 6, 8, 9, 10, 12, 15, 15, 12, 9, 11, 11, 12, 14, 12, 12, 12};
199static unsigned char Tbl_100UV[64] = {
200 3, 3, 4, 8, 18, 18, 18, 18, 3, 3, 4, 12, 18, 18, 18, 18,
201 4, 4, 10, 18, 18, 18, 18, 18, 8, 12, 18, 18, 18, 18, 18, 18,
202 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
203 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18};
204
205//[086]=========================
206static unsigned char Tbl_086Y[64] = {
207 3, 2, 1, 3, 4, 7, 9, 11, 2, 2, 2, 3, 4, 10, 11, 10,
208 2, 2, 3, 4, 7, 10, 12, 10, 2, 3, 4, 5, 9, 16, 15, 11,
209 3, 4, 6, 10, 12, 20, 19, 14, 4, 6, 10, 12, 15, 19, 21, 17,
210 9, 12, 14, 16, 19, 22, 22, 18, 13, 17, 17, 18, 21, 18, 19, 18};
211static unsigned char Tbl_086UV[64] = {
212 4, 5, 6, 13, 27, 27, 27, 27, 5, 5, 7, 18, 27, 27, 27, 27,
213 6, 7, 15, 27, 27, 27, 27, 27, 13, 18, 27, 27, 27, 27, 27, 27,
214 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
215 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27};
216
217//[071]=========================
218static unsigned char Tbl_071Y[64] = {
219 6, 4, 3, 6, 9, 15, 19, 22, 4, 4, 5, 7, 9, 21, 22, 20,
220 5, 4, 6, 9, 15, 21, 25, 21, 5, 6, 8, 10, 19, 32, 30, 23,
221 6, 8, 13, 21, 25, 40, 38, 28, 9, 13, 20, 24, 30, 39, 42, 34,
222 18, 24, 29, 32, 38, 45, 45, 37, 27, 34, 35, 36, 42, 37, 38, 37};
223static unsigned char Tbl_071UV[64] = {
224 9, 10, 13, 26, 55, 55, 55, 55, 10, 11, 14, 37, 55, 55, 55, 55,
225 13, 14, 31, 55, 55, 55, 55, 55, 26, 37, 55, 55, 55, 55, 55, 55,
226 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
227 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55};
228//[057]=========================
229static unsigned char Tbl_057Y[64] = {
230 9, 6, 5, 9, 13, 22, 28, 34, 6, 6, 7, 10, 14, 32, 33, 30,
231 7, 7, 9, 13, 22, 32, 38, 31, 7, 9, 12, 16, 28, 48, 45, 34,
232 10, 12, 20, 31, 38, 61, 57, 43, 13, 19, 30, 36, 45, 58, 63, 51,
233 27, 36, 43, 48, 57, 68, 67, 56, 40, 51, 53, 55, 63, 56, 57, 55};
234static unsigned char Tbl_057UV[64] = {
235 13, 14, 19, 38, 80, 80, 80, 80, 14, 17, 21, 53, 80, 80, 80, 80,
236 19, 21, 45, 80, 80, 80, 80, 80, 38, 53, 80, 80, 80, 80, 80, 80,
237 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
238 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80};
239
240//[043]=========================
241static unsigned char Tbl_043Y[64] = {
242 11, 7, 7, 11, 17, 28, 36, 43, 8, 8, 10, 13, 18, 41, 43, 39,
243 10, 9, 11, 17, 28, 40, 49, 40, 10, 12, 15, 20, 36, 62, 57, 44,
244 12, 15, 26, 40, 48, 78, 74, 55, 17, 25, 39, 46, 58, 74, 81, 66,
245 35, 46, 56, 62, 74, 86, 86, 72, 51, 66, 68, 70, 80, 71, 74, 71};
246static unsigned char Tbl_043UV[64] = {
247 18, 19, 26, 51, 108, 108, 108, 108, 19, 22, 28, 72, 108,
248 108, 108, 108, 26, 28, 61, 108, 108, 108, 108, 108, 51, 72,
249 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
250 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
251 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108};
252
253//[029]=========================
254static unsigned char Tbl_029Y[64] = {
255 14, 9, 9, 14, 21, 36, 46, 55, 10, 10, 12, 17, 23, 52, 54, 49,
256 12, 11, 14, 21, 36, 51, 62, 50, 12, 15, 19, 26, 46, 78, 72, 56,
257 16, 19, 33, 50, 61, 98, 93, 69, 21, 31, 49, 58, 73, 94, 102, 83,
258 44, 58, 70, 78, 93, 109, 108, 91, 65, 83, 86, 88, 101, 90, 93, 89};
259static unsigned char Tbl_029UV[64] = {
260 22, 24, 32, 63, 133, 133, 133, 133, 24, 28, 34, 88, 133,
261 133, 133, 133, 32, 34, 75, 133, 133, 133, 133, 133, 63, 88,
262 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
263 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
264 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133};
265
266//[014]=========================
267static unsigned char Tbl_014Y[64] = {
268 17, 12, 10, 17, 26, 43, 55, 66, 13, 13, 15, 20, 28, 63, 65, 60,
269 15, 14, 17, 26, 43, 62, 75, 61, 15, 18, 24, 31, 55, 95, 87, 67,
270 19, 24, 40, 61, 74, 119, 112, 84, 26, 38, 60, 70, 88, 113, 123, 100,
271 53, 70, 85, 95, 112, 132, 131, 110, 78, 100, 103, 107, 122, 109, 112, 108};
272static unsigned char Tbl_014UV[64] = {
273 27, 29, 39, 76, 160, 160, 160, 160, 29, 34, 42, 107, 160,
274 160, 160, 160, 39, 42, 91, 160, 160, 160, 160, 160, 76, 107,
275 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
276 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
277 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160};
278//[000]=========================
279static unsigned char Tbl_000Y[64] = {
280 20, 13, 12, 20, 30, 50, 63, 76, 15, 15, 17, 23, 32, 72, 75, 68,
281 17, 16, 20, 30, 50, 71, 86, 70, 17, 21, 27, 36, 63, 108, 100, 77,
282 22, 27, 46, 70, 85, 136, 128, 96, 30, 43, 68, 80, 101, 130, 141, 115,
283 61, 80, 97, 108, 128, 151, 150, 126, 90, 115, 118, 122, 140, 125, 128, 123};
284static unsigned char Tbl_000UV[64] = {
285 31, 33, 45, 88, 185, 185, 185, 185, 33, 39, 48, 123, 185,
286 185, 185, 185, 45, 48, 105, 185, 185, 185, 185, 185, 88, 123,
287 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
288 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
289 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185};
290
291typedef struct {
292 unsigned char Length[17]; // k =1-16 ; L[k] indicates the number of Huffman
293 // codes of length k
294 unsigned short int minor_code[17]; // indicates the value of the smallest
295 // Huffman code of length k
296 unsigned short int major_code[17]; // similar, but the highest code
297 unsigned char V[65536]; // V[k][j] = Value associated to the j-th Huffman
298 // code of length k
299 // High nibble = nr of previous 0 coefficients
300 // Low nibble = size (in bits) of the coefficient which will be taken from the
301 // data stream
302 unsigned char Len[65536];
303} Huffman_table;