2 * QDM2 compatible decoder
3 * Copyright (c) 2003 Ewald Snel
4 * Copyright (c) 2005 Benjamin Larsson
5 * Copyright (c) 2005 Alex Beregszaszi
6 * Copyright (c) 2005 Roberto Togni
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * Various QDM2 tables.
34 /* values in this table range from -1..23; adjust retrieved value by -1 */
35 static const uint16_t vlc_tab_level_huffcodes[24] = {
36 0x037c, 0x0004, 0x003c, 0x004c, 0x003a, 0x002c, 0x001c, 0x001a,
37 0x0024, 0x0014, 0x0001, 0x0002, 0x0000, 0x0003, 0x0007, 0x0005,
38 0x0006, 0x0008, 0x0009, 0x000a, 0x000c, 0x00fc, 0x007c, 0x017c
41 static const uint8_t vlc_tab_level_huffbits[24] = {
42 10, 6, 7, 7, 6, 6, 6, 6, 6, 5, 4, 4, 4, 3, 3, 3, 3, 4, 4, 5, 7, 8, 9, 10
45 /* values in this table range from -1..36; adjust retrieved value by -1 */
46 static const uint16_t vlc_tab_diff_huffcodes[37] = {
47 0x1c57, 0x0004, 0x0000, 0x0001, 0x0003, 0x0002, 0x000f, 0x000e,
48 0x0007, 0x0016, 0x0037, 0x0027, 0x0026, 0x0066, 0x0006, 0x0097,
49 0x0046, 0x01c6, 0x0017, 0x0786, 0x0086, 0x0257, 0x00d7, 0x0357,
50 0x00c6, 0x0386, 0x0186, 0x0000, 0x0157, 0x0c57, 0x0057, 0x0000,
51 0x0b86, 0x0000, 0x1457, 0x0000, 0x0457
54 static const uint8_t vlc_tab_diff_huffbits[37] = {
55 13, 3, 3, 2, 3, 3, 4, 4, 6, 5, 6, 6, 7, 7, 8, 8,
56 8, 9, 8, 11, 9, 10, 8, 10, 9, 12, 10, 0, 10, 13, 11, 0,
60 /* values in this table range from -1..5; adjust retrieved value by -1 */
61 static const uint8_t vlc_tab_run_huffcodes[6] = {
62 0x1f, 0x00, 0x01, 0x03, 0x07, 0x0f
65 static const uint8_t vlc_tab_run_huffbits[6] = {
69 /* values in this table range from -1..19; adjust retrieved value by -1 */
70 static const uint16_t vlc_tab_tone_level_idx_hi1_huffcodes[20] = {
71 0x5714, 0x000c, 0x0002, 0x0001, 0x0000, 0x0004, 0x0034, 0x0054,
72 0x0094, 0x0014, 0x0114, 0x0214, 0x0314, 0x0614, 0x0e14, 0x0f14,
73 0x2714, 0x0714, 0x1714, 0x3714
76 static const uint8_t vlc_tab_tone_level_idx_hi1_huffbits[20] = {
77 15, 4, 2, 1, 3, 5, 6, 7, 8, 10, 10, 11, 11, 12, 12, 12, 14, 14, 15, 14
80 /* values in this table range from -1..23; adjust retrieved value by -1 */
81 static const uint16_t vlc_tab_tone_level_idx_mid_huffcodes[24] = {
82 0x0fea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
83 0x0000, 0x0000, 0x0000, 0x0000, 0x03ea, 0x00ea, 0x002a, 0x001a,
84 0x0006, 0x0001, 0x0000, 0x0002, 0x000a, 0x006a, 0x01ea, 0x07ea
87 static const uint8_t vlc_tab_tone_level_idx_mid_huffbits[24] = {
88 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 9, 7, 5, 3, 1, 2, 4, 6, 8, 10, 12
91 /* values in this table range from -1..23; adjust retrieved value by -1 */
92 static const uint16_t vlc_tab_tone_level_idx_hi2_huffcodes[24] = {
93 0x0664, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0064, 0x00e4,
94 0x00a4, 0x0068, 0x0004, 0x0008, 0x0014, 0x0018, 0x0000, 0x0001,
95 0x0002, 0x0003, 0x000c, 0x0028, 0x0024, 0x0164, 0x0000, 0x0264
98 static const uint8_t vlc_tab_tone_level_idx_hi2_huffbits[24] = {
99 11, 0, 0, 0, 0, 0, 10, 8, 8, 7, 6, 6, 5, 5, 4, 2, 2, 2, 4, 7, 8, 9, 0, 11
102 /* values in this table range from -1..8; adjust retrieved value by -1 */
103 static const uint8_t vlc_tab_type30_huffcodes[9] = {
104 0x3c, 0x06, 0x00, 0x01, 0x03, 0x02, 0x04, 0x0c, 0x1c
107 static const uint8_t vlc_tab_type30_huffbits[9] = {
108 6, 3, 3, 2, 2, 3, 4, 5, 6
111 /* values in this table range from -1..9; adjust retrieved value by -1 */
112 static const uint8_t vlc_tab_type34_huffcodes[10] = {
113 0x18, 0x00, 0x01, 0x04, 0x05, 0x07, 0x03, 0x02, 0x06, 0x08
116 static const uint8_t vlc_tab_type34_huffbits[10] = {
117 5, 4, 3, 3, 3, 3, 3, 3, 3, 5
120 /* values in this table range from -1..22; adjust retrieved value by -1 */
121 static const uint16_t vlc_tab_fft_tone_offset_0_huffcodes[23] = {
122 0x038e, 0x0001, 0x0000, 0x0022, 0x000a, 0x0006, 0x0012, 0x0002,
123 0x001e, 0x003e, 0x0056, 0x0016, 0x000e, 0x0032, 0x0072, 0x0042,
124 0x008e, 0x004e, 0x00f2, 0x002e, 0x0036, 0x00c2, 0x018e
127 static const uint8_t vlc_tab_fft_tone_offset_0_huffbits[23] = {
128 10, 1, 2, 6, 4, 5, 6, 7, 6, 6, 7, 7, 8, 7, 8, 8, 9, 7, 8, 6, 6, 8, 10
131 /* values in this table range from -1..27; adjust retrieved value by -1 */
132 static const uint16_t vlc_tab_fft_tone_offset_1_huffcodes[28] = {
133 0x07a4, 0x0001, 0x0020, 0x0012, 0x001c, 0x0008, 0x0006, 0x0010,
134 0x0000, 0x0014, 0x0004, 0x0032, 0x0070, 0x000c, 0x0002, 0x003a,
135 0x001a, 0x002c, 0x002a, 0x0022, 0x0024, 0x000a, 0x0064, 0x0030,
136 0x0062, 0x00a4, 0x01a4, 0x03a4
139 static const uint8_t vlc_tab_fft_tone_offset_1_huffbits[28] = {
140 11, 1, 6, 6, 5, 4, 3, 6, 6, 5, 6, 6, 7, 6, 6, 6,
141 6, 6, 6, 7, 8, 6, 7, 7, 7, 9, 10, 11
144 /* values in this table range from -1..31; adjust retrieved value by -1 */
145 static const uint16_t vlc_tab_fft_tone_offset_2_huffcodes[32] = {
146 0x1760, 0x0001, 0x0000, 0x0082, 0x000c, 0x0006, 0x0003, 0x0007,
147 0x0008, 0x0004, 0x0010, 0x0012, 0x0022, 0x001a, 0x0000, 0x0020,
148 0x000a, 0x0040, 0x004a, 0x006a, 0x002a, 0x0042, 0x0002, 0x0060,
149 0x00aa, 0x00e0, 0x00c2, 0x01c2, 0x0160, 0x0360, 0x0760, 0x0f60
152 static const uint8_t vlc_tab_fft_tone_offset_2_huffbits[32] = {
153 13, 2, 0, 8, 4, 3, 3, 3, 4, 4, 5, 5, 6, 5, 7, 7,
154 7, 7, 7, 7, 8, 8, 8, 9, 8, 8, 9, 9, 10, 11, 13, 12
157 /* values in this table range from -1..34; adjust retrieved value by -1 */
158 static const uint16_t vlc_tab_fft_tone_offset_3_huffcodes[35] = {
159 0x33ea, 0x0005, 0x0000, 0x000c, 0x0000, 0x0006, 0x0003, 0x0008,
160 0x0002, 0x0001, 0x0004, 0x0007, 0x001a, 0x000f, 0x001c, 0x002c,
161 0x000a, 0x001d, 0x002d, 0x002a, 0x000d, 0x004c, 0x008c, 0x006a,
162 0x00cd, 0x004d, 0x00ea, 0x020c, 0x030c, 0x010c, 0x01ea, 0x07ea,
163 0x0bea, 0x03ea, 0x13ea
166 static const uint8_t vlc_tab_fft_tone_offset_3_huffbits[35] = {
167 14, 4, 0, 10, 4, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6,
168 6, 5, 6, 7, 7, 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 11,
172 /* values in this table range from -1..37; adjust retrieved value by -1 */
173 static const uint16_t vlc_tab_fft_tone_offset_4_huffcodes[38] = {
174 0x5282, 0x0016, 0x0000, 0x0136, 0x0004, 0x0000, 0x0007, 0x000a,
175 0x000e, 0x0003, 0x0001, 0x000d, 0x0006, 0x0009, 0x0012, 0x0005,
176 0x0025, 0x0022, 0x0015, 0x0002, 0x0076, 0x0035, 0x0042, 0x00c2,
177 0x0182, 0x00b6, 0x0036, 0x03c2, 0x0482, 0x01c2, 0x0682, 0x0882,
178 0x0a82, 0x0082, 0x0282, 0x1282, 0x3282, 0x2282
181 static const uint8_t vlc_tab_fft_tone_offset_4_huffbits[38] = {
182 15, 6, 0, 9, 3, 3, 3, 4, 4, 3, 4, 4, 5, 4, 5, 6,
183 6, 6, 6, 8, 7, 6, 8, 9, 9, 8, 9, 10, 11, 10, 11, 12,
184 12, 12, 14, 15, 14, 14
189 /* values in this table range from -1..27; adjust retrieved value by -1 */
190 static const uint16_t fft_level_exp_alt_huffcodes[28] = {
191 0x1ec6, 0x0006, 0x00c2, 0x0142, 0x0242, 0x0246, 0x00c6, 0x0046,
192 0x0042, 0x0146, 0x00a2, 0x0062, 0x0026, 0x0016, 0x000e, 0x0005,
193 0x0004, 0x0003, 0x0000, 0x0001, 0x000a, 0x0012, 0x0002, 0x0022,
194 0x01c6, 0x02c6, 0x06c6, 0x0ec6
197 static const uint8_t fft_level_exp_alt_huffbits[28] = {
198 13, 7, 8, 9, 10, 10, 10, 10, 10, 9, 8, 7, 6, 5, 4, 3,
199 3, 2, 3, 3, 4, 5, 7, 8, 9, 11, 12, 13
202 /* values in this table range from -1..19; adjust retrieved value by -1 */
203 static const uint16_t fft_level_exp_huffcodes[20] = {
204 0x0f24, 0x0001, 0x0002, 0x0000, 0x0006, 0x0005, 0x0007, 0x000c,
205 0x000b, 0x0014, 0x0013, 0x0004, 0x0003, 0x0023, 0x0064, 0x00a4,
206 0x0024, 0x0124, 0x0324, 0x0724
209 static const uint8_t fft_level_exp_huffbits[20] = {
210 12, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 9, 10, 11, 12
213 /* values in this table range from -1..6; adjust retrieved value by -1 */
214 static const uint8_t fft_stereo_exp_huffcodes[7] = {
215 0x3e, 0x01, 0x00, 0x02, 0x06, 0x0e, 0x1e
218 static const uint8_t fft_stereo_exp_huffbits[7] = {
222 /* values in this table range from -1..8; adjust retrieved value by -1 */
223 static const uint8_t fft_stereo_phase_huffcodes[9] = {
224 0x35, 0x02, 0x00, 0x01, 0x0d, 0x15, 0x05, 0x09, 0x03
227 static const uint8_t fft_stereo_phase_huffbits[9] = {
228 6, 2, 2, 4, 4, 6, 5, 4, 2
231 static const int fft_cutoff_index_table[4][2] = {
232 { 1, 2 }, {-1, 0 }, {-1,-2 }, { 0, 0 }
235 static const int16_t fft_level_index_table[256] = {
236 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
237 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
238 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
239 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
240 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
241 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
242 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
243 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
244 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
245 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
246 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
247 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
248 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
249 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
250 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
251 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
254 static uint8_t last_coeff[3] = {
258 static uint8_t coeff_per_sb_for_avg[3][30] = {
259 { 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
260 { 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 },
261 { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9 }
264 static uint32_t dequant_table[3][10][30] = {
265 { { 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
266 { 0, 256, 256, 205, 154, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
267 { 0, 0, 0, 51, 102, 154, 205, 256, 238, 219, 201, 183, 165, 146, 128, 110, 91, 73, 55, 37, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
268 { 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 55, 73, 91, 110, 128, 146, 165, 183, 201, 219, 238, 256, 228, 199, 171, 142, 114, 85, 57, 28 },
269 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
270 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
271 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
272 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
273 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
274 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
275 { { 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
276 { 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
277 { 0, 0, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
278 { 0, 0, 0, 85, 171, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
279 { 0, 0, 0, 0, 0, 0, 85, 171, 256, 219, 183, 146, 110, 73, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
280 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 73, 110, 146, 183, 219, 256, 228, 199, 171, 142, 114, 85, 57, 28, 0, 0, 0, 0, 0, 0 },
281 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 57, 85, 114, 142, 171, 199, 228, 256, 213, 171, 128, 85, 43 },
282 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
283 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
284 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
285 { { 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
286 { 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
287 { 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
288 { 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
289 { 0, 0, 0, 0, 256, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
290 { 0, 0, 0, 0, 0, 0, 256, 171, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
291 { 0, 0, 0, 0, 0, 0, 0, 85, 171, 256, 192, 128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
292 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 128, 192, 256, 205, 154, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
293 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 102, 154, 205, 256, 213, 171, 128, 85, 43, 0, 0, 0, 0, 0, 0 },
294 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 85, 128, 171, 213, 256, 213, 171, 128, 85, 43 } }
297 static uint8_t coeff_per_sb_for_dequant[3][30] = {
298 { 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
299 { 0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 },
300 { 0, 1, 2, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9 }
303 /* first index is subband, 2nd index is 0, 1 or 3 (2 is unused) */
304 static int8_t tone_level_idx_offset_table[30][4] = {
305 { -50, -50, 0, -50 },
306 { -50, -50, 0, -50 },
337 /* all my samples have 1st index 0 or 1 */
338 /* second index is subband, only indexes 0-29 seem to be used */
339 static int8_t coding_method_table[5][30] = {
340 { 34, 30, 24, 24, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10,
341 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
343 { 34, 30, 24, 24, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10,
344 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
346 { 34, 30, 30, 30, 24, 24, 16, 16, 16, 16, 16, 16, 10, 10, 10,
347 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
349 { 34, 34, 30, 30, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16,
350 16, 16, 16, 16, 16, 16, 16, 10, 10, 10, 10, 10, 10, 10, 10
352 { 34, 34, 30, 30, 30, 30, 30, 30, 24, 24, 24, 24, 24, 24, 24,
353 24, 24, 24, 24, 24, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
357 static const int vlc_stage3_values[60] = {
358 0, 1, 2, 3, 4, 6, 8, 10, 12, 16, 20, 24,
359 28, 36, 44, 52, 60, 76, 92, 108, 124, 156, 188, 220,
360 252, 316, 380, 444, 508, 636, 764, 892, 1020, 1276, 1532, 1788,
361 2044, 2556, 3068, 3580, 4092, 5116, 6140, 7164, 8188, 10236, 12284, 14332,
362 16380, 20476, 24572, 28668, 32764, 40956, 49148, 57340, 65532, 81916, 98300,114684
365 static const float fft_tone_sample_table[4][16][5] = {
366 { { .0100000000f,-.0037037037f,-.0020000000f,-.0069444444f,-.0018416207f },
367 { .0416666667f, .0000000000f, .0000000000f,-.0208333333f,-.0123456791f },
368 { .1250000000f, .0558035709f, .0330687836f,-.0164473690f,-.0097465888f },
369 { .1562500000f, .0625000000f, .0370370370f,-.0062500000f,-.0037037037f },
370 { .1996007860f, .0781250000f, .0462962948f, .0022727272f, .0013468013f },
371 { .2000000000f, .0625000000f, .0370370373f, .0208333333f, .0074074073f },
372 { .2127659619f, .0555555556f, .0329218097f, .0208333333f, .0123456791f },
373 { .2173913121f, .0473484844f, .0280583613f, .0347222239f, .0205761325f },
374 { .2173913121f, .0347222239f, .0205761325f, .0473484844f, .0280583613f },
375 { .2127659619f, .0208333333f, .0123456791f, .0555555556f, .0329218097f },
376 { .2000000000f, .0208333333f, .0074074073f, .0625000000f, .0370370370f },
377 { .1996007860f, .0022727272f, .0013468013f, .0781250000f, .0462962948f },
378 { .1562500000f,-.0062500000f,-.0037037037f, .0625000000f, .0370370370f },
379 { .1250000000f,-.0164473690f,-.0097465888f, .0558035709f, .0330687836f },
380 { .0416666667f,-.0208333333f,-.0123456791f, .0000000000f, .0000000000f },
381 { .0100000000f,-.0069444444f,-.0018416207f,-.0037037037f,-.0020000000f } },
383 { { .0050000000f,-.0200000000f, .0125000000f,-.3030303030f, .0020000000f },
384 { .1041666642f, .0400000000f,-.0250000000f, .0333333333f,-.0200000000f },
385 { .1250000000f, .0100000000f, .0142857144f,-.0500000007f,-.0200000000f },
386 { .1562500000f,-.0006250000f,-.00049382716f,-.000625000f,-.00049382716f },
387 { .1562500000f,-.0006250000f,-.00049382716f,-.000625000f,-.00049382716f },
388 { .1250000000f,-.0500000000f,-.0200000000f, .0100000000f, .0142857144f },
389 { .1041666667f, .0333333333f,-.0200000000f, .0400000000f,-.0250000000f },
390 { .0050000000f,-.3030303030f, .0020000001f,-.0200000000f, .0125000000f },
391 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
392 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
393 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
394 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
395 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
396 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
397 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
398 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } },
400 { { .1428571492f, .1250000000f,-.0285714287f,-.0357142873f, .0208333333f },
401 { .1818181818f, .0588235296f, .0333333333f, .0212765951f, .0100000000f },
402 { .1818181818f, .0212765951f, .0100000000f, .0588235296f, .0333333333f },
403 { .1428571492f,-.0357142873f, .0208333333f, .1250000000f,-.0285714287f },
404 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
405 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
406 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
407 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
408 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
409 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
410 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
411 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
412 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
413 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
414 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
415 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } },
417 { { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
418 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
419 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
420 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
421 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
422 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
423 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
424 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
425 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
426 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
427 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
428 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
429 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
430 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
431 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f },
432 { .0000000000f, .0000000000f, .0000000000f, .0000000000f, .0000000000f } }
435 static const float fft_tone_level_table[2][64] = { {
436 /* pow ~ (i > 46) ? 0 : (((((i & 1) ? 431 : 304) << (i >> 1))) / 1024.0); */
437 0.17677669f, 0.42677650f, 0.60355347f, 0.85355347f,
438 1.20710683f, 1.68359375f, 2.37500000f, 3.36718750f,
439 4.75000000f, 6.73437500f, 9.50000000f, 13.4687500f,
440 19.0000000f, 26.9375000f, 38.0000000f, 53.8750000f,
441 76.0000000f, 107.750000f, 152.000000f, 215.500000f,
442 304.000000f, 431.000000f, 608.000000f, 862.000000f,
443 1216.00000f, 1724.00000f, 2432.00000f, 3448.00000f,
444 4864.00000f, 6896.00000f, 9728.00000f, 13792.0000f,
445 19456.0000f, 27584.0000f, 38912.0000f, 55168.0000f,
446 77824.0000f, 110336.000f, 155648.000f, 220672.000f,
447 311296.000f, 441344.000f, 622592.000f, 882688.000f,
448 1245184.00f, 1765376.00f, 2490368.00f, 0.00000000f,
449 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
450 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
451 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
452 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
454 /* pow = (i > 45) ? 0 : ((((i & 1) ? 431 : 304) << (i >> 1)) / 512.0); */
455 0.59375000f, 0.84179688f, 1.18750000f, 1.68359375f,
456 2.37500000f, 3.36718750f, 4.75000000f, 6.73437500f,
457 9.50000000f, 13.4687500f, 19.0000000f, 26.9375000f,
458 38.0000000f, 53.8750000f, 76.0000000f, 107.750000f,
459 152.000000f, 215.500000f, 304.000000f, 431.000000f,
460 608.000000f, 862.000000f, 1216.00000f, 1724.00000f,
461 2432.00000f, 3448.00000f, 4864.00000f, 6896.00000f,
462 9728.00000f, 13792.0000f, 19456.0000f, 27584.0000f,
463 38912.0000f, 55168.0000f, 77824.0000f, 110336.000f,
464 155648.000f, 220672.000f, 311296.000f, 441344.000f,
465 622592.000f, 882688.000f, 1245184.00f, 1765376.00f,
466 2490368.00f, 3530752.00f, 0.00000000f, 0.00000000f,
467 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
468 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
469 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
470 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f
473 static const float fft_tone_envelope_table[4][31] = {
474 { .009607375f, .038060248f, .084265202f, .146446645f, .222214907f, .308658302f,
475 .402454883f, .500000060f, .597545207f, .691341758f, .777785182f, .853553414f,
476 .915734828f, .961939812f, .990392685f, 1.00000000f, .990392625f, .961939752f,
477 .915734768f, .853553295f, .777785063f, .691341639f, .597545087f, .500000000f,
478 .402454853f, .308658272f, .222214878f, .146446615f, .084265172f, .038060218f,
480 { .038060248f, .146446645f, .308658302f, .500000060f, .691341758f, .853553414f,
481 .961939812f, 1.00000000f, .961939752f, .853553295f, .691341639f, .500000000f,
482 .308658272f, .146446615f, .038060218f, .000000000f, .000000000f, .000000000f,
483 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
484 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
486 { .146446645f, .500000060f, .853553414f, 1.00000000f, .853553295f, .500000000f,
487 .146446615f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
488 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
489 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
490 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
492 { .500000060f, 1.00000000f, .500000000f, .000000000f, .000000000f, .000000000f,
493 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
494 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
495 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
496 .000000000f, .000000000f, .000000000f, .000000000f, .000000000f, .000000000f,
500 static const float sb_noise_attenuation[32] = {
501 0.0f, 0.0f, 0.3f, 0.4f, 0.5f, 0.7f, 1.0f, 1.0f,
502 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
503 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
504 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
507 static const uint8_t fft_subpackets[32] = {
508 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
509 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0
512 /* first index is joined_stereo, second index is 0 or 2 (1 is unused) */
513 static float dequant_1bit[2][3] = {
514 {-0.920000f, 0.000000f, 0.920000f },
515 {-0.890000f, 0.000000f, 0.890000f }
518 static const float type30_dequant[8] = {
519 -1.0f,-0.625f,-0.291666656732559f,0.0f,
520 0.25f,0.5f,0.75f,1.0f,
523 static const float type34_delta[10] = { // FIXME: covers 8 entries..
524 -1.0f,-0.60947573184967f,-0.333333343267441f,-0.138071194291115f,0.0f,
525 0.138071194291115f,0.333333343267441f,0.60947573184967f,1.0f,0.0f,
528 #endif /* QDM2DATA_H */