1/*
2 * WMA 9/3/PRO compatible decoder
3 * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion
4 * Copyright (c) 2008 - 2009 Sascha Sommer
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg 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.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg 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 FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23/**
24 * @file
25 * @brief tables for wmapro decoding
26 */
27
28#ifndef AVCODEC_WMAPRODATA_H
29#define AVCODEC_WMAPRODATA_H
30
31#include <stddef.h>
32#include <stdint.h>
33
34/**
35 * @brief frequencies to divide the frequency spectrum into scale factor bands
36 */
37static const uint16_t critical_freq[] = {
38     100,   200,    300,    400,    510,    630,    770,
39     920,  1080,   1270,   1480,   1720,   2000,   2320,
40    2700,  3150,   3700,   4400,   5300,   6400,   7700,
41    9500, 12000,  15500,  20675,  28575,  41375,  63875,
42};
43
44
45/**
46 * @name Huffman tables for DPCM-coded scale factors
47 * @{
48 */
49#define HUFF_SCALE_SIZE    121
50#define HUFF_SCALE_MAXBITS  19
51static const uint16_t scale_huffcodes[HUFF_SCALE_SIZE] = {
52    0xE639, 0xE6C2, 0xE6C1, 0xE6C0, 0xE63F, 0xE63E, 0xE63D, 0xE63C,
53    0xE63B, 0xE63A, 0xE638, 0xE637, 0xE636, 0xE635, 0xE634, 0xE632,
54    0xE633, 0xE620, 0x737B, 0xE610, 0xE611, 0xE612, 0xE613, 0xE614,
55    0xE615, 0xE616, 0xE617, 0xE618, 0xE619, 0xE61A, 0xE61B, 0xE61C,
56    0xE61D, 0xE61E, 0xE61F, 0xE6C3, 0xE621, 0xE622, 0xE623, 0xE624,
57    0xE625, 0xE626, 0xE627, 0xE628, 0xE629, 0xE62A, 0xE62B, 0xE62C,
58    0xE62D, 0xE62E, 0xE62F, 0xE630, 0xE631, 0x1CDF, 0x0E60, 0x0399,
59    0x00E7, 0x001D, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 0x0006,
60    0x0002, 0x0007, 0x0006, 0x000F, 0x0038, 0x0072, 0x039A, 0xE6C4,
61    0xE6C5, 0xE6C6, 0xE6C7, 0xE6C8, 0xE6C9, 0xE6CA, 0xE6CB, 0xE6CC,
62    0xE6CD, 0xE6CE, 0xE6CF, 0xE6D0, 0xE6D1, 0xE6D2, 0xE6D3, 0xE6D4,
63    0xE6D5, 0xE6D6, 0xE6D7, 0xE6D8, 0xE6D9, 0xE6DA, 0xE6DB, 0xE6DC,
64    0xE6DD, 0xE6DE, 0xE6DF, 0xE6E0, 0xE6E1, 0xE6E2, 0xE6E3, 0xE6E4,
65    0xE6E5, 0xE6E6, 0xE6E7, 0xE6E8, 0xE6E9, 0xE6EA, 0xE6EB, 0xE6EC,
66    0xE6ED, 0xE6EE, 0xE6EF, 0xE6F0, 0xE6F1, 0xE6F2, 0xE6F3, 0xE6F4,
67    0xE6F5,
68};
69
70static const uint8_t scale_huffbits[HUFF_SCALE_SIZE] = {
71    19, 19, 19, 19, 19, 19, 19, 19,
72    19, 19, 19, 19, 19, 19, 19, 19,
73    19, 19, 18, 19, 19, 19, 19, 19,
74    19, 19, 19, 19, 19, 19, 19, 19,
75    19, 19, 19, 19, 19, 19, 19, 19,
76    19, 19, 19, 19, 19, 19, 19, 19,
77    19, 19, 19, 19, 19, 16, 15, 13,
78    11,  8,  5,  2,  1,  3,  5,  6,
79     6,  7,  7,  7,  9, 10, 13, 19,
80    19, 19, 19, 19, 19, 19, 19, 19,
81    19, 19, 19, 19, 19, 19, 19, 19,
82    19, 19, 19, 19, 19, 19, 19, 19,
83    19, 19, 19, 19, 19, 19, 19, 19,
84    19, 19, 19, 19, 19, 19, 19, 19,
85    19, 19, 19, 19, 19, 19, 19, 19,
86    19,
87};
88/** @} */
89
90
91/**
92 * @name Huffman, run and level tables for runlevel-coded scale factors
93 * @{
94 */
95#define HUFF_SCALE_RL_SIZE    120
96#define HUFF_SCALE_RL_MAXBITS  21
97static const uint32_t scale_rl_huffcodes[HUFF_SCALE_RL_SIZE] = {
98    0x00010C, 0x000001, 0x10FE2A, 0x000003, 0x000003, 0x000001, 0x000013,
99    0x000020, 0x000029, 0x000014, 0x000016, 0x000045, 0x000049, 0x00002F,
100    0x000042, 0x00008E, 0x00008F, 0x000129, 0x000009, 0x00000D, 0x0004AC,
101    0x00002C, 0x000561, 0x0002E6, 0x00087C, 0x0002E2, 0x00095C, 0x000018,
102    0x000001, 0x000016, 0x000044, 0x00002A, 0x000007, 0x000159, 0x000143,
103    0x000128, 0x00015A, 0x00012D, 0x00002B, 0x0000A0, 0x000142, 0x00012A,
104    0x0002EF, 0x0004AF, 0x00087D, 0x004AE9, 0x0043F9, 0x000067, 0x000199,
105    0x002B05, 0x001583, 0x0021FE, 0x10FE2C, 0x000004, 0x00002E, 0x00010D,
106    0x00000A, 0x000244, 0x000017, 0x000245, 0x000011, 0x00010E, 0x00012C,
107    0x00002A, 0x00002F, 0x000121, 0x000046, 0x00087E, 0x0000BA, 0x000032,
108    0x0087F0, 0x0056DC, 0x0002EC, 0x0043FA, 0x002B6F, 0x004AE8, 0x0002B7,
109    0x10FE2B, 0x000001, 0x000051, 0x000010, 0x0002EE, 0x000B9C, 0x002576,
110    0x000198, 0x0056DD, 0x0000CD, 0x000AC0, 0x000170, 0x004AEF, 0x00002D,
111    0x0004AD, 0x0021FF, 0x0005CF, 0x002B04, 0x10FE29, 0x10FE28, 0x0002ED,
112    0x002E74, 0x021FC4, 0x004AEE, 0x010FE3, 0x087F17, 0x000000, 0x000097,
113    0x0002E3, 0x000ADA, 0x002575, 0x00173B, 0x0043FB, 0x002E75, 0x10FE2D,
114    0x0015B6, 0x00056C, 0x000057, 0x000123, 0x000120, 0x00021E, 0x000172,
115    0x0002B1,
116};
117
118static const uint8_t scale_rl_huffbits[HUFF_SCALE_RL_SIZE] = {
119     9,  2, 21,  2,  4,  5,  5,
120     6,  6,  7,  7,  7,  7,  6,
121     7,  8,  8,  9, 10, 10, 11,
122    12, 11, 12, 12, 12, 12, 11,
123     4,  5,  7,  8,  9,  9,  9,
124     9,  9,  9,  8,  8,  9,  9,
125    12, 11, 12, 15, 15, 13, 15,
126    14, 13, 14, 21,  5,  6,  9,
127    10, 10, 11, 10, 11,  9,  9,
128     6,  8,  9,  7, 12, 10, 12,
129    16, 15, 12, 15, 14, 15, 10,
130    21,  6,  7, 11, 12, 14, 14,
131    15, 15, 14, 12, 11, 15, 12,
132    11, 14, 13, 14, 21, 21, 12,
133    16, 18, 15, 17, 20,  7,  8,
134    12, 12, 14, 15, 15, 16, 21,
135    13, 11,  7,  9,  9, 10, 11,
136    10,
137};
138
139
140static const uint8_t scale_rl_run[HUFF_SCALE_RL_SIZE] = {
141     0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
142    16, 17, 18, 19, 20, 21, 22, 23, 24,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
143    10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,  0,  1,  2,  3,
144     4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
145    23, 24,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
146    17, 18, 19, 20, 21, 22, 23, 24,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
147     0,  1,  0,  1,  0,  1,
148};
149
150static const uint8_t scale_rl_level[HUFF_SCALE_RL_SIZE] = {
151     0,  0,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
152     2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
153     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,
154     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
155     4,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
156     5,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
157     7,  7,  8,  8,  9,  9,
158};
159/** @} */
160
161
162/**
163 * @name Huffman, run and level codes for runlevel-coded coefficients
164 * @{
165 */
166#define HUFF_COEF0_SIZE    272
167#define HUFF_COEF0_MAXBITS  21
168static const uint32_t coef0_huffcodes[HUFF_COEF0_SIZE] = {
169    0x00004A, 0x00002B, 0x000000, 0x000003, 0x000006, 0x000009, 0x00000F,
170    0x000010, 0x000016, 0x000011, 0x000016, 0x000028, 0x00002F, 0x000026,
171    0x000029, 0x000045, 0x000055, 0x00005D, 0x000042, 0x00004E, 0x000051,
172    0x00005E, 0x00008D, 0x0000A8, 0x0000AD, 0x000080, 0x000096, 0x00009F,
173    0x0000AA, 0x0000BE, 0x00011C, 0x000153, 0x000158, 0x000170, 0x000104,
174    0x00010D, 0x000105, 0x000103, 0x00012F, 0x000177, 0x000175, 0x000157,
175    0x000174, 0x000225, 0x00023B, 0x00020D, 0x00021F, 0x000281, 0x00027B,
176    0x000282, 0x0002AC, 0x0002FD, 0x00044F, 0x000478, 0x00044D, 0x0002EC,
177    0x00044E, 0x000564, 0x000409, 0x00040B, 0x000501, 0x000545, 0x0004F3,
178    0x000541, 0x00043B, 0x0004F1, 0x0004F4, 0x0008FD, 0x000A94, 0x000811,
179    0x000B88, 0x000B91, 0x000B93, 0x0008EA, 0x000899, 0x000B8A, 0x000972,
180    0x0009E5, 0x000A8F, 0x000A84, 0x000A8E, 0x000A00, 0x000830, 0x0008E8,
181    0x000B95, 0x000871, 0x00083A, 0x000814, 0x000873, 0x000BFE, 0x001728,
182    0x001595, 0x001712, 0x00102A, 0x001021, 0x001729, 0x00152E, 0x0013C3,
183    0x001721, 0x001597, 0x00151B, 0x0010F2, 0x001403, 0x001703, 0x001503,
184    0x001708, 0x0013C1, 0x00170E, 0x00170C, 0x0010E1, 0x0011EA, 0x001020,
185    0x001500, 0x0017FA, 0x001704, 0x001705, 0x0017F0, 0x0017FB, 0x0021E6,
186    0x002B2D, 0x0020C6, 0x002B29, 0x002E4A, 0x0023AC, 0x001519, 0x0023F3,
187    0x002B2C, 0x0021C0, 0x0017FE, 0x0023D7, 0x0017F9, 0x0012E7, 0x0013C0,
188    0x002261, 0x0023D3, 0x002057, 0x002056, 0x0021D2, 0x0020C7, 0x0023D2,
189    0x0020EC, 0x0044C0, 0x002FE2, 0x00475B, 0x002A03, 0x002FE3, 0x0021E2,
190    0x0021D0, 0x002A31, 0x002E13, 0x002E05, 0x0047E5, 0x00000E, 0x000024,
191    0x000088, 0x0000B9, 0x00010C, 0x000224, 0x0002B3, 0x000283, 0x0002ED,
192    0x00047B, 0x00041E, 0x00043D, 0x0004F5, 0x0005FD, 0x000A92, 0x000B96,
193    0x000838, 0x000971, 0x000B83, 0x000B80, 0x000BF9, 0x0011D3, 0x0011E8,
194    0x0011D7, 0x001527, 0x0011F8, 0x001073, 0x0010F0, 0x0010E4, 0x0017F8,
195    0x001062, 0x001402, 0x0017E3, 0x00151A, 0x001077, 0x00152B, 0x00170D,
196    0x0021D3, 0x002E41, 0x0013C2, 0x000029, 0x0000A9, 0x00025D, 0x000419,
197    0x000544, 0x000B8B, 0x0009E4, 0x0011D2, 0x001526, 0x001724, 0x0012E6,
198    0x00150B, 0x0017FF, 0x002E26, 0x002E4B, 0x002B28, 0x0021E3, 0x002A14,
199    0x00475A, 0x002E12, 0x000057, 0x00023E, 0x000A90, 0x000BF0, 0x001072,
200    0x001502, 0x0023D6, 0x0020ED, 0x002A30, 0x0044C7, 0x00008C, 0x00047F,
201    0x00152A, 0x002262, 0x002E04, 0x0000A1, 0x0005F9, 0x000173, 0x000875,
202    0x000171, 0x00152D, 0x0002E3, 0x0017E2, 0x0002AD, 0x0021C1, 0x000479,
203    0x0021E7, 0x00041F, 0x005C4E, 0x000543, 0x005C4F, 0x000A91, 0x00898D,
204    0x000B97, 0x008746, 0x000970, 0x008745, 0x000B85, 0x00A856, 0x00152F,
205    0x010E8E, 0x0010E5, 0x00A857, 0x00170F, 0x021D11, 0x002A58, 0x010E8F,
206    0x002E40, 0x021D13, 0x002A59, 0x043A25, 0x002A02, 0x043A21, 0x0044C1,
207    0x087448, 0x0047E4, 0x043A20, 0x00542A, 0x087449, 0x00898C,
208};
209
210static const uint8_t coef0_huffbits[HUFF_COEF0_SIZE] = {
211     8,  7,  2,  3,  3,  4,  4,
212     5,  5,  6,  6,  6,  6,  7,
213     7,  7,  7,  7,  8,  8,  8,
214     8,  8,  8,  8,  9,  9,  9,
215     9,  9,  9,  9,  9,  9, 10,
216    10, 10, 10, 10, 10, 10, 10,
217    10, 10, 10, 11, 11, 11, 11,
218    11, 11, 11, 11, 11, 11, 11,
219    11, 11, 12, 12, 12, 12, 12,
220    12, 12, 12, 12, 12, 12, 13,
221    12, 12, 12, 12, 12, 12, 13,
222    13, 13, 13, 13, 13, 13, 12,
223    12, 13, 13, 13, 13, 13, 13,
224    13, 13, 14, 14, 13, 13, 14,
225    13, 13, 14, 14, 14, 14, 14,
226    14, 14, 14, 14, 14, 13, 14,
227    14, 14, 14, 14, 14, 14, 15,
228    14, 15, 14, 14, 14, 14, 14,
229    14, 15, 14, 14, 14, 14, 14,
230    14, 14, 15, 15, 15, 15, 14,
231    15, 15, 15, 15, 15, 15, 15,
232    15, 15, 15, 15, 15,  4,  7,
233     8,  9, 10, 10, 10, 11, 11,
234    11, 12, 12, 12, 12, 12, 12,
235    13, 13, 13, 13, 13, 13, 13,
236    13, 13, 13, 14, 14, 14, 14,
237    14, 14, 14, 14, 14, 13, 14,
238    15, 14, 14,  6,  9, 11, 12,
239    12, 12, 13, 13, 13, 13, 14,
240    14, 14, 14, 14, 14, 15, 15,
241    15, 15,  7, 10, 12, 13, 14,
242    14, 14, 15, 15, 15,  8, 11,
243    13, 14, 15,  9, 12,  9, 13,
244    10, 13, 10, 14, 11, 15, 11,
245    15, 12, 15, 12, 15, 12, 16,
246    12, 17, 13, 17, 13, 17, 13,
247    18, 14, 17, 14, 19, 14, 18,
248    14, 19, 14, 20, 15, 20, 15,
249    21, 15, 20, 16, 21, 16,
250};
251
252
253#define HUFF_COEF1_SIZE    244
254#define HUFF_COEF1_MAXBITS  22
255static const uint32_t coef1_huffcodes[HUFF_COEF1_SIZE] = {
256    0x0001E2, 0x00007F, 0x000000, 0x000002, 0x000008, 0x00000E, 0x000019,
257    0x00002F, 0x000037, 0x000060, 0x00006C, 0x000095, 0x0000C6, 0x0000F0,
258    0x00012E, 0x000189, 0x0001A5, 0x0001F8, 0x000253, 0x00030A, 0x000344,
259    0x00034D, 0x0003F2, 0x0004BD, 0x0005D7, 0x00062A, 0x00068B, 0x000693,
260    0x000797, 0x00097D, 0x000BAB, 0x000C52, 0x000C5E, 0x000D21, 0x000D20,
261    0x000F1A, 0x000FCE, 0x000FD1, 0x0012F1, 0x001759, 0x0018AC, 0x0018A7,
262    0x0018BF, 0x001A2B, 0x001E52, 0x001E50, 0x001E31, 0x001FB8, 0x0025E6,
263    0x0025E7, 0x002EB4, 0x002EB7, 0x003169, 0x00315B, 0x00317C, 0x00316C,
264    0x0034CA, 0x00348D, 0x003F40, 0x003CA2, 0x003F76, 0x004BC3, 0x004BE5,
265    0x003F73, 0x004BF8, 0x004BF9, 0x006131, 0x00628B, 0x006289, 0x0062DA,
266    0x00628A, 0x0062D4, 0x006997, 0x0062B4, 0x006918, 0x00794D, 0x007E7B,
267    0x007E87, 0x007EEA, 0x00794E, 0x00699D, 0x007967, 0x00699F, 0x0062DB,
268    0x007E7A, 0x007EEB, 0x00BAC0, 0x0097C9, 0x00C537, 0x00C5AB, 0x00D233,
269    0x00D338, 0x00BAC1, 0x00D23D, 0x012F91, 0x00D339, 0x00FDC8, 0x00D23C,
270    0x00FDDC, 0x00FDC9, 0x00FDDD, 0x00D33C, 0x000003, 0x000016, 0x00003E,
271    0x0000C3, 0x0001A1, 0x000347, 0x00062E, 0x000BAA, 0x000F2D, 0x001A2A,
272    0x001E58, 0x00309B, 0x003CA3, 0x005D6A, 0x00629A, 0x006996, 0x00794F,
273    0x007EE5, 0x00BAD7, 0x00C5AA, 0x00C5F4, 0x00FDDF, 0x00FDDE, 0x018A20,
274    0x018A6D, 0x01A67B, 0x01A464, 0x025F21, 0x01F9E2, 0x01F9E3, 0x00000A,
275    0x00003D, 0x000128, 0x0003C7, 0x000C24, 0x0018A3, 0x002EB1, 0x003CB2,
276    0x00691F, 0x007E79, 0x000013, 0x0000BB, 0x00034E, 0x000D14, 0x0025FD,
277    0x004BE7, 0x000024, 0x000188, 0x0007EF, 0x000035, 0x000308, 0x0012F2,
278    0x00005C, 0x0003F6, 0x0025E0, 0x00006D, 0x000698, 0x000096, 0x000C25,
279    0x0000C7, 0x000F1B, 0x0000F3, 0x0012FF, 0x000174, 0x001A66, 0x0001A0,
280    0x003099, 0x0001E4, 0x00316B, 0x000252, 0x003F31, 0x00030B, 0x004BE6,
281    0x000346, 0x0062FB, 0x00034F, 0x007966, 0x0003F5, 0x007E86, 0x0005D4,
282    0x00C511, 0x00062C, 0x00C5F5, 0x000692, 0x00F299, 0x000795, 0x00F298,
283    0x0007E9, 0x018A21, 0x00097E, 0x0175AD, 0x000C27, 0x01A67A, 0x000C57,
284    0x02EB59, 0x000D22, 0x0314D9, 0x000F19, 0x03F3C2, 0x000FCD, 0x0348CB,
285    0x0012F8, 0x04BE41, 0x0018A0, 0x03F3C1, 0x0018A1, 0x04BE40, 0x0018B7,
286    0x0629B0, 0x001A64, 0x0D2329, 0x001E30, 0x03F3C3, 0x001F9F, 0x0BAD62,
287    0x001F99, 0x0FCF00, 0x00309A, 0x0629B1, 0x002EB6, 0x175AC3, 0x00314C,
288    0x069195, 0x003168, 0x0BAD63, 0x00348E, 0x175AC1, 0x003F30, 0x07E781,
289    0x003F41, 0x0D2328, 0x003F42, 0x1F9E03, 0x004BC2, 0x175AC2, 0x003F74,
290    0x175AC0, 0x005D61, 0x3F3C05, 0x006130, 0x3F3C04, 0x0062B5,
291};
292
293static const uint8_t coef1_huffbits[HUFF_COEF1_SIZE] = {
294     9,  7,  2,  3,  4,  4,  5,
295     6,  6,  7,  7,  8,  8,  8,
296     9,  9,  9,  9, 10, 10, 10,
297    10, 10, 11, 11, 11, 11, 11,
298    11, 12, 12, 12, 12, 12, 12,
299    12, 12, 12, 13, 13, 13, 13,
300    13, 13, 13, 13, 13, 13, 14,
301    14, 14, 14, 14, 14, 14, 14,
302    14, 14, 14, 14, 14, 15, 15,
303    14, 15, 15, 15, 15, 15, 15,
304    15, 15, 15, 15, 15, 15, 15,
305    15, 15, 15, 15, 15, 15, 15,
306    15, 15, 16, 16, 16, 16, 16,
307    16, 16, 16, 17, 16, 16, 16,
308    16, 16, 16, 16,  3,  5,  6,
309     8,  9, 10, 11, 12, 12, 13,
310    13, 14, 14, 15, 15, 15, 15,
311    15, 16, 16, 16, 16, 16, 17,
312    17, 17, 17, 18, 17, 17,  4,
313     6,  9, 10, 12, 13, 14, 14,
314    15, 15,  5,  8, 10, 12, 14,
315    15,  6,  9, 11,  6, 10, 13,
316     7, 10, 14,  7, 11,  8, 12,
317     8, 12,  8, 13,  9, 13,  9,
318    14,  9, 14, 10, 14, 10, 15,
319    10, 15, 10, 15, 10, 15, 11,
320    16, 11, 16, 11, 16, 11, 16,
321    11, 17, 12, 17, 12, 17, 12,
322    18, 12, 18, 12, 18, 12, 18,
323    13, 19, 13, 18, 13, 19, 13,
324    19, 13, 20, 13, 18, 13, 20,
325    13, 20, 14, 19, 14, 21, 14,
326    19, 14, 20, 14, 21, 14, 19,
327    14, 20, 14, 21, 15, 21, 14,
328    21, 15, 22, 15, 22, 15,
329};
330
331
332static const uint16_t coef0_run[HUFF_COEF0_SIZE] = {
333      0,   0,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,
334     12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
335     26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
336     40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,
337     54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,
338     68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
339     82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
340     96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
341    110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
342    124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137,
343    138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,   0,   1,
344      2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
345     16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
346     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,   0,   1,   2,   3,
347      4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,
348     18,  19,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   1,
349      2,   3,   4,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
350      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
351      1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,
352      1,   0,   1,   0,   1,   0,
353};
354
355static const float coef0_level[HUFF_COEF0_SIZE] = {
356      0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
357      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
358      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
359      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
360      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
361      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
362      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
363      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
364      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
365      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
366      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,
367      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
368      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
369      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,
370      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
371      3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   5,   5,
372      5,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,
373     11,  12,  12,  13,  13,  14,  14,  15,  15,  16,  16,  17,  17,  18,
374     18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,  24,  24,  25,
375     25,  26,  26,  27,  27,  28,
376};
377
378
379static const uint16_t coef1_run[HUFF_COEF1_SIZE] = {
380     0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
381    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
382    34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
383    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
384    70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
385    88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,  0,  1,  2,  3,  4,  5,
386     6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
387    24, 25, 26, 27, 28, 29,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  1,
388     2,  3,  4,  5,  0,  1,  2,  0,  1,  2,  0,  1,  2,  0,  1,  0,  1,  0,
389     1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,
390     1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,
391     1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,
392     1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,
393     1,  0,  1,  0,  1,  0,  1,  0,  0,  0,
394};
395
396static const float coef1_level[HUFF_COEF1_SIZE] = {
397     0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
398     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
399     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
400     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
401     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
402     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,
403     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
404     2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,
405     4,  4,  4,  4,  5,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  9,  9, 10,
406    10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19,
407    19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
408    28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37,
409    37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46,
410    46, 47, 47, 48, 48, 49, 49, 50, 51, 52,
411};
412/** @} */
413
414
415/**
416 * @name Huffman and vector lookup tables for vector-coded coefficients
417 * @{
418 */
419#define HUFF_VEC4_SIZE    127
420#define HUFF_VEC4_MAXBITS  14
421static const uint16_t vec4_huffcodes[HUFF_VEC4_SIZE] = {
422    0x0019, 0x0027, 0x00F2, 0x03BA, 0x0930, 0x1267, 0x0031, 0x0030,
423    0x0097, 0x0221, 0x058B, 0x0124, 0x00EB, 0x01D4, 0x03D8, 0x0584,
424    0x0364, 0x045F, 0x0F66, 0x0931, 0x24CD, 0x002F, 0x0039, 0x00E8,
425    0x02C3, 0x078A, 0x0037, 0x0029, 0x0084, 0x01B1, 0x00ED, 0x0086,
426    0x00F9, 0x03AB, 0x01EB, 0x08BC, 0x011E, 0x00F3, 0x0220, 0x058A,
427    0x00EC, 0x008E, 0x012B, 0x01EA, 0x0119, 0x04B0, 0x04B1, 0x03B8,
428    0x0691, 0x0365, 0x01ED, 0x049A, 0x0EA9, 0x0EA8, 0x08BD, 0x24CC,
429    0x0026, 0x0035, 0x00DB, 0x02C4, 0x07B2, 0x0038, 0x002B, 0x007F,
430    0x01B3, 0x00F4, 0x0091, 0x0116, 0x03BB, 0x0215, 0x0932, 0x002D,
431    0x002A, 0x008A, 0x01DE, 0x0028, 0x0020, 0x005C, 0x0090, 0x0068,
432    0x01EE, 0x00E9, 0x008D, 0x012A, 0x0087, 0x005D, 0x0118, 0x0349,
433    0x01EF, 0x01E3, 0x08B9, 0x00F0, 0x00D3, 0x0214, 0x049B, 0x00DA,
434    0x0089, 0x0125, 0x0217, 0x012D, 0x0690, 0x0094, 0x007D, 0x011F,
435    0x007E, 0x0059, 0x0127, 0x01A5, 0x0111, 0x00F8, 0x045D, 0x03B9,
436    0x0259, 0x0580, 0x02C1, 0x01DF, 0x0585, 0x0216, 0x0163, 0x01B0,
437    0x03C4, 0x08B8, 0x078B, 0x0755, 0x0581, 0x0F67, 0x0000,
438};
439
440static const uint8_t vec4_huffbits[HUFF_VEC4_SIZE] = {
441     5,  6,  8, 10, 12, 13,  6,  6,
442     8, 10, 11,  9,  8,  9, 10, 11,
443    10, 11, 12, 12, 14,  6,  6,  8,
444    10, 11,  6,  6,  8,  9,  8,  8,
445     8, 10,  9, 12,  9,  8, 10, 11,
446     8,  8,  9,  9,  9, 11, 11, 10,
447    11, 10,  9, 11, 12, 12, 12, 14,
448     6,  6,  8, 10, 11,  6,  6,  7,
449     9,  8,  8,  9, 10, 10, 12,  6,
450     6,  8,  9,  6,  6,  7,  8,  7,
451     9,  8,  8,  9,  8,  7,  9, 10,
452     9,  9, 12,  8,  8, 10, 11,  8,
453     8,  9, 10,  9, 11,  8,  7,  9,
454     7,  7,  9,  9,  9,  8, 11, 10,
455    10, 11, 10,  9, 11, 10,  9,  9,
456    10, 12, 11, 11, 11, 12,  1,
457};
458
459
460#define HUFF_VEC2_SIZE    137
461#define HUFF_VEC2_MAXBITS  12
462static const uint16_t vec2_huffcodes[HUFF_VEC2_SIZE] = {
463    0x055, 0x01C, 0x01A, 0x02B, 0x028, 0x067, 0x08B, 0x039,
464    0x170, 0x10D, 0x2A5, 0x047, 0x464, 0x697, 0x523, 0x8CB,
465    0x01B, 0x00E, 0x000, 0x010, 0x012, 0x036, 0x048, 0x04C,
466    0x0C2, 0x09B, 0x171, 0x03B, 0x224, 0x34A, 0x2D6, 0x019,
467    0x00F, 0x002, 0x014, 0x017, 0x006, 0x05D, 0x054, 0x0C7,
468    0x0B4, 0x192, 0x10E, 0x233, 0x043, 0x02C, 0x00F, 0x013,
469    0x006, 0x02F, 0x02C, 0x068, 0x077, 0x0DF, 0x111, 0x1A4,
470    0x16A, 0x2A4, 0x027, 0x011, 0x018, 0x02D, 0x00F, 0x04A,
471    0x040, 0x097, 0x01F, 0x11B, 0x022, 0x16D, 0x066, 0x035,
472    0x005, 0x02B, 0x049, 0x009, 0x075, 0x0CB, 0x0AA, 0x187,
473    0x106, 0x08A, 0x047, 0x060, 0x06E, 0x01D, 0x074, 0x0C4,
474    0x01E, 0x118, 0x1A7, 0x038, 0x042, 0x053, 0x076, 0x0A8,
475    0x0CA, 0x082, 0x110, 0x18D, 0x12D, 0x0B9, 0x0C8, 0x0DE,
476    0x01C, 0x0AB, 0x113, 0x18C, 0x10F, 0x09A, 0x0A5, 0x0B7,
477    0x11A, 0x186, 0x1A6, 0x259, 0x153, 0x18A, 0x193, 0x020,
478    0x10C, 0x046, 0x03A, 0x107, 0x149, 0x16C, 0x2D7, 0x225,
479    0x258, 0x316, 0x696, 0x317, 0x042, 0x522, 0x290, 0x8CA,
480    0x001,
481};
482
483static const uint8_t vec2_huffbits[HUFF_VEC2_SIZE] = {
484     7,  6,  6,  6,  7,  7,  8,  9,
485     9, 10, 10, 11, 11, 11, 12, 12,
486     6,  4,  5,  5,  6,  6,  7,  8,
487     8,  9,  9, 10, 10, 10, 11,  6,
488     4,  5,  5,  6,  7,  7,  8,  8,
489     9,  9, 10, 10, 11,  6,  5,  5,
490     6,  6,  7,  7,  8,  8,  9,  9,
491    10, 10,  7,  6,  6,  6,  7,  7,
492     8,  8,  9,  9, 10, 10,  7,  6,
493     7,  7,  7,  8,  8,  8,  9,  9,
494    10,  8,  7,  7,  7,  8,  8,  8,
495     9,  9,  9,  9,  8,  8,  8,  8,
496     8,  9,  9,  9,  9,  8,  8,  8,
497     9,  9,  9,  9, 10,  9,  9,  9,
498     9,  9,  9, 10,  9,  9,  9, 10,
499    10, 11, 10, 10, 10, 10, 11, 10,
500    10, 10, 11, 10, 11, 12, 11, 12,
501     3,
502};
503
504
505#define HUFF_VEC1_SIZE    101
506#define HUFF_VEC1_MAXBITS  11
507static const uint16_t vec1_huffcodes[HUFF_VEC1_SIZE] = {
508    0x01A, 0x003, 0x017, 0x010, 0x00C, 0x009, 0x005, 0x000,
509    0x00D, 0x00A, 0x009, 0x00C, 0x00F, 0x002, 0x004, 0x007,
510    0x00B, 0x00F, 0x01C, 0x006, 0x010, 0x015, 0x01C, 0x022,
511    0x03B, 0x00E, 0x019, 0x023, 0x034, 0x036, 0x03A, 0x047,
512    0x008, 0x00A, 0x01E, 0x031, 0x037, 0x050, 0x053, 0x06B,
513    0x06F, 0x08C, 0x0E8, 0x0EA, 0x0EB, 0x016, 0x03E, 0x03F,
514    0x06C, 0x089, 0x08A, 0x0A3, 0x0A4, 0x0D4, 0x0DD, 0x0EC,
515    0x0EE, 0x11A, 0x1D2, 0x024, 0x025, 0x02E, 0x027, 0x0C2,
516    0x0C0, 0x0DA, 0x0DB, 0x111, 0x144, 0x116, 0x14A, 0x145,
517    0x1B8, 0x1AB, 0x1DA, 0x1DE, 0x1DB, 0x1DF, 0x236, 0x237,
518    0x3A6, 0x3A7, 0x04D, 0x04C, 0x05E, 0x05F, 0x183, 0x182,
519    0x186, 0x221, 0x187, 0x220, 0x22E, 0x22F, 0x296, 0x354,
520    0x297, 0x355, 0x372, 0x373, 0x016,
521};
522
523static const uint8_t vec1_huffbits[HUFF_VEC1_SIZE] = {
524     7,  6,  5,  5,  5,  5,  5,  5,
525     4,  4,  4,  4,  4,  5,  5,  5,
526     5,  5,  5,  6,  6,  6,  6,  6,
527     6,  7,  7,  7,  7,  7,  7,  7,
528     8,  8,  8,  8,  8,  8,  8,  8,
529     8,  8,  8,  8,  8,  9,  9,  9,
530     9,  9,  9,  9,  9,  9,  9,  9,
531     9,  9,  9, 10, 10, 10, 10, 10,
532    10, 10, 10, 10, 10, 10, 10, 10,
533    10, 10, 10, 10, 10, 10, 10, 10,
534    10, 10, 11, 11, 11, 11, 11, 11,
535    11, 11, 11, 11, 11, 11, 11, 11,
536    11, 11, 11, 11,  5,
537};
538
539
540static const uint16_t symbol_to_vec4[HUFF_VEC4_SIZE] = {
541        0,    1,      2,     3,     4,     5,    16,    17,    18,    19,
542       20,   32,     33,    34,    35,    48,    49,    50,    64,    65,
543       80,   256,   257,   258,   259,   260,   272,   273,   274,   275,
544      288,   289,   290,   304,   305,   320,   512,   513,   514,   515,
545      528,   529,   530,   544,   545,   560,   768,   769,   770,   784,
546      785,   800,  1024,  1025,  1040,  1280,  4096,  4097,  4098,  4099,
547     4100,  4112,  4113,  4114,  4115,  4128,  4129,  4130,  4144,  4145,
548     4160,  4352,  4353,  4354,  4355,  4368,  4369,  4370,  4384,  4385,
549     4400,  4608,  4609,  4610,  4624,  4625,  4640,  4864,  4865,  4880,
550     5120,  8192,  8193,  8194,  8195,  8208,  8209,  8210,  8224,  8225,
551     8240,  8448,  8449,  8450,  8464,  8465,  8480,  8704,  8705,  8720,
552     8960, 12288, 12289, 12290, 12304, 12305, 12320, 12544, 12545, 12560,
553    12800, 16384, 16385, 16400, 16640, 20480,     0,
554};
555
556
557static const uint8_t symbol_to_vec2[HUFF_VEC2_SIZE] = {
558      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
559     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
560     30,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
561     48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  64,  65,
562     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  80,  81,  82,  83,  84,
563     85,  86,  87,  88,  89,  90,  96,  97,  98,  99, 100, 101, 102, 103, 104,
564    105, 112, 113, 114, 115, 116, 117, 118, 119, 120, 128, 129, 130, 131, 132,
565    133, 134, 135, 144, 145, 146, 147, 148, 149, 150, 160, 161, 162, 163, 164,
566    165, 176, 177, 178, 179, 180, 192, 193, 194, 195, 208, 209, 210, 224, 225,
567    240,   0,
568};
569/** @} */
570
571
572/**
573 * @brief decorrelation matrix for multichannel streams
574 **/
575static const float default_decorrelation_matrices[] = {
576    1.000000,  0.707031, -0.707031,  0.707031,  0.707031,  0.578125,  0.707031,
577    0.410156,  0.578125, -0.707031,  0.410156,  0.578125,  0.000000, -0.816406,
578    0.500000,  0.652344,  0.500000,  0.269531,  0.500000,  0.269531, -0.500000,
579   -0.652344,  0.500000, -0.269531, -0.500000,  0.652344,  0.500000, -0.652344,
580    0.500000, -0.269531,  0.445312,  0.601562,  0.511719,  0.371094,  0.195312,
581    0.445312,  0.371094, -0.195312, -0.601562, -0.511719,  0.445312,  0.000000,
582   -0.632812,  0.000000,  0.632812,  0.445312, -0.371094, -0.195312,  0.601562,
583   -0.511719,  0.445312, -0.601562,  0.511719, -0.371094,  0.195312,  0.410156,
584    0.558594,  0.500000,  0.410156,  0.289062,  0.148438,  0.410156,  0.410156,
585    0.000000, -0.410156, -0.578125, -0.410156,  0.410156,  0.148438, -0.500000,
586   -0.410156,  0.289062,  0.558594,  0.410156, -0.148438, -0.500000,  0.410156,
587    0.289062, -0.558594,  0.410156, -0.410156,  0.000000,  0.410156, -0.578125,
588    0.410156,  0.410156, -0.558594,  0.500000, -0.410156,  0.289062, -0.148438,
589};
590
591/**
592 * @brief default decorrelation matrix offsets
593 */
594static const float * const default_decorrelation[] = {
595    NULL,
596    &default_decorrelation_matrices[0],
597    &default_decorrelation_matrices[1],
598    &default_decorrelation_matrices[5],
599    &default_decorrelation_matrices[14],
600    &default_decorrelation_matrices[30],
601    &default_decorrelation_matrices[55]
602};
603
604#endif /* AVCODEC_WMAPRODATA_H */
605