]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavcodec/qcelpdata.h
Remove hack added to make "make checkheaders" pass, it is unneeded now
[frescor/ffmpeg.git] / libavcodec / qcelpdata.h
1 /*
2  * QCELP decoder
3  * Copyright (c) 2007 Reynaldo H. Verdejo Pinochet
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #ifndef AVCODEC_QCELPDATA_H
23 #define AVCODEC_QCELPDATA_H
24
25 /**
26  * @file qcelpdata.h
27  * Data tables for the QCELP decoder
28  * @author Reynaldo H. Verdejo Pinochet
29  * @remark FFmpeg merging spearheaded by Kenan Gillet
30  */
31
32 #include <stddef.h>
33 #include <stdint.h>
34 #include "libavutil/common.h"
35
36 /**
37  * QCELP unpacked data frame
38  */
39 typedef struct {
40 /// @defgroup qcelp_codebook_parameters QCELP excitation codebook parameters
41 /// @{
42     uint8_t cbsign[16]; ///!< sign of the codebook gain for each codebook subframe
43     uint8_t cbgain[16]; ///!< unsigned codebook gain for each codebook subframe
44     uint8_t cindex[16]; ///!< codebook index for each codebook subframe
45 /// @}
46
47 /// @defgroup qcelp_pitch_parameters QCELP pitch prediction parameters
48 /// @{
49     uint8_t plag[4];    ///!< pitch lag for each pitch subframe
50     uint8_t pfrac[4];   ///!< fractional pitch lag for each pitch subframe
51     uint8_t pgain[4];   ///!< pitch gain for each pitch subframe
52 /// @}
53
54     /**
55      * line spectral pair frequencies (LSP) for RATE_OCTAVE,
56      * line spectral pair frequencies grouped into five vectors
57      * of dimension two (LSPV) for other rates
58      */
59     uint8_t lspv[10];
60
61     /**
62      * reserved bits only present in bitrate 1, 1/4 and 1/8 packets
63      */
64     uint8_t reserved;
65 } QCELPFrame;
66
67 /**
68  * pre-calculated table for hammsinc function
69  * Only half of the table is needed because of symmetry.
70  *
71  * TIA/EIA/IS-733 2.4.5.2-2/3
72  */
73 static const float qcelp_hammsinc_table[4] = { -0.006822,  0.041249, -0.143459,  0.588863};
74
75 typedef struct {
76     uint8_t index;  /*!< index into the QCELPContext structure */
77     uint8_t bitpos; /*!< position of the lowest bit in the value's byte */
78     uint8_t bitlen; /*!< number of bits to read */
79 } QCELPBitmap;
80
81 #define QCELP_OF(variable, bit, len) {offsetof(QCELPFrame, variable), bit, len}
82
83 /**
84  * bitmap unpacking tables for RATE_FULL
85  *
86  * TIA/EIA/IS-733 Table 2.4.7.1-1
87  */
88 static const QCELPBitmap qcelp_rate_full_bitmap[] = {
89                                 // start on bit
90     QCELP_OF(lspv  [ 2], 0, 3), // 265
91     QCELP_OF(lspv  [ 1], 0, 7), // 262
92     QCELP_OF(lspv  [ 0], 0, 6), // 255
93     QCELP_OF(lspv  [ 4], 0, 6), // 249
94     QCELP_OF(lspv  [ 3], 0, 6), // 243
95     QCELP_OF(lspv  [ 2], 3, 4), // 237
96     QCELP_OF(cbsign[ 0], 0, 1), // 233
97     QCELP_OF(cbgain[ 0], 0, 4), // 232
98     QCELP_OF(pfrac [ 0], 0, 1), // 228
99     QCELP_OF(plag  [ 0], 0, 7), // 227
100     QCELP_OF(pgain [ 0], 0, 3), // 220
101     QCELP_OF(cindex[ 1], 0, 4), // 217
102     QCELP_OF(cbsign[ 1], 0, 1), // 213
103     QCELP_OF(cbgain[ 1], 0, 4), // 212
104     QCELP_OF(cindex[ 0], 0, 7), // 208
105     QCELP_OF(cbgain[ 3], 0, 1), // 201
106     QCELP_OF(cindex[ 2], 0, 7), // 200
107     QCELP_OF(cbsign[ 2], 0, 1), // 193
108     QCELP_OF(cbgain[ 2], 0, 4), // 192
109     QCELP_OF(cindex[ 1], 4, 3), // 188
110     QCELP_OF(plag  [ 1], 0, 3), // 185
111     QCELP_OF(pgain [ 1], 0, 3), // 182
112     QCELP_OF(cindex[ 3], 0, 7), // 179
113     QCELP_OF(cbsign[ 3], 0, 1), // 172
114     QCELP_OF(cbgain[ 3], 1, 2), // 171
115     QCELP_OF(cindex[ 4], 0, 6), // 169
116     QCELP_OF(cbsign[ 4], 0, 1), // 163
117     QCELP_OF(cbgain[ 4], 0, 4), // 162
118     QCELP_OF(pfrac [ 1], 0, 1), // 158
119     QCELP_OF(plag  [ 1], 3, 4), // 157
120     QCELP_OF(cbgain[ 6], 0, 3), // 153
121     QCELP_OF(cindex[ 5], 0, 7), // 150
122     QCELP_OF(cbsign[ 5], 0, 1), // 143
123     QCELP_OF(cbgain[ 5], 0, 4), // 142
124     QCELP_OF(cindex[ 4], 6, 1), // 138
125     QCELP_OF(cindex[ 7], 0, 3), // 137
126     QCELP_OF(cbsign[ 7], 0, 1), // 134
127     QCELP_OF(cbgain[ 7], 0, 3), // 133
128     QCELP_OF(cindex[ 6], 0, 7), // 130
129     QCELP_OF(cbsign[ 6], 0, 1), // 123
130     QCELP_OF(cbgain[ 6], 3, 1), // 122
131     QCELP_OF(cbgain[ 8], 0, 1), // 121
132     QCELP_OF(pfrac [ 2], 0, 1), // 120
133     QCELP_OF(plag  [ 2], 0, 7), // 119
134     QCELP_OF(pgain [ 2], 0, 3), // 112
135     QCELP_OF(cindex[ 7], 3, 4), // 109
136     QCELP_OF(cbsign[ 9], 0, 1), // 105
137     QCELP_OF(cbgain[ 9], 0, 4), // 104
138     QCELP_OF(cindex[ 8], 0, 7), // 100
139     QCELP_OF(cbsign[ 8], 0, 1), //  93
140     QCELP_OF(cbgain[ 8], 1, 3), //  92
141     QCELP_OF(cindex[10], 0, 4), //  89
142     QCELP_OF(cbsign[10], 0, 1), //  85
143     QCELP_OF(cbgain[10], 0, 4), //  84
144     QCELP_OF(cindex[ 9], 0, 7), //  80
145     QCELP_OF(pgain [ 3], 0, 2), //  73
146     QCELP_OF(cindex[11], 0, 7), //  71
147     QCELP_OF(cbsign[11], 0, 1), //  64
148     QCELP_OF(cbgain[11], 0, 3), //  63
149     QCELP_OF(cindex[10], 4, 3), //  60
150     QCELP_OF(cindex[12], 0, 2), //  57
151     QCELP_OF(cbsign[12], 0, 1), //  55
152     QCELP_OF(cbgain[12], 0, 4), //  54
153     QCELP_OF(pfrac [ 3], 0, 1), //  50
154     QCELP_OF(plag  [ 3], 0, 7), //  49
155     QCELP_OF(pgain [ 3], 2, 1), //  42
156     QCELP_OF(cindex[13], 0, 6), //  41
157     QCELP_OF(cbsign[13], 0, 1), //  35
158     QCELP_OF(cbgain[13], 0, 4), //  34
159     QCELP_OF(cindex[12], 2, 5), //  30
160     QCELP_OF(cbgain[15], 0, 3), //  25
161     QCELP_OF(cindex[14], 0, 7), //  22
162     QCELP_OF(cbsign[14], 0, 1), //  15
163     QCELP_OF(cbgain[14], 0, 4), //  14
164     QCELP_OF(cindex[13], 6, 1), //  10
165     QCELP_OF(reserved,   0, 2), //   9
166     QCELP_OF(cindex[15], 0, 7), //   7
167     QCELP_OF(cbsign[15], 0, 1)  //   0
168 };
169
170 /**
171  * bitmap unpacking tables for RATE_HALF
172  *
173  * TIA/EIA/IS-733 Table 2.4.7.2-1
174  */
175 static const QCELPBitmap qcelp_rate_half_bitmap[] = {
176                                // start on bit
177     QCELP_OF(lspv  [2], 0, 3), // 123
178     QCELP_OF(lspv  [1], 0, 7), // 120
179     QCELP_OF(lspv  [0], 0, 6), // 113
180     QCELP_OF(lspv  [4], 0, 6), // 107
181     QCELP_OF(lspv  [3], 0, 6), // 101
182     QCELP_OF(lspv  [2], 3, 4), //  95
183     QCELP_OF(cbsign[0], 0, 1), //  91
184     QCELP_OF(cbgain[0], 0, 4), //  90
185     QCELP_OF(pfrac [0], 0, 1), //  86
186     QCELP_OF(plag  [0], 0, 7), //  85
187     QCELP_OF(pgain [0], 0, 3), //  78
188     QCELP_OF(plag  [1], 0, 6), //  75
189     QCELP_OF(pgain [1], 0, 3), //  69
190     QCELP_OF(cindex[0], 0, 7), //  66
191     QCELP_OF(pgain [2], 0, 2), //  59
192     QCELP_OF(cindex[1], 0, 7), //  57
193     QCELP_OF(cbsign[1], 0, 1), //  50
194     QCELP_OF(cbgain[1], 0, 4), //  49
195     QCELP_OF(pfrac [1], 0, 1), //  45
196     QCELP_OF(plag  [1], 6, 1), //  44
197     QCELP_OF(cindex[2], 0, 2), //  43
198     QCELP_OF(cbsign[2], 0, 1), //  41
199     QCELP_OF(cbgain[2], 0, 4), //  40
200     QCELP_OF(pfrac [2], 0, 1), //  36
201     QCELP_OF(plag  [2], 0, 7), //  35
202     QCELP_OF(pgain [2], 2, 1), //  28
203     QCELP_OF(pfrac [3], 0, 1), //  27
204     QCELP_OF(plag  [3], 0, 7), //  26
205     QCELP_OF(pgain [3], 0, 3), //  19
206     QCELP_OF(cindex[2], 2, 5), //  16
207     QCELP_OF(cindex[3], 0, 7), //  11
208     QCELP_OF(cbsign[3], 0, 1), //   4
209     QCELP_OF(cbgain[3], 0, 4)  //   3
210 };
211
212 /**
213  * bitmap unpacking tables for RATE_QUARTER
214  *
215  * TIA/EIA/IS-733 Table 2.4.7.3-1
216  */
217 static const QCELPBitmap qcelp_rate_quarter_bitmap[] = {
218                                // start on bit
219     QCELP_OF(lspv  [2], 0, 3), // 53
220     QCELP_OF(lspv  [1], 0, 7), // 50
221     QCELP_OF(lspv  [0], 0, 6), // 43
222     QCELP_OF(lspv  [4], 0, 6), // 37
223     QCELP_OF(lspv  [3], 0, 6), // 31
224     QCELP_OF(lspv  [2], 3, 4), // 25
225     QCELP_OF(cbgain[3], 0, 4), // 21
226     QCELP_OF(cbgain[2], 0, 4), // 17
227     QCELP_OF(cbgain[1], 0, 4), // 13
228     QCELP_OF(cbgain[0], 0, 4), //  9
229     QCELP_OF(reserved,  0, 2), //  5
230     QCELP_OF(cbgain[4], 0, 4)  //  3
231 };
232
233 /**
234  * bitmap unpacking tables for RATE_OCTAVE
235  *
236  * trick: CBSEED is written into QCELPContext.cbsign[15],
237  * which is not used for RATE_OCTAVE.
238  * CBSEED is only used to ensure the occurrence of random bit
239  * patterns in the 16 first bits that are used as the seed.
240  *
241  * TIA/EIA/IS-733 Table 2.4.7.4-1
242  */
243 static const QCELPBitmap qcelp_rate_octave_bitmap[] = {
244                                 // start on bit
245     QCELP_OF(cbsign[15], 3, 1), // 19
246     QCELP_OF(lspv   [0], 0, 1), // 18
247     QCELP_OF(lspv   [1], 0, 1), // 17
248     QCELP_OF(lspv   [2], 0, 1), // 16
249     QCELP_OF(cbsign[15], 2, 1), // 15
250     QCELP_OF(lspv   [3], 0, 1), // 14
251     QCELP_OF(lspv   [4], 0, 1), // 13
252     QCELP_OF(lspv   [5], 0, 1), // 12
253     QCELP_OF(cbsign[15], 1, 1), // 11
254     QCELP_OF(lspv   [6], 0, 1), // 10
255     QCELP_OF(lspv   [7], 0, 1), //  9
256     QCELP_OF(lspv   [8], 0, 1), //  8
257     QCELP_OF(cbsign[15], 0, 1), //  7
258     QCELP_OF(lspv   [9], 0, 1), //  6
259     QCELP_OF(cbgain [0], 0, 2), //  7
260     QCELP_OF(reserved,   0, 4)  //  3
261 };
262
263 /**
264  * position of the bitmapping data for each packet type in
265  * the QCELPContext
266  */
267 static const QCELPBitmap * const qcelp_unpacking_bitmaps_per_rate[5] = {
268     NULL,                     ///!< for SILENCE rate
269     qcelp_rate_octave_bitmap,
270     qcelp_rate_quarter_bitmap,
271     qcelp_rate_half_bitmap,
272     qcelp_rate_full_bitmap,
273 };
274
275 static const uint16_t qcelp_unpacking_bitmaps_lengths[5] = {
276     0, ///!< for SILENCE rate
277     FF_ARRAY_ELEMS(qcelp_rate_octave_bitmap),
278     FF_ARRAY_ELEMS(qcelp_rate_quarter_bitmap),
279     FF_ARRAY_ELEMS(qcelp_rate_half_bitmap),
280     FF_ARRAY_ELEMS(qcelp_rate_full_bitmap),
281 };
282
283 typedef uint16_t qcelp_vector[2];
284
285 /**
286  * LSP vector quantization tables in x*10000 form
287  *
288  * TIA/EIA/IS-733 tables 2.4.3.2.6.3-1 through 2.4.3.2.6.3-5
289  */
290
291 static const qcelp_vector qcelp_lspvq1[64]= {
292 { 327, 118},{ 919, 111},{ 427, 440},{1327, 185},
293 { 469,  50},{1272,  91},{ 892,  59},{1771, 193},
294 { 222, 158},{1100, 127},{ 827,  55},{ 978, 791},
295 { 665,  47},{ 700,1401},{ 670, 859},{1913,1048},
296 { 471, 215},{1046, 125},{ 645, 298},{1599, 160},
297 { 593,  39},{1187, 462},{ 749, 341},{1520, 511},
298 { 290, 792},{ 909, 362},{ 753,  81},{1111,1058},
299 { 519, 253},{ 828, 839},{ 685, 541},{1421,1258},
300 { 386, 130},{ 962, 119},{ 542, 387},{1431, 185},
301 { 526,  51},{1175, 260},{ 831, 167},{1728, 510},
302 { 273, 437},{1172, 113},{ 771, 144},{1122, 751},
303 { 619, 119},{ 492,1276},{ 658, 695},{1882, 615},
304 { 415, 200},{1018,  88},{ 681, 339},{1436, 325},
305 { 555, 122},{1042, 485},{ 826, 345},{1374, 743},
306 { 383,1018},{1005, 358},{ 704,  86},{1301, 586},
307 { 597, 241},{ 832, 621},{ 555, 573},{1504, 839}};
308
309 static const qcelp_vector qcelp_lspvq2[128]= {
310 { 255, 293},{ 904, 219},{ 151,1211},{1447, 498},
311 { 470, 253},{1559, 177},{1547, 994},{2394, 242},
312 {  91, 813},{ 857, 590},{ 934,1326},{1889, 282},
313 { 813, 472},{1057,1494},{ 450,3315},{2163,1895},
314 { 538, 532},{1399, 218},{ 146,1552},{1755, 626},
315 { 822, 202},{1299, 663},{ 706,1732},{2656, 401},
316 { 418, 745},{ 762,1038},{ 583,1748},{1746,1285},
317 { 527,1169},{1314, 830},{ 556,2116},{1073,2321},
318 { 297, 570},{ 981, 403},{ 468,1103},{1740, 243},
319 { 725, 179},{1255, 474},{1374,1362},{1922, 912},
320 { 285, 947},{ 930, 700},{ 593,1372},{1909, 576},
321 { 588, 916},{1110,1116},{ 224,2719},{1633,2220},
322 { 402, 520},{1061, 448},{ 402,1352},{1499, 775},
323 { 664, 589},{1081, 727},{ 801,2206},{2165,1157},
324 { 566, 802},{ 911,1116},{ 306,1703},{1792, 836},
325 { 655, 999},{1061,1038},{ 298,2089},{1110,1753},
326 { 361, 311},{ 970, 239},{ 265,1231},{1495, 573},
327 { 566, 262},{1569, 293},{1341,1144},{2271, 544},
328 { 214, 877},{ 847, 719},{ 794,1384},{2067, 274},
329 { 703, 688},{1099,1306},{ 391,2947},{2024,1670},
330 { 471, 525},{1245, 290},{ 264,1557},{1568, 807},
331 { 718, 399},{1193, 685},{ 883,1594},{2729, 764},
332 { 500, 754},{ 809,1108},{ 541,1648},{1523,1385},
333 { 614,1196},{1209, 847},{ 345,2242},{1442,1747},
334 { 199, 560},{1092, 194},{ 349,1253},{1653, 507},
335 { 625, 354},{1376, 431},{1187,1465},{2164, 872},
336 { 360, 974},{1008, 698},{ 704,1346},{2114, 452},
337 { 720, 816},{1240,1089},{ 439,2475},{1498,2040},
338 { 336, 718},{1213, 187},{ 451,1450},{1368, 885},
339 { 592, 578},{1131, 531},{ 861,1855},{1764,1500},
340 { 444, 970},{ 935, 903},{ 424,1687},{1633,1102},
341 { 793, 897},{1060, 897},{ 185,2011},{1205,1855}};
342
343 static const qcelp_vector qcelp_lspvq3[128]= {
344 { 225, 283},{1296, 355},{ 543, 343},{2073, 274},
345 { 204,1099},{1562, 523},{1388, 161},{2784, 274},
346 { 112, 849},{1870, 175},{1189, 160},{1490,1088},
347 { 969,1115},{ 659,3322},{1158,1073},{3183,1363},
348 { 517, 223},{1740, 223},{ 704, 387},{2637, 234},
349 { 692,1005},{1287,1610},{ 952, 532},{2393, 646},
350 { 490, 552},{1619, 657},{ 845, 670},{1784,2280},
351 { 191,1775},{ 272,2868},{ 942, 952},{2628,1479},
352 { 278, 579},{1565, 218},{ 814, 180},{2379, 187},
353 { 276,1444},{1199,1223},{1200, 349},{3009, 307},
354 { 312, 844},{1898, 306},{ 863, 470},{1685,1241},
355 { 513,1727},{ 711,2233},{1085, 864},{3398, 527},
356 { 414, 440},{1356, 612},{ 964, 147},{2173, 738},
357 { 465,1292},{ 877,1749},{1104, 689},{2105,1311},
358 { 580, 864},{1895, 752},{ 652, 609},{1485,1699},
359 { 514,1400},{ 386,2131},{ 933, 798},{2473, 986},
360 { 334, 360},{1375, 398},{ 621, 276},{2183, 280},
361 { 311,1114},{1382, 807},{1284, 175},{2605, 636},
362 { 230, 816},{1739, 408},{1074, 176},{1619,1120},
363 { 784,1371},{ 448,3050},{1189, 880},{3039,1165},
364 { 424, 241},{1672, 186},{ 815, 333},{2432, 324},
365 { 584,1029},{1137,1546},{1015, 585},{2198, 995},
366 { 574, 581},{1746, 647},{ 733, 740},{1938,1737},
367 { 347,1710},{ 373,2429},{ 787,1061},{2439,1438},
368 { 185, 536},{1489, 178},{ 703, 216},{2178, 487},
369 { 154,1421},{1414, 994},{1103, 352},{3072, 473},
370 { 408, 819},{2055, 168},{ 998, 354},{1917,1140},
371 { 665,1799},{ 993,2213},{1234, 631},{3003, 762},
372 { 373, 620},{1518, 425},{ 913, 300},{1966, 836},
373 { 402,1185},{ 948,1385},{1121, 555},{1802,1509},
374 { 474, 886},{1888, 610},{ 739, 585},{1231,2379},
375 { 661,1335},{ 205,2211},{ 823, 822},{2480,1179}};
376
377 static const qcelp_vector qcelp_lspvq4[64]= {
378 { 348, 311},{ 812,1145},{ 552, 461},{1826, 263},
379 { 601, 675},{1730, 172},{1523, 193},{2449, 277},
380 { 334, 668},{ 805,1441},{1319, 207},{1684, 910},
381 { 582,1318},{1403,1098},{ 979, 832},{2700,1359},
382 { 624, 228},{1292, 979},{ 800, 195},{2226, 285},
383 { 730, 862},{1537, 601},{1115, 509},{2720, 354},
384 { 218,1167},{1212,1538},{1074, 247},{1674,1710},
385 { 322,2142},{1263, 777},{ 981, 556},{2119,1710},
386 { 193, 596},{1035, 957},{ 694, 397},{1997, 253},
387 { 743, 603},{1584, 321},{1346, 346},{2221, 708},
388 { 451, 732},{1040,1415},{1184, 230},{1853, 919},
389 { 310,1661},{1625, 706},{ 856, 843},{2902, 702},
390 { 467, 348},{1108,1048},{ 859, 306},{1964, 463},
391 { 560,1013},{1425, 533},{1142, 634},{2391, 879},
392 { 397,1084},{1345,1700},{ 976, 248},{1887,1189},
393 { 644,2087},{1262, 603},{ 877, 550},{2203,1307}};
394
395 static const qcelp_vector qcelp_lspvq5[64]= {
396 { 360, 222},{ 820,1097},{ 601, 319},{1656, 198},
397 { 604, 513},{1552, 141},{1391, 155},{2474, 261},
398 { 269, 785},{1463, 646},{1123, 191},{2015, 223},
399 { 785, 844},{1202,1011},{ 980, 807},{3014, 793},
400 { 570, 180},{1135,1382},{ 778, 256},{1901, 179},
401 { 807, 622},{1461, 458},{1231, 178},{2028, 821},
402 { 387, 927},{1496,1004},{ 888, 392},{2246, 341},
403 { 295,1462},{1156, 694},{1022, 473},{2226,1364},
404 { 210, 478},{1029,1020},{ 722, 181},{1730, 251},
405 { 730, 488},{1465, 293},{1303, 326},{2595, 387},
406 { 458, 584},{1569, 742},{1029, 173},{1910, 495},
407 { 605,1159},{1268, 719},{ 973, 646},{2872, 428},
408 { 443, 334},{ 835,1465},{ 912, 138},{1716, 442},
409 { 620, 778},{1316, 450},{1186, 335},{1446,1665},
410 { 486,1050},{1675,1019},{ 880, 278},{2214, 202},
411 { 539,1564},{1142, 533},{ 984, 391},{2130,1089}};
412
413 static const qcelp_vector * const qcelp_lspvq[5] = {
414     qcelp_lspvq1,
415     qcelp_lspvq2,
416     qcelp_lspvq3,
417     qcelp_lspvq4,
418     qcelp_lspvq5
419 };
420
421 /**
422  * the final gain scalefactor before clipping into a usable output float
423  */
424 #define QCELP_SCALE 8192.
425
426 /**
427  * the upper boundary of the clipping, depends on QCELP_SCALE
428  */
429 #define QCELP_CLIP_UPPER_BOUND (8191.75/8192.)
430
431 /**
432  * the lower boundary of the clipping, depends on QCELP_SCALE
433  */
434 #define QCELP_CLIP_LOWER_BOUND -1.
435
436 /**
437  * table for computing Ga (decoded linear codebook gain magnitude)
438  *
439  * @note The table could fit in int16_t in x*8 form, but it seems
440  *       to be slower on x86
441  *
442  * TIA/EIA/IS-733 2.4.6.2.1-3
443  */
444
445 static const float qcelp_g12ga[61] = {
446     1.000/QCELP_SCALE,   1.125/QCELP_SCALE,   1.250/QCELP_SCALE,   1.375/QCELP_SCALE,
447     1.625/QCELP_SCALE,   1.750/QCELP_SCALE,   2.000/QCELP_SCALE,   2.250/QCELP_SCALE,
448     2.500/QCELP_SCALE,   2.875/QCELP_SCALE,   3.125/QCELP_SCALE,   3.500/QCELP_SCALE,
449     4.000/QCELP_SCALE,   4.500/QCELP_SCALE,   5.000/QCELP_SCALE,   5.625/QCELP_SCALE,
450     6.250/QCELP_SCALE,   7.125/QCELP_SCALE,   8.000/QCELP_SCALE,   8.875/QCELP_SCALE,
451    10.000/QCELP_SCALE,  11.250/QCELP_SCALE,  12.625/QCELP_SCALE,  14.125/QCELP_SCALE,
452    15.875/QCELP_SCALE,  17.750/QCELP_SCALE,  20.000/QCELP_SCALE,  22.375/QCELP_SCALE,
453    25.125/QCELP_SCALE,  28.125/QCELP_SCALE,  31.625/QCELP_SCALE,  35.500/QCELP_SCALE,
454    39.750/QCELP_SCALE,  44.625/QCELP_SCALE,  50.125/QCELP_SCALE,  56.250/QCELP_SCALE,
455    63.125/QCELP_SCALE,  70.750/QCELP_SCALE,  79.375/QCELP_SCALE,  89.125/QCELP_SCALE,
456   100.000/QCELP_SCALE, 112.250/QCELP_SCALE, 125.875/QCELP_SCALE, 141.250/QCELP_SCALE,
457   158.500/QCELP_SCALE, 177.875/QCELP_SCALE, 199.500/QCELP_SCALE, 223.875/QCELP_SCALE,
458   251.250/QCELP_SCALE, 281.875/QCELP_SCALE, 316.250/QCELP_SCALE, 354.875/QCELP_SCALE,
459   398.125/QCELP_SCALE, 446.625/QCELP_SCALE, 501.125/QCELP_SCALE, 562.375/QCELP_SCALE,
460   631.000/QCELP_SCALE, 708.000/QCELP_SCALE, 794.375/QCELP_SCALE, 891.250/QCELP_SCALE,
461  1000.000/QCELP_SCALE};
462
463 /**
464  * circular codebook for rate 1 frames in x*100 form
465  *
466  * TIA/EIA/IS-733 2.4.6.1-2
467  */
468 static const int16_t qcelp_rate_full_codebook[128] = {
469      10,  -65,  -59,   12,  110,   34, -134,  157,
470     104,  -84,  -34, -115,   23, -101,    3,   45,
471    -101,  -16,  -59,   28,  -45,  134,  -67,   22,
472      61,  -29,  226,  -26,  -55, -179,  157,  -51,
473    -220,  -93,  -37,   60,  118,   74,  -48,  -95,
474    -181,  111,   36,  -52, -215,   78, -112,   39,
475     -17,  -47, -223,   19,   12,  -98, -142,  130,
476      54, -127,   21,  -12,   39,  -48,   12,  128,
477       6, -167,   82, -102,  -79,   55,  -44,   48,
478     -20,  -53,    8,  -61,   11,  -70, -157, -168,
479      20,  -56,  -74,   78,   33,  -63, -173,   -2,
480     -75,  -53, -146,   77,   66,  -29,    9,  -75,
481      65,  119,  -43,   76,  233,   98,  125, -156,
482     -27,   78,   -9,  170,  176,  143, -148,   -7,
483      27, -136,    5,   27,   18,  139,  204,    7,
484    -184, -197,   52,   -3,   78, -189,    8,  -65
485 };
486 #define QCELP_RATE_FULL_CODEBOOK_RATIO .01
487
488 /**
489  * circular codebook for rate 1/2 frames in x*2 form
490  *
491  * TIA/EIA/IS-733 2.4.6.1-1
492  */
493 static const int8_t qcelp_rate_half_codebook[128] = {
494      0, -4,  0, -3,  0,  0,  0,  0,
495      0,  0,  0,  0,  0,  0,  0,  0,
496      0, -3, -2,  0,  0,  0,  0,  0,
497      0,  0,  0,  0,  0,  0,  0,  5,
498      0,  0,  0,  0,  0,  0,  4,  0,
499      0,  3,  2,  0,  3,  4,  0,  0,
500      0,  0,  0,  0,  0,  0,  0,  0,
501      0,  0,  0,  0,  0,  3,  0,  0,
502     -3,  3,  0,  0, -2,  0,  3,  0,
503      0,  0,  0,  0,  0,  0, -5,  0,
504      0,  0,  0,  3,  0,  0,  0,  3,
505      0,  0,  0,  0,  0,  0,  0,  4,
506      0,  0,  0,  0,  0,  0,  0,  0,
507      0,  3,  6, -3, -4,  0, -3, -3,
508      3, -3,  0,  0,  0,  0,  0,  0,
509      0,  0,  0,  0,  0,  0,  0,  0
510 };
511 #define QCELP_RATE_HALF_CODEBOOK_RATIO 0.5
512
513 /**
514  * sqrt(1.887) is the maximum of the pseudorandom
515  * white sequence used to generate the scaled codebook
516  * vector for bitrate 1/4.
517  *
518  * TIA/EIA/IS-733 2.4.8.1.2
519  */
520 #define QCELP_SQRT1887 1.373681186
521
522 /**
523  * table for impulse response of BPF used to filter
524  * the white excitation for bitrate 1/4 synthesis
525  *
526  * Only half the tables are needed because of symmetry.
527  *
528  * TIA/EIA/IS-733 2.4.8.1.2-1.1
529  */
530 static const double qcelp_rnd_fir_coefs[11] = {
531   -1.344519e-1, 1.735384e-2, -6.905826e-2, 2.434368e-2,
532   -8.210701e-2, 3.041388e-2, -9.251384e-2, 3.501983e-2,
533   -9.918777e-2, 3.749518e-2,  8.985137e-1
534 };
535
536 /**
537  * This spread factor is used, for bitrate 1/8 and I_F_Q,
538  * to force the LSP frequencies to be at least 80 Hz apart.
539  *
540  * TIA/EIA/IS-733 2.4.3.3.2
541  */
542 #define QCELP_LSP_SPREAD_FACTOR 0.02
543
544 /**
545  * predictor coefficient for the conversion of LSP codes
546  * to LSP frequencies for 1/8 and I_F_Q
547  *
548  * TIA/EIA/IS-733 2.4.3.2.7-2
549  */
550 #define QCELP_LSP_OCTAVE_PREDICTOR 29.0/32
551
552 #endif /* AVCODEC_QCELPDATA_H */