]> git.sesse.net Git - ffmpeg/blob - libavcodec/qdm2data.h
fix some crashes when missing frames
[ffmpeg] / libavcodec / qdm2data.h
1 /*
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
7  *
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.
12  *
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.
17  *
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
21  *
22  */
23
24  /**
25  * @file qdm2data.h
26  * Various QDM2 tables.
27  */
28
29 #ifndef QDM2DATA_H
30 #define QDM2DATA_H
31
32 /** VLC TABLES **/
33
34 /* values in this table range from -1..23; adjust retrieved value by -1 */
35 static 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
39 };
40
41 static 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
43 };
44
45 /* values in this table range from -1..36; adjust retrieved value by -1 */
46 static 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
52 };
53
54 static 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,
57     12, 0, 13, 0, 13
58 };
59
60 /* values in this table range from -1..5; adjust retrieved value by -1 */
61 static uint8_t vlc_tab_run_huffcodes[6] = {
62     0x1f, 0x00, 0x01, 0x03, 0x07, 0x0f
63 };
64
65 static uint8_t vlc_tab_run_huffbits[6] = {
66     5, 1, 2, 3, 4, 5
67 };
68
69 /* values in this table range from -1..19; adjust retrieved value by -1 */
70 static 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
74 };
75
76 static 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
78 };
79
80 /* values in this table range from -1..23; adjust retrieved value by -1 */
81 static 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
85 };
86
87 static 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
89 };
90
91 /* values in this table range from -1..23; adjust retrieved value by -1 */
92 static 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
96 };
97
98 static 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
100 };
101
102 /* values in this table range from -1..8; adjust retrieved value by -1 */
103 static uint8_t vlc_tab_type30_huffcodes[9] = {
104     0x3c, 0x06, 0x00, 0x01, 0x03, 0x02, 0x04, 0x0c, 0x1c
105 };
106
107 static uint8_t vlc_tab_type30_huffbits[9] = {
108     6, 3, 3, 2, 2, 3, 4, 5, 6
109 };
110
111 /* values in this table range from -1..9; adjust retrieved value by -1 */
112 static uint8_t vlc_tab_type34_huffcodes[10] = {
113     0x18, 0x00, 0x01, 0x04, 0x05, 0x07, 0x03, 0x02, 0x06, 0x08
114 };
115
116 static uint8_t vlc_tab_type34_huffbits[10] = {
117     5, 4, 3, 3, 3, 3, 3, 3, 3, 5
118 };
119
120 /* values in this table range from -1..22; adjust retrieved value by -1 */
121 static 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
125 };
126
127 static 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
129 };
130
131 /* values in this table range from -1..27; adjust retrieved value by -1 */
132 static 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
137 };
138
139 static 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
142 };
143
144 /* values in this table range from -1..31; adjust retrieved value by -1 */
145 static 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
150 };
151
152 static 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
155 };
156
157 /* values in this table range from -1..34; adjust retrieved value by -1 */
158 static 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
164 };
165
166 static 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,
169     12, 13, 14
170 };
171
172 /* values in this table range from -1..37; adjust retrieved value by -1 */
173 static 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
179 };
180
181 static 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
185 };
186
187 /** FFT TABLES **/
188
189 /* values in this table range from -1..27; adjust retrieved value by -1 */
190 static 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
195 };
196
197 static 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
200 };
201
202 /* values in this table range from -1..19; adjust retrieved value by -1 */
203 static 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
207 };
208
209 static 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
211 };
212
213 /* values in this table range from -1..6; adjust retrieved value by -1 */
214 static uint8_t fft_stereo_exp_huffcodes[7] = {
215     0x3e, 0x01, 0x00, 0x02, 0x06, 0x0e, 0x1e
216 };
217
218 static uint8_t fft_stereo_exp_huffbits[7] = {
219     6, 1, 2, 3, 4, 5, 6
220 };
221
222 /* values in this table range from -1..8; adjust retrieved value by -1 */
223 static uint8_t fft_stereo_phase_huffcodes[9] = {
224     0x35, 0x02, 0x00, 0x01, 0x0d, 0x15, 0x05, 0x09, 0x03
225 };
226
227 static uint8_t fft_stereo_phase_huffbits[9] = {
228     6, 2, 2, 4, 4, 6, 5, 4, 2
229 };
230
231 static const int fft_cutoff_index_table[4][2] = {
232     { 1, 2 }, {-1, 0 }, {-1,-2 }, { 0, 0 }
233 };
234
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,
252 };
253
254 static uint8_t last_coeff[3] = {
255     4, 7, 10
256 };
257
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 }
262 };
263
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 } }
295 };
296
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 }
301 };
302
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 },
307     { -50,  -9,  0, -19 },
308     { -16,  -6,  0, -12 },
309     { -11,  -4,  0,  -8 },
310     {  -8,  -3,  0,  -6 },
311     {  -7,  -3,  0,  -5 },
312     {  -6,  -2,  0,  -4 },
313     {  -5,  -2,  0,  -3 },
314     {  -4,  -1,  0,  -3 },
315     {  -4,  -1,  0,  -2 },
316     {  -3,  -1,  0,  -2 },
317     {  -3,  -1,  0,  -2 },
318     {  -3,  -1,  0,  -2 },
319     {  -2,  -1,  0,  -1 },
320     {  -2,  -1,  0,  -1 },
321     {  -2,  -1,  0,  -1 },
322     {  -2,   0,  0,  -1 },
323     {  -2,   0,  0,  -1 },
324     {  -1,   0,  0,  -1 },
325     {  -1,   0,  0,  -1 },
326     {  -1,   0,  0,  -1 },
327     {  -1,   0,  0,  -1 },
328     {  -1,   0,  0,  -1 },
329     {  -1,   0,  0,  -1 },
330     {  -1,   0,  0,  -1 },
331     {  -1,   0,  0,   0 },
332     {  -1,   0,  0,   0 },
333     {  -1,   0,  0,   0 },
334     {  -1,   0,  0,   0 }
335 };
336
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
342     },
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
345     },
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
348     },
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
351     },
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
354     },
355 };
356
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
363 };
364
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 } },
382
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 } },
399
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 } },
416
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 } }
433 };
434
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,
453   }, {
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
471 } };
472
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,
479       .009607345f },
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,
485       .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,
491       .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,
497       .000000000f }
498 };
499
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,
505 };
506
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
510 };
511
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 }
516 };
517
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,
521 };
522
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,
526 };
527
528 #endif /* QDM2DATA_H */