Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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