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