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
554+10 0 10 0000100011
555+10 1 10 0000100001
556+10 2 10 0000011111
557+10 3 11 00000111001
558+10 4 11 00000101010
559+10 5 12 000001010010
560+10 6 12 000001001000
561+10 7 13 0000001010000
562+10 8 12 000000101111
563+10 9 13 0000000111010
564+10 10 14 00000000110111
565+10 11 13 0000000010101
566+10 12 14 00000000010110
567+10 13 15 000000000011010
568+10 14 16 0000000000100110
569+10 15 17 00000000000010110
570+11 0 11 00000110101
571+11 1 10 0000011001
572+11 2 10 0000010111
573+11 3 11 00000100110
574+11 4 12 000001000110
575+11 5 12 000000111100
576+11 6 12 000000110011
577+11 7 12 000000100100
578+11 8 13 0000000110111
579+11 9 13 0000000011010
580+11 10 13 0000000100010
581+11 11 14 00000000010111
582+11 12 15 000000000011011
583+11 13 15 000000000001110
584+11 14 15 000000000001001
585+11 15 16 0000000000000111
586+12 0 11 00000100010
587+12 1 11 00000100000
588+12 2 11 00000011100
589+12 3 12 000000100111
590+12 4 12 000000110001
591+12 5 13 0000001001011
592+12 6 12 000000011110
593+12 7 13 0000000110100
594+12 8 14 00000000110000
595+12 9 14 00000000101000
596+12 10 15 000000000110100
597+12 11 15 000000000011100
598+12 12 15 000000000010010
599+12 13 16 0000000000010001
600+12 14 16 0000000000001001
601+12 15 16 0000000000000101
602+13 0 12 000000101101
603+13 1 11 00000010101
604+13 2 12 000000100010
605+13 3 13 0000001000000
606+13 4 13 0000000111000
607+13 5 13 0000000110010
608+13 6 14 00000000110001
609+13 7 14 00000000101101
610+13 8 14 00000000011111
611+13 9 14 00000000010011
612+13 10 14 00000000001100
613+13 11 15 000000000001111
614+13 12 16 0000000000001010
615+13 13 15 000000000000111
616+13 14 16 0000000000000110
617+13 15 16 0000000000000011
618+14 0 13 0000000110000
619+14 1 12 000000010111
620+14 2 12 000000010100
621+14 3 13 0000000100111
622+14 4 13 0000000100100
623+14 5 13 0000000100011
624+14 6 15 000000000110101
625+14 7 14 00000000010101
626+14 8 14 00000000010000
627+14 9 17 00000000000010111
628+14 10 15 000000000001101
629+14 11 15 000000000001010
630+14 12 15 000000000000110
631+14 13 17 00000000000000001
632+14 14 16 0000000000000100
633+14 15 16 0000000000000010
634+15 0 12 000000010000
635+15 1 12 000000001111
636+15 2 13 0000000010001
637+15 3 14 00000000011011
638+15 4 14 00000000011001
639+15 5 14 00000000010100
640+15 6 15 000000000011101
641+15 7 14 00000000001011
642+15 8 15 000000000010001
643+15 9 15 000000000001100
644+15 10 16 0000000000010000
645+15 11 16 0000000000001000
646+15 12 19 0000000000000000001
647+15 13 18 000000000000000001
648+15 14 19 0000000000000000000
649+15 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
815+10 0 10 0001101101
816+10 1 9 000110101
817+10 2 9 000110011
818+10 3 9 000101111
819+10 4 10 0001011010
820+10 5 10 0001010010
821+10 6 10 0000111010
822+10 7 10 0000111001
823+10 8 10 0000110000
824+10 9 11 00001001000
825+10 10 11 00000111001
826+10 11 11 00000101001
827+10 12 11 00000010111
828+10 13 12 000000011011
829+10 14 13 0000000111110
830+10 15 12 000000001001
831+11 0 10 0001010110
832+11 1 9 000101010
833+11 2 9 000101000
834+11 3 9 000100101
835+11 4 10 0001000110
836+11 5 10 0001000000
837+11 6 10 0000110100
838+11 7 10 0000101011
839+11 8 11 00001000110
840+11 9 11 00000110111
841+11 10 11 00000101010
842+11 11 11 00000011001
843+11 12 12 000000011101
844+11 13 12 000000010010
845+11 14 12 000000001011
846+11 15 13 0000000001011
847+12 0 11 00001110110
848+12 1 10 0001000100
849+12 2 9 000011110
850+12 3 10 0000110111
851+12 4 10 0000110010
852+12 5 10 0000101110
853+12 6 11 00001001010
854+12 7 11 00001000001
855+12 8 11 00000110001
856+12 9 11 00000100111
857+12 10 11 00000011000
858+12 11 11 00000010000
859+12 12 12 000000010110
860+12 13 12 000000001101
861+12 14 13 0000000001110
862+12 15 13 0000000000111
863+13 0 11 00001011011
864+13 1 10 0000101100
865+13 2 10 0000100111
866+13 3 10 0000100110
867+13 4 10 0000100010
868+13 5 11 00000111111
869+13 6 11 00000110100
870+13 7 11 00000101101
871+13 8 11 00000011111
872+13 9 12 000000110100
873+13 10 12 000000011100
874+13 11 12 000000010011
875+13 12 12 000000001110
876+13 13 12 000000001000
877+13 14 13 0000000001001
878+13 15 13 0000000000011
879+14 0 12 000001111011
880+14 1 11 00000111100
881+14 2 11 00000111010
882+14 3 11 00000110101
883+14 4 11 00000101111
884+14 5 11 00000101011
885+14 6 11 00000100000
886+14 7 11 00000010110
887+14 8 12 000000100101
888+14 9 12 000000011000
889+14 10 12 000000010001
890+14 11 12 000000001100
891+14 12 13 0000000001111
892+14 13 13 0000000001010
893+14 14 12 000000000010
894+14 15 13 0000000000001
895+15 0 12 000001000111
896+15 1 11 00000100101
897+15 2 11 00000100010
898+15 3 11 00000011110
899+15 4 11 00000011100
900+15 5 11 00000010100
901+15 6 11 00000010001
902+15 7 12 000000011010
903+15 8 12 000000010101
904+15 9 12 000000010000
905+15 10 12 000000001010
906+15 11 12 000000000110
907+15 12 13 0000000001000
908+15 13 13 0000000000110
909+15 14 13 0000000000010
910+15 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
1073+10 0 11 00010001011
1074+10 1 11 00010000001
1075+10 2 10 0001000011
1076+10 3 11 00001111101
1077+10 4 12 000011110111
1078+10 5 12 000011101001
1079+10 6 12 000011100101
1080+10 7 12 000011011011
1081+10 8 13 0000110001001
1082+10 9 14 00001011100111
1083+10 10 14 00001011100001
1084+10 11 14 00001011010000
1085+10 12 15 000001101110101
1086+10 13 15 000001101110010
1087+10 14 14 00000110110111
1088+10 15 10 0000000100
1089+11 0 12 000011110011
1090+11 1 11 00001111000
1091+11 2 11 00001110110
1092+11 3 11 00001110011
1093+11 4 12 000011100011
1094+11 5 12 000011011111
1095+11 6 13 0000110001100
1096+11 7 14 00001011101010
1097+11 8 14 00001011100110
1098+11 9 14 00001011100000
1099+11 10 14 00001011010001
1100+11 11 14 00001011001000
1101+11 12 14 00001011000010
1102+11 13 13 0000011011111
1103+11 14 14 00000110110100
1104+11 15 11 00000000110
1105+12 0 12 000011001010
1106+12 1 12 000011100000
1107+12 2 12 000011011110
1108+12 3 12 000011011010
1109+12 4 12 000011011000
1110+12 5 13 0000110000101
1111+12 6 13 0000110000010
1112+12 7 13 0000101111101
1113+12 8 13 0000101101100
1114+12 9 15 000001101111000
1115+12 10 14 00000110111011
1116+12 11 14 00001011000011
1117+12 12 14 00000110111000
1118+12 13 14 00000110110101
1119+12 14 16 0000011011000000
1120+12 15 11 00000000100
1121+13 0 14 00001011101011
1122+13 1 12 000011010011
1123+13 2 12 000011010010
1124+13 3 12 000011010000
1125+13 4 13 0000101110010
1126+13 5 13 0000101111011
1127+13 6 14 00001011011110
1128+13 7 14 00001011010011
1129+13 8 14 00001011001010
1130+13 9 16 0000011011000111
1131+13 10 15 000001101110011
1132+13 11 15 000001101101101
1133+13 12 15 000001101101100
1134+13 13 17 00000110110000011
1135+13 14 15 000001101100001
1136+13 15 11 00000000010
1137+14 0 13 0000101111001
1138+14 1 13 0000101110001
1139+14 2 11 00001100110
1140+14 3 12 000010111011
1141+14 4 14 00001011010110
1142+14 5 14 00001011010010
1143+14 6 13 0000101100110
1144+14 7 14 00001011000111
1145+14 8 14 00001011000101
1146+14 9 15 000001101100010
1147+14 10 16 0000011011000110
1148+14 11 15 000001101100111
1149+14 12 17 00000110110000010
1150+14 13 15 000001101100110
1151+14 14 14 00000110110010
1152+14 15 11 00000000000
1153+15 0 9 000001100
1154+15 1 8 00001010
1155+15 2 8 00000111
1156+15 3 9 000001011
1157+15 4 9 000001010
1158+15 5 10 0000010001
1159+15 6 10 0000001011
1160+15 7 10 0000001001
1161+15 8 11 00000001101
1162+15 9 11 00000001100
1163+15 10 11 00000001010
1164+15 11 11 00000000111
1165+15 12 11 00000000101
1166+15 13 11 00000000011
1167+15 14 11 00000000001
1168+15 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
1352+10 0 11 01010011100
1353+10 1 9 010111000
1354+10 2 9 010110111
1355+10 3 9 010110011
1356+10 4 9 010101111
1357+10 5 10 0101011000
1358+10 6 10 0101001011
1359+10 7 10 0100111010
1360+10 8 10 0100110000
1361+10 9 10 0100100010
1362+10 10 10 0100010101
1363+10 11 11 01000010010
1364+10 12 11 00101111111
1365+10 13 11 00101110101
1366+10 14 11 00101101110
1367+10 15 8 00001010
1368+11 0 11 01010001100
1369+11 1 10 0101011010
1370+11 2 9 010101011
1371+11 3 9 010101000
1372+11 4 9 010100100
1373+11 5 10 0100111110
1374+11 6 10 0100110101
1375+11 7 10 0100101011
1376+11 8 10 0100011111
1377+11 9 10 0100010100
1378+11 10 10 0100000111
1379+11 11 11 01000000001
1380+11 12 11 00101110111
1381+11 13 11 00101110000
1382+11 14 11 00101101010
1383+11 15 8 00000110
1384+12 0 11 01010001000
1385+12 1 10 0101000010
1386+12 2 10 0100111100
1387+12 3 10 0100111000
1388+12 4 10 0100110011
1389+12 5 10 0100101110
1390+12 6 10 0100100100
1391+12 7 10 0100011100
1392+12 8 10 0100001101
1393+12 9 10 0100000101
1394+12 10 11 01000000000
1395+12 11 11 00101111000
1396+12 12 11 00101110010
1397+12 13 11 00101101100
1398+12 14 11 00101100111
1399+12 15 8 00000100
1400+13 0 11 01001101100
1401+13 1 10 0100101100
1402+13 2 10 0100101000
1403+13 3 10 0100100110
1404+13 4 10 0100100000
1405+13 5 10 0100011010
1406+13 6 10 0100010001
1407+13 7 10 0100001010
1408+13 8 11 01000000011
1409+13 9 11 00101111100
1410+13 10 11 00101110110
1411+13 11 11 00101110001
1412+13 12 11 00101101101
1413+13 13 11 00101101001
1414+13 14 11 00101100101
1415+13 15 8 00000010
1416+14 0 12 010000001001
1417+14 1 10 0100011000
1418+14 2 10 0100010110
1419+14 3 10 0100010010
1420+14 4 10 0100001011
1421+14 5 10 0100001000
1422+14 6 10 0100000011
1423+14 7 11 00101111110
1424+14 8 11 00101111010
1425+14 9 11 00101110100
1426+14 10 11 00101101111
1427+14 11 11 00101101011
1428+14 12 11 00101101000
1429+14 13 11 00101100110
1430+14 14 11 00101100100
1431+14 15 8 00000000
1432+15 0 8 00101011
1433+15 1 7 0010100
1434+15 2 7 0010011
1435+15 3 7 0010001
1436+15 4 7 0001111
1437+15 5 7 0001101
1438+15 6 7 0001011
1439+15 7 7 0001001
1440+15 8 7 0000111
1441+15 9 7 0000110
1442+15 10 7 0000100
1443+15 11 8 00000111
1444+15 12 8 00000101
1445+15 13 8 00000011
1446+15 14 8 00000001
1447+15 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+
14+typedef 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+
35+static int is_leaf(const huff_t *h)
36+{
37+ return !h->child[0] && !h->child[1];
38+}
39+
40+static int imax(int a, int b)
41+{
42+ return MAX(a, b);
43+}
44+
45+static 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+
58+huff_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+
79+void 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+
89+huff_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+
135+int 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+
140+int 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+
145+int 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+
150+float 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+
155+const 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+
160+void 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+
205+void 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+
233+void 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+
274+void 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+
293+void 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+
300+int 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