History

add Huffman optimization code

lieff committed 8 years ago

Commit f8281861 parent 37a53d42 files · +1854 −0Browse files

Unified · Split

2 files
  1. huffopt/HUFFCODE +1506 −0
  2. huffopt/huffopt.c +348 −0
huffopt/HUFFCODE+1506−0
@@ -0,0 +1,1506 @@
1#########################################################################
2# Huffman code table for ISO/MPEG Layer 3 Coding #
3# Syntax: table head: #
4# .table number xlen ylen linbits #
5# .referenz referenz table number (if no table data) #
6# #
7# table data: #
8#########################################################################
9
10.table 0 0 0 0
11#val hlen hcod
12
13.table 1 2 2 0
14#x y hlen hcod
15 0 0 1 1
16 0 1 3 001
17 1 0 2 01
18 1 1 3 000
19
20.table 2 3 3 0
21 0 0 1 1
22 0 1 3 010
23 0 2 6 000001
24 1 0 3 011
25 1 1 3 001
26 1 2 5 00001
27 2 0 5 00011
28 2 1 5 00010
29 2 2 6 000000
30
31.table 3 3 3 0
32 0 0 2 11
33 0 1 2 10
34 0 2 6 000001
35 1 0 3 001
36 1 1 2 01
37 1 2 5 00001
38 2 0 5 00011
39 2 1 5 00010
40 2 2 6 000000
41
42.table 4 0 0 0
43#not usedwanz
44
45.table 5 4 4 0
46 0 0 1 1
47 0 1 3 010
48 0 2 6 000110
49 0 3 7 0000101
50 1 0 3 011
51 1 1 3 001
52 1 2 6 000100
53 1 3 7 0000100
54 2 0 6 000111
55 2 1 6 000101
56 2 2 7 0000111
57 2 3 8 00000001
58 3 0 7 0000110
59 3 1 6 000001
60 3 2 7 0000001
61 3 3 8 00000000
62
63.table 6 4 4 0
64 0 0 3 111
65 0 1 3 011
66 0 2 5 00101
67 0 3 7 0000001
68 1 0 3 110
69 1 1 2 10
70 1 2 4 0011
71 1 3 5 00010
72 2 0 4 0101
73 2 1 4 0100
74 2 2 5 00100
75 2 3 6 000001
76 3 0 6 000011
77 3 1 5 00011
78 3 2 6 000010
79 3 3 7 0000000
80
81.table 7 6 6 0
82 0 0 1 1
83 0 1 3 010
84 0 2 6 001010
85 0 3 8 00010011
86 0 4 8 00010000
87 0 5 9 000001010
88 1 0 3 011
89 1 1 4 0011
90 1 2 6 000111
91 1 3 7 0001010
92 1 4 7 0000101
93 1 5 8 00000011
94 2 0 6 001011
95 2 1 5 00100
96 2 2 7 0001101
97 2 3 8 00010001
98 2 4 8 00001000
99 2 5 9 000000100
100 3 0 7 0001100
101 3 1 7 0001011
102 3 2 8 00010010
103 3 3 9 000001111
104 3 4 9 000001011
105 3 5 9 000000010
106 4 0 7 0000111
107 4 1 7 0000110
108 4 2 8 00001001
109 4 3 9 000001110
110 4 4 9 000000011
111 4 5 10 0000000001
112 5 0 8 00000110
113 5 1 8 00000100
114 5 2 9 000000101
115 5 3 10 0000000011
116 5 4 10 0000000010
117 5 5 10 0000000000
118
119.table 8 6 6 0
120 0 0 2 11
121 0 1 3 100
122 0 2 6 000110
123 0 3 8 00010010
124 0 4 8 00001100
125 0 5 9 000000101
126 1 0 3 101
127 1 1 2 01
128 1 2 4 0010
129 1 3 8 00010000
130 1 4 8 00001001
131 1 5 8 00000011
132 2 0 6 000111
133 2 1 4 0011
134 2 2 6 000101
135 2 3 8 00001110
136 2 4 8 00000111
137 2 5 9 000000011
138 3 0 8 00010011
139 3 1 8 00010001
140 3 2 8 00001111
141 3 3 9 000001101
142 3 4 9 000001010
143 3 5 10 0000000100
144 4 0 8 00001101
145 4 1 7 0000101
146 4 2 8 00001000
147 4 3 9 000001011
148 4 4 10 0000000101
149 4 5 10 0000000001
150 5 0 9 000001100
151 5 1 8 00000100
152 5 2 9 000000100
153 5 3 9 000000001
154 5 4 11 00000000001
155 5 5 11 00000000000
156
157.table 9 6 6 0
158 0 0 3 111
159 0 1 3 101
160 0 2 5 01001
161 0 3 6 001110
162 0 4 8 00001111
163 0 5 9 000000111
164 1 0 3 110
165 1 1 3 100
166 1 2 4 0101
167 1 3 5 00101
168 1 4 6 000110
169 1 5 8 00000111
170 2 0 4 0111
171 2 1 4 0110
172 2 2 5 01000
173 2 3 6 001000
174 2 4 7 0001000
175 2 5 8 00000101
176 3 0 6 001111
177 3 1 5 00110
178 3 2 6 001001
179 3 3 7 0001010
180 3 4 7 0000101
181 3 5 8 00000001
182 4 0 7 0001011
183 4 1 6 000111
184 4 2 7 0001001
185 4 3 7 0000110
186 4 4 8 00000100
187 4 5 9 000000001
188 5 0 8 00001110
189 5 1 7 0000100
190 5 2 8 00000110
191 5 3 8 00000010
192 5 4 9 000000110
193 5 5 9 000000000
194
195.table 10 8 8 0
196 0 0 1 1
197 0 1 3 010
198 0 2 6 001010
199 0 3 8 00010111
200 0 4 9 000100011
201 0 5 9 000011110
202 0 6 9 000001100
203 0 7 10 0000010001
204 1 0 3 011
205 1 1 4 0011
206 1 2 6 001000
207 1 3 7 0001100
208 1 4 8 00010010
209 1 5 9 000010101
210 1 6 8 00001100
211 1 7 8 00000111
212 2 0 6 001011
213 2 1 6 001001
214 2 2 7 0001111
215 2 3 8 00010101
216 2 4 9 000100000
217 2 5 10 0000101000
218 2 6 9 000010011
219 2 7 9 000000110
220 3 0 7 0001110
221 3 1 7 0001101
222 3 2 8 00010110
223 3 3 9 000100010
224 3 4 10 0000101110
225 3 5 10 0000010111
226 3 6 9 000010010
227 3 7 10 0000000111
228 4 0 8 00010100
229 4 1 8 00010011
230 4 2 9 000100001
231 4 3 10 0000101111
232 4 4 10 0000011011
233 4 5 10 0000010110
234 4 6 10 0000001001
235 4 7 10 0000000011
236 5 0 9 000011111
237 5 1 9 000010110
238 5 2 10 0000101001
239 5 3 10 0000011010
240 5 4 11 00000010101
241 5 5 11 00000010100
242 5 6 10 0000000101
243 5 7 11 00000000011
244 6 0 8 00001110
245 6 1 8 00001101
246 6 2 9 000001010
247 6 3 10 0000001011
248 6 4 10 0000010000
249 6 5 10 0000000110
250 6 6 11 00000000101
251 6 7 11 00000000001
252 7 0 9 000001001
253 7 1 8 00001000
254 7 2 9 000000111
255 7 3 10 0000001000
256 7 4 10 0000000100
257 7 5 11 00000000100
258 7 6 11 00000000010
259 7 7 11 00000000000
260
261.table 11 8 8 0
262 0 0 2 11
263 0 1 3 100
264 0 2 5 01010
265 0 3 7 0011000
266 0 4 8 00100010
267 0 5 9 000100001
268 0 6 8 00010101
269 0 7 9 000001111
270 1 0 3 101
271 1 1 3 011
272 1 2 4 0100
273 1 3 6 001010
274 1 4 8 00100000
275 1 5 8 00010001
276 1 6 7 0001011
277 1 7 8 00001010
278 2 0 5 01011
279 2 1 5 00111
280 2 2 6 001101
281 2 3 7 0010010
282 2 4 8 00011110
283 2 5 9 000011111
284 2 6 8 00010100
285 2 7 8 00000101
286 3 0 7 0011001
287 3 1 6 001011
288 3 2 7 0010011
289 3 3 9 000111011
290 3 4 8 00011011
291 3 5 10 0000010010
292 3 6 8 00001100
293 3 7 9 000000101
294 4 0 8 00100011
295 4 1 8 00100001
296 4 2 8 00011111
297 4 3 9 000111010
298 4 4 9 000011110
299 4 5 10 0000010000
300 4 6 9 000000111
301 4 7 10 0000000101
302 5 0 8 00011100
303 5 1 8 00011010
304 5 2 9 000100000
305 5 3 10 0000010011
306 5 4 10 0000010001
307 5 5 11 00000001111
308 5 6 10 0000001000
309 5 7 11 00000001110
310 6 0 8 00001110
311 6 1 7 0001100
312 6 2 7 0001001
313 6 3 8 00001101
314 6 4 9 000001110
315 6 5 10 0000001001
316 6 6 10 0000000100
317 6 7 10 0000000001
318 7 0 8 00001011
319 7 1 7 0000100
320 7 2 8 00000110
321 7 3 9 000000110
322 7 4 10 0000000110
323 7 5 10 0000000011
324 7 6 10 0000000010
325 7 7 10 0000000000
326
327.table 12 8 8 0
328 0 0 4 1001
329 0 1 3 110
330 0 2 5 10000
331 0 3 7 0100001
332 0 4 8 00101001
333 0 5 9 000100111
334 0 6 9 000100110
335 0 7 9 000011010
336 1 0 3 111
337 1 1 3 101
338 1 2 4 0110
339 1 3 5 01001
340 1 4 7 0010111
341 1 5 7 0010000
342 1 6 8 00011010
343 1 7 8 00001011
344 2 0 5 10001
345 2 1 4 0111
346 2 2 5 01011
347 2 3 6 001110
348 2 4 7 0010101
349 2 5 8 00011110
350 2 6 7 0001010
351 2 7 8 00000111
352 3 0 6 010001
353 3 1 5 01010
354 3 2 6 001111
355 3 3 6 001100
356 3 4 7 0010010
357 3 5 8 00011100
358 3 6 8 00001110
359 3 7 8 00000101
360 4 0 7 0100000
361 4 1 6 001101
362 4 2 7 0010110
363 4 3 7 0010011
364 4 4 8 00010010
365 4 5 8 00010000
366 4 6 8 00001001
367 4 7 9 000000101
368 5 0 8 00101000
369 5 1 7 0010001
370 5 2 8 00011111
371 5 3 8 00011101
372 5 4 8 00010001
373 5 5 9 000001101
374 5 6 8 00000100
375 5 7 9 000000010
376 6 0 8 00011011
377 6 1 7 0001100
378 6 2 7 0001011
379 6 3 8 00001111
380 6 4 8 00001010
381 6 5 9 000000111
382 6 6 9 000000100
383 6 7 10 0000000001
384 7 0 9 000011011
385 7 1 8 00001100
386 7 2 8 00001000
387 7 3 9 000001100
388 7 4 9 000000110
389 7 5 9 000000011
390 7 6 9 000000001
391 7 7 10 0000000000
392
393.table 13 16 16 0
394 0 0 1 1
395 0 1 4 0101
396 0 2 6 001110
397 0 3 7 0010101
398 0 4 8 00100010
399 0 5 9 000110011
400 0 6 9 000101110
401 0 7 10 0001000111
402 0 8 9 000101010
403 0 9 10 0000110100
404 0 10 11 00001000100
405 0 11 11 00000110100
406 0 12 12 000001000011
407 0 13 12 000000101100
408 0 14 13 0000000101011
409 0 15 13 0000000010011
410 1 0 3 011
411 1 1 4 0100
412 1 2 6 001100
413 1 3 7 0010011
414 1 4 8 00011111
415 1 5 8 00011010
416 1 6 9 000101100
417 1 7 9 000100001
418 1 8 9 000011111
419 1 9 9 000011000
420 1 10 10 0000100000
421 1 11 10 0000011000
422 1 12 11 00000011111
423 1 13 12 000000100011
424 1 14 12 000000010110
425 1 15 12 000000001110
426 2 0 6 001111
427 2 1 6 001101
428 2 2 7 0010111
429 2 3 8 00100100
430 2 4 9 000111011
431 2 5 9 000110001
432 2 6 10 0001001101
433 2 7 10 0001000001
434 2 8 9 000011101
435 2 9 10 0000101000
436 2 10 10 0000011110
437 2 11 11 00000101000
438 2 12 11 00000011011
439 2 13 12 000000100001
440 2 14 13 0000000101010
441 2 15 13 0000000010000
442 3 0 7 0010110
443 3 1 7 0010100
444 3 2 8 00100101
445 3 3 9 000111101
446 3 4 9 000111000
447 3 5 10 0001001111
448 3 6 10 0001001001
449 3 7 10 0001000000
450 3 8 10 0000101011
451 3 9 11 00001001100
452 3 10 11 00000111000
453 3 11 11 00000100101
454 3 12 11 00000011010
455 3 13 12 000000011111
456 3 14 13 0000000011001
457 3 15 13 0000000001110
458 4 0 8 00100011
459 4 1 7 0010000
460 4 2 9 000111100
461 4 3 9 000111001
462 4 4 10 0001100001
463 4 5 10 0001001011
464 4 6 11 00001110010
465 4 7 11 00001011011
466 4 8 10 0000110110
467 4 9 11 00001001001
468 4 10 11 00000110111
469 4 11 12 000000101001
470 4 12 12 000000110000
471 4 13 13 0000000110101
472 4 14 13 0000000010111
473 4 15 14 00000000011000
474 5 0 9 000111010
475 5 1 8 00011011
476 5 2 9 000110010
477 5 3 10 0001100000
478 5 4 10 0001001100
479 5 5 10 0001000110
480 5 6 11 00001011101
481 5 7 11 00001010100
482 5 8 11 00001001101
483 5 9 11 00000111010
484 5 10 12 000001001111
485 5 11 11 00000011101
486 5 12 13 0000001001010
487 5 13 13 0000000110001
488 5 14 14 00000000101001
489 5 15 14 00000000010001
490 6 0 9 000101111
491 6 1 9 000101101
492 6 2 10 0001001110
493 6 3 10 0001001010
494 6 4 11 00001110011
495 6 5 11 00001011110
496 6 6 11 00001011010
497 6 7 11 00001001111
498 6 8 11 00001000101
499 6 9 12 000001010011
500 6 10 12 000001000111
501 6 11 12 000000110010
502 6 12 13 0000000111011
503 6 13 13 0000000100110
504 6 14 14 00000000100100
505 6 15 14 00000000001111
506 7 0 10 0001001000
507 7 1 9 000100010
508 7 2 10 0000111000
509 7 3 11 00001011111
510 7 4 11 00001011100
511 7 5 11 00001010101
512 7 6 12 000001011011
513 7 7 12 000001011010
514 7 8 12 000001010110
515 7 9 12 000001001001
516 7 10 13 0000001001101
517 7 11 13 0000001000001
518 7 12 13 0000000110011
519 7 13 14 00000000101100
520 7 14 16 0000000000101011
521 7 15 16 0000000000101010
522 8 0 9 000101011
523 8 1 8 00010100
524 8 2 9 000011110
525 8 3 10 0000101100
526 8 4 10 0000110111
527 8 5 11 00001001110
528 8 6 11 00001001000
529 8 7 12 000001010111
530 8 8 12 000001001110
531 8 9 12 000000111101
532 8 10 12 000000101110
533 8 11 13 0000000110110
534 8 12 13 0000000100101
535 8 13 14 00000000011110
536 8 14 15 000000000010100
537 8 15 15 000000000010000
538 9 0 10 0000110101
539 9 1 9 000011001
540 9 2 10 0000101001
541 9 3 10 0000100101
542 9 4 11 00000101100
543 9 5 11 00000111011
544 9 6 11 00000110110
545 9 7 13 0000001010001
546 9 8 12 000001000010
547 9 9 13 0000001001100
548 9 10 13 0000000111001
549 9 11 14 00000000110110
550 9 12 14 00000000100101
551 9 13 14 00000000010010
552 9 14 16 0000000000100111
553 9 15 15 000000000001011
55410 0 10 0000100011
55510 1 10 0000100001
55610 2 10 0000011111
55710 3 11 00000111001
55810 4 11 00000101010
55910 5 12 000001010010
56010 6 12 000001001000
56110 7 13 0000001010000
56210 8 12 000000101111
56310 9 13 0000000111010
56410 10 14 00000000110111
56510 11 13 0000000010101
56610 12 14 00000000010110
56710 13 15 000000000011010
56810 14 16 0000000000100110
56910 15 17 00000000000010110
57011 0 11 00000110101
57111 1 10 0000011001
57211 2 10 0000010111
57311 3 11 00000100110
57411 4 12 000001000110
57511 5 12 000000111100
57611 6 12 000000110011
57711 7 12 000000100100
57811 8 13 0000000110111
57911 9 13 0000000011010
58011 10 13 0000000100010
58111 11 14 00000000010111
58211 12 15 000000000011011
58311 13 15 000000000001110
58411 14 15 000000000001001
58511 15 16 0000000000000111
58612 0 11 00000100010
58712 1 11 00000100000
58812 2 11 00000011100
58912 3 12 000000100111
59012 4 12 000000110001
59112 5 13 0000001001011
59212 6 12 000000011110
59312 7 13 0000000110100
59412 8 14 00000000110000
59512 9 14 00000000101000
59612 10 15 000000000110100
59712 11 15 000000000011100
59812 12 15 000000000010010
59912 13 16 0000000000010001
60012 14 16 0000000000001001
60112 15 16 0000000000000101
60213 0 12 000000101101
60313 1 11 00000010101
60413 2 12 000000100010
60513 3 13 0000001000000
60613 4 13 0000000111000
60713 5 13 0000000110010
60813 6 14 00000000110001
60913 7 14 00000000101101
61013 8 14 00000000011111
61113 9 14 00000000010011
61213 10 14 00000000001100
61313 11 15 000000000001111
61413 12 16 0000000000001010
61513 13 15 000000000000111
61613 14 16 0000000000000110
61713 15 16 0000000000000011
61814 0 13 0000000110000
61914 1 12 000000010111
62014 2 12 000000010100
62114 3 13 0000000100111
62214 4 13 0000000100100
62314 5 13 0000000100011
62414 6 15 000000000110101
62514 7 14 00000000010101
62614 8 14 00000000010000
62714 9 17 00000000000010111
62814 10 15 000000000001101
62914 11 15 000000000001010
63014 12 15 000000000000110
63114 13 17 00000000000000001
63214 14 16 0000000000000100
63314 15 16 0000000000000010
63415 0 12 000000010000
63515 1 12 000000001111
63615 2 13 0000000010001
63715 3 14 00000000011011
63815 4 14 00000000011001
63915 5 14 00000000010100
64015 6 15 000000000011101
64115 7 14 00000000001011
64215 8 15 000000000010001
64315 9 15 000000000001100
64415 10 16 0000000000010000
64515 11 16 0000000000001000
64615 12 19 0000000000000000001
64715 13 18 000000000000000001
64815 14 19 0000000000000000000
64915 15 16 0000000000000001
650
651.table 14 0 0 0
652#not used
653
654.table 15 16 16 0
655 0 0 3 111
656 0 1 4 1100
657 0 2 5 10010
658 0 3 7 0110101
659 0 4 7 0101111
660 0 5 8 01001100
661 0 6 9 001111100
662 0 7 9 001101100
663 0 8 9 001011001
664 0 9 10 0001111011
665 0 10 10 0001101100
666 0 11 11 00001110111
667 0 12 11 00001101011
668 0 13 11 00001010001
669 0 14 12 000001111010
670 0 15 13 0000000111111
671 1 0 4 1101
672 1 1 3 101
673 1 2 5 10000
674 1 3 6 011011
675 1 4 7 0101110
676 1 5 7 0100100
677 1 6 8 00111101
678 1 7 8 00110011
679 1 8 8 00101010
680 1 9 9 001000110
681 1 10 9 000110100
682 1 11 10 0001010011
683 1 12 10 0001000001
684 1 13 10 0000101001
685 1 14 11 00000111011
686 1 15 11 00000100100
687 2 0 5 10011
688 2 1 5 10001
689 2 2 5 01111
690 2 3 6 011000
691 2 4 7 0101001
692 2 5 7 0100010
693 2 6 8 00111011
694 2 7 8 00110000
695 2 8 8 00101000
696 2 9 9 001000000
697 2 10 9 000110010
698 2 11 10 0001001110
699 2 12 10 0000111110
700 2 13 11 00001010000
701 2 14 11 00000111000
702 2 15 11 00000100001
703 3 0 6 011101
704 3 1 6 011100
705 3 2 6 011001
706 3 3 7 0101011
707 3 4 7 0100111
708 3 5 8 00111111
709 3 6 8 00110111
710 3 7 9 001011101
711 3 8 9 001001100
712 3 9 9 000111011
713 3 10 10 0001011101
714 3 11 10 0001001000
715 3 12 10 0000110110
716 3 13 11 00001001011
717 3 14 11 00000110010
718 3 15 11 00000011101
719 4 0 7 0110100
720 4 1 6 010110
721 4 2 7 0101010
722 4 3 7 0101000
723 4 4 8 01000011
724 4 5 8 00111001
725 4 6 9 001011111
726 4 7 9 001001111
727 4 8 9 001001000
728 4 9 9 000111001
729 4 10 10 0001011001
730 4 11 10 0001000101
731 4 12 10 0000110001
732 4 13 11 00001000010
733 4 14 11 00000101110
734 4 15 11 00000011011
735 5 0 8 01001101
736 5 1 7 0100101
737 5 2 7 0100011
738 5 3 8 01000010
739 5 4 8 00111010
740 5 5 8 00110100
741 5 6 9 001011011
742 5 7 9 001001010
743 5 8 9 000111110
744 5 9 9 000110000
745 5 10 10 0001001111
746 5 11 10 0000111111
747 5 12 11 00001011010
748 5 13 11 00000111110
749 5 14 11 00000101000
750 5 15 12 000000100110
751 6 0 9 001111101
752 6 1 7 0100000
753 6 2 8 00111100
754 6 3 8 00111000
755 6 4 8 00110010
756 6 5 9 001011100
757 6 6 9 001001110
758 6 7 9 001000001
759 6 8 9 000110111
760 6 9 10 0001010111
761 6 10 10 0001000111
762 6 11 10 0000110011
763 6 12 11 00001001001
764 6 13 11 00000110011
765 6 14 12 000001000110
766 6 15 12 000000011110
767 7 0 9 001101101
768 7 1 8 00110101
769 7 2 8 00110001
770 7 3 9 001011110
771 7 4 9 001011000
772 7 5 9 001001011
773 7 6 9 001000010
774 7 7 10 0001111010
775 7 8 10 0001011011
776 7 9 10 0001001001
777 7 10 10 0000111000
778 7 11 10 0000101010
779 7 12 11 00001000000
780 7 13 11 00000101100
781 7 14 11 00000010101
782 7 15 12 000000011001
783 8 0 9 001011010
784 8 1 8 00101011
785 8 2 8 00101001
786 8 3 9 001001101
787 8 4 9 001001001
788 8 5 9 000111111
789 8 6 9 000111000
790 8 7 10 0001011100
791 8 8 10 0001001101
792 8 9 10 0001000010
793 8 10 10 0000101111
794 8 11 11 00001000011
795 8 12 11 00000110000
796 8 13 12 000000110101
797 8 14 12 000000100100
798 8 15 12 000000010100
799 9 0 9 001000111
800 9 1 8 00100010
801 9 2 9 001000011
802 9 3 9 000111100
803 9 4 9 000111010
804 9 5 9 000110001
805 9 6 10 0001011000
806 9 7 10 0001001100
807 9 8 10 0001000011
808 9 9 11 00001101010
809 9 10 11 00001000111
810 9 11 11 00000110110
811 9 12 11 00000100110
812 9 13 12 000000100111
813 9 14 12 000000010111
814 9 15 12 000000001111
81510 0 10 0001101101
81610 1 9 000110101
81710 2 9 000110011
81810 3 9 000101111
81910 4 10 0001011010
82010 5 10 0001010010
82110 6 10 0000111010
82210 7 10 0000111001
82310 8 10 0000110000
82410 9 11 00001001000
82510 10 11 00000111001
82610 11 11 00000101001
82710 12 11 00000010111
82810 13 12 000000011011
82910 14 13 0000000111110
83010 15 12 000000001001
83111 0 10 0001010110
83211 1 9 000101010
83311 2 9 000101000
83411 3 9 000100101
83511 4 10 0001000110
83611 5 10 0001000000
83711 6 10 0000110100
83811 7 10 0000101011
83911 8 11 00001000110
84011 9 11 00000110111
84111 10 11 00000101010
84211 11 11 00000011001
84311 12 12 000000011101
84411 13 12 000000010010
84511 14 12 000000001011
84611 15 13 0000000001011
84712 0 11 00001110110
84812 1 10 0001000100
84912 2 9 000011110
85012 3 10 0000110111
85112 4 10 0000110010
85212 5 10 0000101110
85312 6 11 00001001010
85412 7 11 00001000001
85512 8 11 00000110001
85612 9 11 00000100111
85712 10 11 00000011000
85812 11 11 00000010000
85912 12 12 000000010110
86012 13 12 000000001101
86112 14 13 0000000001110
86212 15 13 0000000000111
86313 0 11 00001011011
86413 1 10 0000101100
86513 2 10 0000100111
86613 3 10 0000100110
86713 4 10 0000100010
86813 5 11 00000111111
86913 6 11 00000110100
87013 7 11 00000101101
87113 8 11 00000011111
87213 9 12 000000110100
87313 10 12 000000011100
87413 11 12 000000010011
87513 12 12 000000001110
87613 13 12 000000001000
87713 14 13 0000000001001
87813 15 13 0000000000011
87914 0 12 000001111011
88014 1 11 00000111100
88114 2 11 00000111010
88214 3 11 00000110101
88314 4 11 00000101111
88414 5 11 00000101011
88514 6 11 00000100000
88614 7 11 00000010110
88714 8 12 000000100101
88814 9 12 000000011000
88914 10 12 000000010001
89014 11 12 000000001100
89114 12 13 0000000001111
89214 13 13 0000000001010
89314 14 12 000000000010
89414 15 13 0000000000001
89515 0 12 000001000111
89615 1 11 00000100101
89715 2 11 00000100010
89815 3 11 00000011110
89915 4 11 00000011100
90015 5 11 00000010100
90115 6 11 00000010001
90215 7 12 000000011010
90315 8 12 000000010101
90415 9 12 000000010000
90515 10 12 000000001010
90615 11 12 000000000110
90715 12 13 0000000001000
90815 13 13 0000000000110
90915 14 13 0000000000010
91015 15 13 0000000000000
911
912.table 16 16 16 1
913 0 0 1 1
914 0 1 4 0101
915 0 2 6 001110
916 0 3 8 00101100
917 0 4 9 001001010
918 0 5 9 000111111
919 0 6 10 0001101110
920 0 7 10 0001011101
921 0 8 11 00010101100
922 0 9 11 00010010101
923 0 10 11 00010001010
924 0 11 12 000011110010
925 0 12 12 000011100001
926 0 13 12 000011000011
927 0 14 13 0000101111000
928 0 15 9 000010001
929 1 0 3 011
930 1 1 4 0100
931 1 2 6 001100
932 1 3 7 0010100
933 1 4 8 00100011
934 1 5 9 000111110
935 1 6 9 000110101
936 1 7 9 000101111
937 1 8 10 0001010011
938 1 9 10 0001001011
939 1 10 10 0001000100
940 1 11 11 00001110111
941 1 12 12 000011001001
942 1 13 11 00001101011
943 1 14 12 000011001111
944 1 15 8 00001001
945 2 0 6 001111
946 2 1 6 001101
947 2 2 7 0010111
948 2 3 8 00100110
949 2 4 9 001000011
950 2 5 9 000111010
951 2 6 10 0001100111
952 2 7 10 0001011010
953 2 8 11 00010100001
954 2 9 10 0001001000
955 2 10 11 00001111111
956 2 11 11 00001110101
957 2 12 11 00001101110
958 2 13 12 000011010001
959 2 14 12 000011001110
960 2 15 9 000010000
961 3 0 8 00101101
962 3 1 7 0010101
963 3 2 8 00100111
964 3 3 9 001000101
965 3 4 9 001000000
966 3 5 10 0001110010
967 3 6 10 0001100011
968 3 7 10 0001010111
969 3 8 11 00010011110
970 3 9 11 00010001100
971 3 10 12 000011111100
972 3 11 12 000011010100
973 3 12 12 000011000111
974 3 13 13 0000110000011
975 3 14 13 0000101101101
976 3 15 10 0000011010
977 4 0 9 001001011
978 4 1 8 00100100
979 4 2 9 001000100
980 4 3 9 001000001
981 4 4 10 0001110011
982 4 5 10 0001100101
983 4 6 11 00010110011
984 4 7 11 00010100100
985 4 8 11 00010011011
986 4 9 12 000100001000
987 4 10 12 000011110110
988 4 11 12 000011100010
989 4 12 13 0000110001011
990 4 13 13 0000101111110
991 4 14 13 0000101101010
992 4 15 9 000001001
993 5 0 9 001000010
994 5 1 8 00011110
995 5 2 9 000111011
996 5 3 9 000111000
997 5 4 10 0001100110
998 5 5 11 00010111001
999 5 6 11 00010101101
1000 5 7 12 000100001001
1001 5 8 11 00010001110
1002 5 9 12 000011111101
1003 5 10 12 000011101000
1004 5 11 13 0000110010000
1005 5 12 13 0000110000100
1006 5 13 13 0000101111010
1007 5 14 14 00000110111101
1008 5 15 10 0000010000
1009 6 0 10 0001101111
1010 6 1 9 000110110
1011 6 2 9 000110100
1012 6 3 10 0001100100
1013 6 4 11 00010111000
1014 6 5 11 00010110010
1015 6 6 11 00010100000
1016 6 7 11 00010000101
1017 6 8 12 000100000001
1018 6 9 12 000011110100
1019 6 10 12 000011100100
1020 6 11 12 000011011001
1021 6 12 13 0000110000001
1022 6 13 13 0000101101110
1023 6 14 14 00001011001011
1024 6 15 10 0000001010
1025 7 0 10 0001100010
1026 7 1 9 000110000
1027 7 2 10 0001011011
1028 7 3 10 0001011000
1029 7 4 11 00010100101
1030 7 5 11 00010011101
1031 7 6 11 00010010100
1032 7 7 12 000100000101
1033 7 8 12 000011111000
1034 7 9 13 0000110010111
1035 7 10 13 0000110001101
1036 7 11 13 0000101110100
1037 7 12 13 0000101111100
1038 7 13 15 000001101111001
1039 7 14 15 000001101110100
1040 7 15 10 0000001000
1041 8 0 10 0001010101
1042 8 1 10 0001010100
1043 8 2 10 0001010001
1044 8 3 11 00010011111
1045 8 4 11 00010011100
1046 8 5 11 00010001111
1047 8 6 12 000100000100
1048 8 7 12 000011111001
1049 8 8 13 0000110101011
1050 8 9 13 0000110010001
1051 8 10 13 0000110001000
1052 8 11 13 0000101111111
1053 8 12 14 00001011010111
1054 8 13 14 00001011001001
1055 8 14 14 00001011000100
1056 8 15 10 0000000111
1057 9 0 11 00010011010
1058 9 1 10 0001001100
1059 9 2 10 0001001001
1060 9 3 11 00010001101
1061 9 4 11 00010000011
1062 9 5 12 000100000000
1063 9 6 12 000011110101
1064 9 7 13 0000110101010
1065 9 8 13 0000110010110
1066 9 9 13 0000110001010
1067 9 10 13 0000110000000
1068 9 11 14 00001011011111
1069 9 12 13 0000101100111
1070 9 13 14 00001011000110
1071 9 14 13 0000101100000
1072 9 15 11 00000001011
107310 0 11 00010001011
107410 1 11 00010000001
107510 2 10 0001000011
107610 3 11 00001111101
107710 4 12 000011110111
107810 5 12 000011101001
107910 6 12 000011100101
108010 7 12 000011011011
108110 8 13 0000110001001
108210 9 14 00001011100111
108310 10 14 00001011100001
108410 11 14 00001011010000
108510 12 15 000001101110101
108610 13 15 000001101110010
108710 14 14 00000110110111
108810 15 10 0000000100
108911 0 12 000011110011
109011 1 11 00001111000
109111 2 11 00001110110
109211 3 11 00001110011
109311 4 12 000011100011
109411 5 12 000011011111
109511 6 13 0000110001100
109611 7 14 00001011101010
109711 8 14 00001011100110
109811 9 14 00001011100000
109911 10 14 00001011010001
110011 11 14 00001011001000
110111 12 14 00001011000010
110211 13 13 0000011011111
110311 14 14 00000110110100
110411 15 11 00000000110
110512 0 12 000011001010
110612 1 12 000011100000
110712 2 12 000011011110
110812 3 12 000011011010
110912 4 12 000011011000
111012 5 13 0000110000101
111112 6 13 0000110000010
111212 7 13 0000101111101
111312 8 13 0000101101100
111412 9 15 000001101111000
111512 10 14 00000110111011
111612 11 14 00001011000011
111712 12 14 00000110111000
111812 13 14 00000110110101
111912 14 16 0000011011000000
112012 15 11 00000000100
112113 0 14 00001011101011
112213 1 12 000011010011
112313 2 12 000011010010
112413 3 12 000011010000
112513 4 13 0000101110010
112613 5 13 0000101111011
112713 6 14 00001011011110
112813 7 14 00001011010011
112913 8 14 00001011001010
113013 9 16 0000011011000111
113113 10 15 000001101110011
113213 11 15 000001101101101
113313 12 15 000001101101100
113413 13 17 00000110110000011
113513 14 15 000001101100001
113613 15 11 00000000010
113714 0 13 0000101111001
113814 1 13 0000101110001
113914 2 11 00001100110
114014 3 12 000010111011
114114 4 14 00001011010110
114214 5 14 00001011010010
114314 6 13 0000101100110
114414 7 14 00001011000111
114514 8 14 00001011000101
114614 9 15 000001101100010
114714 10 16 0000011011000110
114814 11 15 000001101100111
114914 12 17 00000110110000010
115014 13 15 000001101100110
115114 14 14 00000110110010
115214 15 11 00000000000
115315 0 9 000001100
115415 1 8 00001010
115515 2 8 00000111
115615 3 9 000001011
115715 4 9 000001010
115815 5 10 0000010001
115915 6 10 0000001011
116015 7 10 0000001001
116115 8 11 00000001101
116215 9 11 00000001100
116315 10 11 00000001010
116415 11 11 00000000111
116515 12 11 00000000101
116615 13 11 00000000011
116715 14 11 00000000001
116815 15 8 00000011
1169
1170.table 17 16 16 2
1171.reference 16
1172
1173.table 18 16 16 3
1174.reference 16
1175
1176.table 19 16 16 4
1177.reference 16
1178
1179.table 20 16 16 6
1180.reference 16
1181
1182.table 21 16 16 8
1183.reference 16
1184
1185.table 22 16 16 10
1186.reference 16
1187
1188.table 23 16 16 13
1189.reference 16
1190
1191.table 24 16 16 4
1192 0 0 4 1111
1193 0 1 4 1101
1194 0 2 6 101110
1195 0 3 7 1010000
1196 0 4 8 10010010
1197 0 5 9 100000110
1198 0 6 9 011111000
1199 0 7 10 0110110010
1200 0 8 10 0110101010
1201 0 9 11 01010011101
1202 0 10 11 01010001101
1203 0 11 11 01010001001
1204 0 12 11 01001101101
1205 0 13 11 01000000101
1206 0 14 12 010000001000
1207 0 15 9 001011000
1208 1 0 4 1110
1209 1 1 4 1100
1210 1 2 5 10101
1211 1 3 6 100110
1212 1 4 7 1000111
1213 1 5 8 10000010
1214 1 6 8 01111010
1215 1 7 9 011011000
1216 1 8 9 011010001
1217 1 9 9 011000110
1218 1 10 10 0101000111
1219 1 11 10 0101011001
1220 1 12 10 0100111111
1221 1 13 10 0100101001
1222 1 14 10 0100010111
1223 1 15 8 00101010
1224 2 0 6 101111
1225 2 1 5 10110
1226 2 2 6 101001
1227 2 3 7 1001010
1228 2 4 7 1000100
1229 2 5 8 10000000
1230 2 6 8 01111000
1231 2 7 9 011011101
1232 2 8 9 011001111
1233 2 9 9 011000010
1234 2 10 9 010110110
1235 2 11 10 0101010100
1236 2 12 10 0100111011
1237 2 13 10 0100100111
1238 2 14 11 01000011101
1239 2 15 7 0010010
1240 3 0 7 1010001
1241 3 1 6 100111
1242 3 2 7 1001011
1243 3 3 7 1000110
1244 3 4 8 10000110
1245 3 5 8 01111101
1246 3 6 8 01110100
1247 3 7 9 011011100
1248 3 8 9 011001100
1249 3 9 9 010111110
1250 3 10 9 010110010
1251 3 11 10 0101000101
1252 3 12 10 0100110111
1253 3 13 10 0100100101
1254 3 14 10 0100001111
1255 3 15 7 0010000
1256 4 0 8 10010011
1257 4 1 7 1001000
1258 4 2 7 1000101
1259 4 3 8 10000111
1260 4 4 8 01111111
1261 4 5 8 01110110
1262 4 6 8 01110000
1263 4 7 9 011010010
1264 4 8 9 011001000
1265 4 9 9 010111100
1266 4 10 10 0101100000
1267 4 11 10 0101000011
1268 4 12 10 0100110010
1269 4 13 10 0100011101
1270 4 14 11 01000011100
1271 4 15 7 0001110
1272 5 0 9 100000111
1273 5 1 7 1000010
1274 5 2 8 10000001
1275 5 3 8 01111110
1276 5 4 8 01110111
1277 5 5 8 01110010
1278 5 6 9 011010110
1279 5 7 9 011001010
1280 5 8 9 011000000
1281 5 9 9 010110100
1282 5 10 10 0101010101
1283 5 11 10 0100111101
1284 5 12 10 0100101101
1285 5 13 10 0100011001
1286 5 14 10 0100000110
1287 5 15 7 0001100
1288 6 0 9 011111001
1289 6 1 8 01111011
1290 6 2 8 01111001
1291 6 3 8 01110101
1292 6 4 8 01110001
1293 6 5 9 011010111
1294 6 6 9 011001110
1295 6 7 9 011000011
1296 6 8 9 010111001
1297 6 9 10 0101011011
1298 6 10 10 0101001010
1299 6 11 10 0100110100
1300 6 12 10 0100100011
1301 6 13 10 0100010000
1302 6 14 11 01000001000
1303 6 15 7 0001010
1304 7 0 10 0110110011
1305 7 1 8 01110011
1306 7 2 8 01101111
1307 7 3 8 01101101
1308 7 4 9 011010011
1309 7 5 9 011001011
1310 7 6 9 011000100
1311 7 7 9 010111011
1312 7 8 10 0101100001
1313 7 9 10 0101001100
1314 7 10 10 0100111001
1315 7 11 10 0100101010
1316 7 12 10 0100011011
1317 7 13 11 01000010011
1318 7 14 11 00101111101
1319 7 15 8 00010001
1320 8 0 10 0110101011
1321 8 1 9 011010100
1322 8 2 9 011010000
1323 8 3 9 011001101
1324 8 4 9 011001001
1325 8 5 9 011000001
1326 8 6 9 010111010
1327 8 7 9 010110001
1328 8 8 9 010101001
1329 8 9 10 0101000000
1330 8 10 10 0100101111
1331 8 11 10 0100011110
1332 8 12 10 0100001100
1333 8 13 11 01000000010
1334 8 14 11 00101111001
1335 8 15 8 00010000
1336 9 0 10 0101001111
1337 9 1 9 011000111
1338 9 2 9 011000101
1339 9 3 9 010111111
1340 9 4 9 010111101
1341 9 5 9 010110101
1342 9 6 9 010101110
1343 9 7 10 0101001101
1344 9 8 10 0101000001
1345 9 9 10 0100110001
1346 9 10 10 0100100001
1347 9 11 10 0100010011
1348 9 12 11 01000001001
1349 9 13 11 00101111011
1350 9 14 11 00101110011
1351 9 15 8 00001011
135210 0 11 01010011100
135310 1 9 010111000
135410 2 9 010110111
135510 3 9 010110011
135610 4 9 010101111
135710 5 10 0101011000
135810 6 10 0101001011
135910 7 10 0100111010
136010 8 10 0100110000
136110 9 10 0100100010
136210 10 10 0100010101
136310 11 11 01000010010
136410 12 11 00101111111
136510 13 11 00101110101
136610 14 11 00101101110
136710 15 8 00001010
136811 0 11 01010001100
136911 1 10 0101011010
137011 2 9 010101011
137111 3 9 010101000
137211 4 9 010100100
137311 5 10 0100111110
137411 6 10 0100110101
137511 7 10 0100101011
137611 8 10 0100011111
137711 9 10 0100010100
137811 10 10 0100000111
137911 11 11 01000000001
138011 12 11 00101110111
138111 13 11 00101110000
138211 14 11 00101101010
138311 15 8 00000110
138412 0 11 01010001000
138512 1 10 0101000010
138612 2 10 0100111100
138712 3 10 0100111000
138812 4 10 0100110011
138912 5 10 0100101110
139012 6 10 0100100100
139112 7 10 0100011100
139212 8 10 0100001101
139312 9 10 0100000101
139412 10 11 01000000000
139512 11 11 00101111000
139612 12 11 00101110010
139712 13 11 00101101100
139812 14 11 00101100111
139912 15 8 00000100
140013 0 11 01001101100
140113 1 10 0100101100
140213 2 10 0100101000
140313 3 10 0100100110
140413 4 10 0100100000
140513 5 10 0100011010
140613 6 10 0100010001
140713 7 10 0100001010
140813 8 11 01000000011
140913 9 11 00101111100
141013 10 11 00101110110
141113 11 11 00101110001
141213 12 11 00101101101
141313 13 11 00101101001
141413 14 11 00101100101
141513 15 8 00000010
141614 0 12 010000001001
141714 1 10 0100011000
141814 2 10 0100010110
141914 3 10 0100010010
142014 4 10 0100001011
142114 5 10 0100001000
142214 6 10 0100000011
142314 7 11 00101111110
142414 8 11 00101111010
142514 9 11 00101110100
142614 10 11 00101101111
142714 11 11 00101101011
142814 12 11 00101101000
142914 13 11 00101100110
143014 14 11 00101100100
143114 15 8 00000000
143215 0 8 00101011
143315 1 7 0010100
143415 2 7 0010011
143515 3 7 0010001
143615 4 7 0001111
143715 5 7 0001101
143815 6 7 0001011
143915 7 7 0001001
144015 8 7 0000111
144115 9 7 0000110
144215 10 7 0000100
144315 11 8 00000111
144415 12 8 00000101
144515 13 8 00000011
144615 14 8 00000001
144715 15 4 0011
1448
1449.table 25 16 16 5
1450.reference 24
1451
1452.table 26 16 16 6
1453.reference 24
1454
1455.table 27 16 16 7
1456.reference 24
1457
1458.table 28 16 16 8
1459.reference 24
1460
1461.table 29 16 16 9
1462.reference 24
1463
1464.table 30 16 16 11
1465.reference 24
1466
1467.table 31 16 16 13
1468.reference 24
1469
1470.table 32 1 16 0
1471 0 1 1
1472 1 4 0101
1473 2 4 0100
1474 3 5 00101
1475 4 4 0110
1476 5 6 000101
1477 6 5 00100
1478 7 6 000100
1479 8 4 0111
1480 9 5 00011
1481 10 5 00110
1482 11 6 000000
1483 12 5 00111
1484 13 6 000010
1485 14 6 000011
1486 15 6 000001
1487
1488.table 33 1 16 0
1489 0 4 1111
1490 1 4 1110
1491 2 4 1101
1492 3 4 1100
1493 4 4 1011
1494 5 4 1010
1495 6 4 1001
1496 7 4 1000
1497 8 4 0111
1498 9 4 0110
1499 10 4 0101
1500 11 4 0100
1501 12 4 0011
1502 13 4 0010
1503 14 4 0001
1504 15 4 0000
1505
1506.end
huffopt/huffopt.c+348−0
@@ -0,0 +1,348 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include <assert.h>
4#include <string.h>
5
6#define WROOT 5 /* fixed width (bits) of root table (MUST also be changed in the decoder C code) */
7#define WMAX 7 /* max width of sub-table */
8#define LAMBDA 512 /* Lagrange multiplier for MIPS/bytes trade-off: 1 table jump cost == LAMBDA bytes. Table cost = # of bytes + LAMBDA * # of jumps */
9#define OPTIMIZE_SIZE 0 /* flag to force LAMBDA==0 (free jumps, table cost == table size) */
10
11#define MIN(a, b) ((a) < (b) ? (a) : (b))
12#define MAX(a, b) ((a) > (b) ? (a) : (b))
13
14typedef struct huff_t
15{
16 struct huff_t *link;
17 struct huff_t *parent;
18 struct huff_t *child[2];
19 int level;
20 unsigned symbol;
21 unsigned code;
22
23 struct
24 {
25 int best_width, size;
26 float mips;
27 } dp;
28
29 int backref;
30 int offset;
31
32 enum { E_PAIR, E_QUAD } symbol_kind;
33} huff_t;
34
35static int is_leaf(const huff_t *h)
36{
37 return !h->child[0] && !h->child[1];
38}
39
40static int imax(int a, int b)
41{
42 return MAX(a, b);
43}
44
45static char *BIT_str(unsigned x, int bits)
46{ // Print x as bitpattern: 01 (LBS bits)
47 static int idx;
48 static char buf[8][33]; // up to 8 simultaneous numbers
49 char *p = buf[++idx & 7];
50 while (bits--)
51 {
52 *p++ = "01"[(x >> bits) & 1];
53 }
54 *p++ = 0;
55 return buf[idx & 7];
56}
57
58huff_t *huff_create(huff_t *h, unsigned symbol, unsigned code, int code_len, int level, int symbol_kind)
59{
60 if (!h)
61 {
62 h = (huff_t*)calloc(1, sizeof(huff_t));
63 h->level = level;
64 h->symbol = code_len ? ~0 : symbol;
65 h->code = code_len ? ~0 : code;
66 h->dp.size = 1;
67 h->dp.mips = 1.f/(1 << level);
68 h->backref = -1;
69 h->symbol_kind = symbol_kind;
70 }
71 if (h && code_len > 0)
72 {
73 int bit = (code >> --code_len) & 1;
74 h->child[bit] = huff_create(h->child[bit], symbol, code, code_len, level + 1, symbol_kind);
75 }
76 return h;
77}
78
79void huff_free(huff_t *h)
80{
81 if (h)
82 {
83 huff_free(h->child[0]);
84 huff_free(h->child[1]);
85 free(h);
86 }
87}
88
89huff_t *read_codebook(int book)
90{
91 FILE *f = fopen("HUFFCODE", "rt");
92 huff_t *tree = NULL;
93 int tab = -1, mx, my, lin;
94 do
95 {
96 if (4 != fscanf(f, "\n.table %d %d %d %d", &tab, &mx, &my, &lin))
97 {
98 fscanf(f, "%*[^\n]");
99 }
100 } while(tab != book && !feof(f));
101 if (tab == book)
102 {
103 int i, j;
104 for (i = 0; i < mx*my; i++)
105 {
106 int x, y, len, icode = 0;
107 char code[30];
108 if (book < 32)
109 {
110 while (4 != fscanf(f, "\n%d %d %d %s", &x, &y, &len, code))
111 {
112 fscanf(f, "%*[^\n]");
113 }
114 } else
115 {
116 x = 0;
117 while (3 != fscanf(f, "\n%d %d %s", &y, &len, code))
118 {
119 fscanf(f, "%*[^\n]");
120 }
121 }
122 for (j = 0; j < len; j++)
123 {
124 icode <<= 1;
125 icode |= code[j] - '0';
126 }
127
128 tree = huff_create(tree, (x << 16) + y, icode, len, 0, book < 32 ? E_PAIR : E_QUAD);
129 }
130 }
131 fclose(f);
132 return tree;
133}
134
135int huff_symbols_count(const huff_t *h)
136{
137 return h ? is_leaf(h) + huff_symbols_count(h->child[0]) + huff_symbols_count(h->child[1]) : 0;
138}
139
140int huff_depth(const huff_t *h)
141{
142 return is_leaf(h) ? 0 : (1 + imax(huff_depth(h->child[0]), huff_depth(h->child[1])));
143}
144
145int huff_size(const huff_t *h, int depth)
146{
147 return is_leaf(h) ? 0 : (--depth < 0) ? h->dp.size : huff_size(h->child[0], depth) + huff_size(h->child[1], depth);
148}
149
150float huff_cost(const huff_t *h, int depth)
151{
152 return is_leaf(h) ? 0 : (--depth < 0) ? h->dp.mips : huff_cost(h->child[0], depth) + huff_cost(h->child[1], depth);
153}
154
155const huff_t *huff_decode(const huff_t *h, unsigned code, int code_len)
156{
157 return (!code_len || is_leaf(h)) ? h : huff_decode(h->child[(code >> (code_len - 1)) & 1], code, code_len - 1);
158}
159
160void huff_optimize_partition(huff_t *h)
161{
162 int i, depth, wmin, wmax;
163 if (h && !is_leaf(h))
164 {
165 // DP call:
166 huff_optimize_partition(h->child[0]);
167 huff_optimize_partition(h->child[1]);
168 depth = huff_depth(h);
169
170 wmin = h->level ? 1 : WROOT;
171 wmax = wmin > 1 ? wmin : MIN(depth, WMAX);
172
173 if (h->symbol_kind == E_QUAD && !h->level)
174 {
175 wmax = wmin = 4;
176 }
177
178 h->dp.size = huff_size(h, h->dp.best_width = wmin) + (1 << wmin);
179 h->dp.mips = huff_cost(h, h->dp.best_width = wmin) + 1.f/(1 << h->level);
180
181 for (i = wmin + 1; i <= wmax; i++)
182 {
183 int size = huff_size(h, i) + (1 << i);
184 float mips = huff_cost(h, i) + 1.f/(1 << h->level);
185 float cost_i;
186 float cost_have;
187
188 cost_i = mips*LAMBDA + size;
189 cost_have = h->dp.mips*LAMBDA + h->dp.size;
190#if OPTIMIZE_SIZE
191 cost_i = (float)size;
192 cost_have = (float)h->dp.size;
193#endif
194
195 if (cost_i < cost_have)
196 {
197 h->dp.best_width = i;
198 h->dp.size = size;
199 h->dp.mips = mips;
200 }
201 }
202 }
203}
204
205void huff_print_one(const huff_t *h, FILE *f, int parent_level)
206{
207 if (h->symbol_kind == E_PAIR)
208 {
209 if (is_leaf(h))
210 {
211 int x = h->symbol << 16 >> 16;
212 int y = h->symbol << 0 >> 16;
213 fprintf(f, "%d,", ((h->level - parent_level)*256 + (x << 4) + (y << 0)));
214 } else
215 {
216 assert(h->offset < (1 << 13));
217 assert(h->offset);
218 fprintf(f, "%d,", (-h->offset << 3) | h->dp.best_width);
219 }
220 } else
221 {
222 if (is_leaf(h))
223 {
224 fprintf(f, "%d,", (h->symbol*16 + 8 + h->level));
225 } else
226 {
227 fprintf(f, "%d,", (h->offset << 3) | h->dp.best_width);
228 //fprintf(f, "[%d,%d]", h->offset , h->dp.best_width);
229 }
230 }
231}
232
233void huff_set_links_bfs(huff_t *h, FILE *f)
234{
235 int print_flag;
236 for (print_flag = 0; print_flag <= 1; print_flag++)
237 {
238 huff_t *q = h;
239 huff_t *queue_head = NULL;
240 huff_t **queue_tail = &queue_head;
241 int offs = 0;
242 while (q)
243 {
244 int i, w = 1 << q->dp.best_width;
245 for (i = 0; i < w; i++)
246 {
247 huff_t *r = (huff_t *)huff_decode(q, i, q->dp.best_width);
248 if (print_flag)
249 {
250 huff_print_one(r, f, q->level);
251 }
252
253 if (!is_leaf(r))
254 {
255 r->backref = offs;// + i;
256 *queue_tail = r;
257 queue_tail = &r->link;
258 }
259 }
260 offs += w;
261 q = queue_head;
262 if (q)
263 {
264 if ((queue_head = q->link) != NULL)
265 {
266 queue_tail = &queue_head;
267 }
268 q->offset = offs;// - q->backref;
269 }
270 }
271 }
272}
273
274void huff_set_links_dfs_recursion(huff_t *h, FILE *f, int print_flag, int *off)
275{
276 int i, w = 1 << h->dp.best_width;
277 h->offset = *off;
278 *off += w;
279 for (i = 0; print_flag && i < w; i++)
280 {
281 huff_print_one(huff_decode(h, i, h->dp.best_width), f, h->level);
282 }
283 for (i = 0; i < w; i++)
284 {
285 huff_t *q = (huff_t *)huff_decode(h, i, h->dp.best_width);
286 if (!is_leaf(q))
287 {
288 huff_set_links_dfs_recursion(q, f, print_flag, off);
289 }
290 }
291}
292
293void huff_set_links_dfs(huff_t *h, FILE *f)
294{
295 int off = 0;
296 huff_set_links_dfs_recursion(h, f, 0, &off);
297 huff_set_links_dfs_recursion(h, f, 1, &off);
298};
299
300int main()
301{
302 int i;
303 const int tabn[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,24,32,33 };
304 int total_size = 0;
305 int entry_bits[32];
306
307 FILE *dst_file = fopen("Huffman_tree.inl", "wt");
308
309 for (i = 0; i < sizeof(tabn)/sizeof(tabn[0]); i++)
310 {
311 huff_t *h = read_codebook(tabn[i]);
312 huff_optimize_partition(h);
313
314 printf("\ntable %2d ", tabn[i]);
315 printf("%3d symbols ", huff_symbols_count(h));
316 printf("%3d items ", h ? h->dp.size : 0);
317 printf("%1d entry ", h ? h->dp.best_width : 0);
318 printf("%f average memory reads ", h ? h->dp.mips : 0);
319 total_size += h ? h->dp.size : 0;
320
321 fprintf(dst_file, "static const %s tab%d[] = { ", tabn[i] < 32 ? "short" : "u8", tabn[i]);
322 if (h)
323 {
324 //huff_set_links_bfs(h, dst_file);
325 huff_set_links_dfs(h, dst_file);
326 entry_bits[i] = h->dp.best_width;
327 } else
328 {
329 fprintf(dst_file, "0");
330 entry_bits[i] = 0;
331 }
332 fprintf(dst_file, " };\n");
333 huff_free(h);
334 }
335#if WROOT > 1
336 fprintf(dst_file, "#define HUFF_ENTRY_BITS %d\n", WROOT);
337#else
338 fprintf(dst_file, "#define HUFF_ENTRY_BITS 0\n");
339 fprintf(dst_file, "static const u8 g_entry_bits[] = { ");
340 for (i = 0; i < sizeof(tabn)/sizeof(tabn[0]); i++)
341 {
342 fprintf(dst_file, "%d,", entry_bits[i]);
343 }
344 fprintf(dst_file, " };\n", i);
345#endif
346 fclose(dst_file);
347 printf("\n// Total: %d items\n", total_size);
348}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t