@@ -24,4 +24,129 @@ void DecodeHuffmanValues(int* spectrum, int index, int bandCount, const HuffmanC
2424 value >>= huff -> ValueBits ;
2525 }
2626 }
27- }
27+ }
28+
29+ void InitHuffmanCodebook (const HuffmanCodebook * codebook )
30+ {
31+ const int huffLength = codebook -> Length ;
32+ if (huffLength == 0 ) return ;
33+
34+ unsigned char * dest = codebook -> Lookup ;
35+
36+ for (int i = 0 ; i < huffLength ; i ++ )
37+ {
38+ if (codebook -> Bits [i ] == 0 ) continue ;
39+ const int unusedBits = codebook -> MaxBitSize - codebook -> Bits [i ];
40+
41+ const int start = codebook -> Codes [i ] << unusedBits ;
42+ const int length = 1 << unusedBits ;
43+ const int end = start + length ;
44+
45+ for (int j = start ; j < end ; j ++ )
46+ {
47+ dest [j ] = i ;
48+ }
49+ }
50+ }
51+
52+ HuffmanCodebook HuffmanScaleFactorsUnsigned [7 ] = {
53+ {0 },
54+ {ScaleFactorsA1Bits , ScaleFactorsA1Codes , ScaleFactorsA1Lookup , 2 , 1 , 0 , 1 , 2 , 1 },
55+ {ScaleFactorsA2Bits , ScaleFactorsA2Codes , ScaleFactorsA2Lookup , 4 , 1 , 0 , 2 , 4 , 3 },
56+ {ScaleFactorsA3Bits , ScaleFactorsA3Codes , ScaleFactorsA3Lookup , 8 , 1 , 0 , 3 , 8 , 6 },
57+ {ScaleFactorsA4Bits , ScaleFactorsA4Codes , ScaleFactorsA4Lookup , 16 , 1 , 0 , 4 , 16 , 8 },
58+ {ScaleFactorsA5Bits , ScaleFactorsA5Codes , ScaleFactorsA5Lookup , 32 , 1 , 0 , 5 , 32 , 8 },
59+ {ScaleFactorsA6Bits , ScaleFactorsA6Codes , ScaleFactorsA6Lookup , 64 , 1 , 0 , 6 , 64 , 8 },
60+ };
61+
62+ HuffmanCodebook HuffmanScaleFactorsSigned [6 ] = {
63+ {0 },
64+ {0 },
65+ {ScaleFactorsB2Bits , ScaleFactorsB2Codes , ScaleFactorsB2Lookup , 4 , 1 , 0 , 2 , 4 , 2 },
66+ {ScaleFactorsB3Bits , ScaleFactorsB3Codes , ScaleFactorsB3Lookup , 8 , 1 , 0 , 3 , 8 , 6 },
67+ {ScaleFactorsB4Bits , ScaleFactorsB4Codes , ScaleFactorsB4Lookup , 16 , 1 , 0 , 4 , 16 , 8 },
68+ {ScaleFactorsB5Bits , ScaleFactorsB5Codes , ScaleFactorsB5Lookup , 32 , 1 , 0 , 5 , 32 , 8 },
69+ };
70+
71+ HuffmanCodebook HuffmanSpectrum [2 ][8 ][4 ] = {
72+ {
73+ {0 },
74+ {0 },
75+ {
76+ {SpectrumA21Bits , SpectrumA21Codes , SpectrumA21Lookup , 16 , 2 , 1 , 2 , 4 , 3 },
77+ {SpectrumA22Bits , SpectrumA22Codes , SpectrumA22Lookup , 256 , 4 , 2 , 2 , 4 , 8 },
78+ {SpectrumA23Bits , SpectrumA23Codes , SpectrumA23Lookup , 256 , 4 , 2 , 2 , 4 , 9 },
79+ {SpectrumA24Bits , SpectrumA24Codes , SpectrumA24Lookup , 256 , 4 , 2 , 2 , 4 , 10 }
80+ },
81+ {
82+ {SpectrumA31Bits , SpectrumA31Codes , SpectrumA31Lookup , 64 , 2 , 1 , 3 , 8 , 7 },
83+ {SpectrumA32Bits , SpectrumA32Codes , SpectrumA32Lookup , 64 , 2 , 1 , 3 , 8 , 7 },
84+ {SpectrumA33Bits , SpectrumA33Codes , SpectrumA33Lookup , 64 , 2 , 1 , 3 , 8 , 8 },
85+ {SpectrumA34Bits , SpectrumA34Codes , SpectrumA34Lookup , 64 , 2 , 1 , 3 , 8 , 10 }
86+ },
87+ {
88+ {SpectrumA41Bits , SpectrumA41Codes , SpectrumA41Lookup , 256 , 2 , 1 , 4 , 16 , 9 },
89+ {SpectrumA42Bits , SpectrumA42Codes , SpectrumA42Lookup , 256 , 2 , 1 , 4 , 16 , 10 },
90+ {SpectrumA43Bits , SpectrumA43Codes , SpectrumA43Lookup , 256 , 2 , 1 , 4 , 16 , 10 },
91+ {SpectrumA44Bits , SpectrumA44Codes , SpectrumA44Lookup , 256 , 2 , 1 , 4 , 16 , 10 }
92+ },
93+ {
94+ {SpectrumA51Bits , SpectrumA51Codes , SpectrumA51Lookup , 32 , 1 , 0 , 5 , 32 , 6 },
95+ {SpectrumA52Bits , SpectrumA52Codes , SpectrumA52Lookup , 32 , 1 , 0 , 5 , 32 , 6 },
96+ {SpectrumA53Bits , SpectrumA53Codes , SpectrumA53Lookup , 32 , 1 , 0 , 5 , 32 , 7 },
97+ {SpectrumA54Bits , SpectrumA54Codes , SpectrumA54Lookup , 32 , 1 , 0 , 5 , 32 , 8 }
98+ },
99+ {
100+ {SpectrumA61Bits , SpectrumA61Codes , SpectrumA61Lookup , 64 , 1 , 0 , 6 , 64 , 7 },
101+ {SpectrumA62Bits , SpectrumA62Codes , SpectrumA62Lookup , 64 , 1 , 0 , 6 , 64 , 7 },
102+ {SpectrumA63Bits , SpectrumA63Codes , SpectrumA63Lookup , 64 , 1 , 0 , 6 , 64 , 8 },
103+ {SpectrumA64Bits , SpectrumA64Codes , SpectrumA64Lookup , 64 , 1 , 0 , 6 , 64 , 9 }
104+ },
105+ {
106+ {SpectrumA71Bits , SpectrumA71Codes , SpectrumA71Lookup , 128 , 1 , 0 , 7 , 128 , 8 },
107+ {SpectrumA72Bits , SpectrumA72Codes , SpectrumA72Lookup , 128 , 1 , 0 , 7 , 128 , 8 },
108+ {SpectrumA73Bits , SpectrumA73Codes , SpectrumA73Lookup , 128 , 1 , 0 , 7 , 128 , 9 },
109+ {SpectrumA74Bits , SpectrumA74Codes , SpectrumA74Lookup , 128 , 1 , 0 , 7 , 128 , 10 }
110+ }
111+ },
112+ {
113+ {0 },
114+ {0 },
115+ {
116+ {0 },
117+ {SpectrumB22Bits , SpectrumB22Codes , SpectrumB22Lookup , 256 , 4 , 2 , 2 , 4 , 10 },
118+ {SpectrumB23Bits , SpectrumB23Codes , SpectrumB23Lookup , 256 , 4 , 2 , 2 , 4 , 10 },
119+ {SpectrumB24Bits , SpectrumB24Codes , SpectrumB24Lookup , 256 , 4 , 2 , 2 , 4 , 10 }
120+ },
121+ {
122+ {0 },
123+ {SpectrumB32Bits , SpectrumB32Codes , SpectrumB32Lookup , 64 , 2 , 1 , 3 , 8 , 9 },
124+ {SpectrumB33Bits , SpectrumB33Codes , SpectrumB33Lookup , 64 , 2 , 1 , 3 , 8 , 10 },
125+ {SpectrumB34Bits , SpectrumB34Codes , SpectrumB34Lookup , 64 , 2 , 1 , 3 , 8 , 10 }
126+ },
127+ {
128+ {0 },
129+ {SpectrumB42Bits , SpectrumB42Codes , SpectrumB42Lookup , 256 , 2 , 1 , 4 , 16 , 10 },
130+ {SpectrumB43Bits , SpectrumB43Codes , SpectrumB43Lookup , 256 , 2 , 1 , 4 , 16 , 10 },
131+ {SpectrumB44Bits , SpectrumB44Codes , SpectrumB44Lookup , 256 , 2 , 1 , 4 , 16 , 10 }
132+ },
133+ {
134+ {0 },
135+ {SpectrumB52Bits , SpectrumB52Codes , SpectrumB52Lookup , 32 , 1 , 0 , 5 , 32 , 7 },
136+ {SpectrumB53Bits , SpectrumB53Codes , SpectrumB53Lookup , 32 , 1 , 0 , 5 , 32 , 8 },
137+ {SpectrumB54Bits , SpectrumB54Codes , SpectrumB54Lookup , 32 , 1 , 0 , 5 , 32 , 9 }
138+ },
139+ {
140+ {0 },
141+ {SpectrumB62Bits , SpectrumB62Codes , SpectrumB62Lookup , 64 , 1 , 0 , 6 , 64 , 8 },
142+ {SpectrumB63Bits , SpectrumB63Codes , SpectrumB63Lookup , 64 , 1 , 0 , 6 , 64 , 9 },
143+ {SpectrumB64Bits , SpectrumB64Codes , SpectrumB64Lookup , 64 , 1 , 0 , 6 , 64 , 10 }
144+ },
145+ {
146+ {0 },
147+ {SpectrumB72Bits , SpectrumB72Codes , SpectrumB72Lookup , 128 , 1 , 0 , 7 , 128 , 9 },
148+ {SpectrumB73Bits , SpectrumB73Codes , SpectrumB73Lookup , 128 , 1 , 0 , 7 , 128 , 10 },
149+ {SpectrumB74Bits , SpectrumB74Codes , SpectrumB74Lookup , 128 , 1 , 0 , 7 , 128 , 10 }
150+ }
151+ }
152+ };
0 commit comments