~ubuntu-branches/ubuntu/utopic/libav/utopic-proposed

« back to all changes in this revision

Viewing changes to libavcodec/opus_silk.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler, Reinhard Tartler, Rico Tzschichholz
  • Date: 2014-08-30 11:02:45 UTC
  • mfrom: (1.3.47 sid)
  • Revision ID: package-import@ubuntu.com-20140830110245-io3dg7q85wfr7125
Tags: 6:11~beta1-2
[ Reinhard Tartler ]
* Make libavcodec-dev depend on libavresample-dev

[ Rico Tzschichholz ]
* Some fixes and leftovers from soname bumps

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2012 Andrew D'Addesio
 
3
 * Copyright (c) 2013-2014 Mozilla Corporation
 
4
 *
 
5
 * This file is part of Libav.
 
6
 *
 
7
 * Libav 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
 * Libav 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 Libav; if not, write to the Free Software
 
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
20
 */
 
21
 
 
22
/**
 
23
 * @file
 
24
 * Opus SILK decoder
 
25
 */
 
26
 
 
27
#include <stdint.h>
 
28
 
 
29
#include "opus.h"
 
30
 
 
31
typedef struct SilkFrame {
 
32
    int coded;
 
33
    int log_gain;
 
34
    int16_t nlsf[16];
 
35
    float    lpc[16];
 
36
 
 
37
    float output     [2 * SILK_HISTORY];
 
38
    float lpc_history[2 * SILK_HISTORY];
 
39
    int primarylag;
 
40
 
 
41
    int prev_voiced;
 
42
} SilkFrame;
 
43
 
 
44
struct SilkContext {
 
45
    AVCodecContext *avctx;
 
46
    int output_channels;
 
47
 
 
48
    int midonly;
 
49
    int subframes;
 
50
    int sflength;
 
51
    int flength;
 
52
    int nlsf_interp_factor;
 
53
 
 
54
    enum OpusBandwidth bandwidth;
 
55
    int wb;
 
56
 
 
57
    SilkFrame frame[2];
 
58
    float prev_stereo_weights[2];
 
59
    float stereo_weights[2];
 
60
 
 
61
    int prev_coded_channels;
 
62
};
 
63
 
 
64
static const uint16_t silk_model_stereo_s1[] = {
 
65
    256,   7,   9,  10,  11,  12,  22,  46,  54,  55,  56,  59,  82, 174, 197, 200,
 
66
    201, 202, 210, 234, 244, 245, 246, 247, 249, 256
 
67
};
 
68
 
 
69
static const uint16_t silk_model_stereo_s2[] = {256, 85, 171, 256};
 
70
 
 
71
static const uint16_t silk_model_stereo_s3[] = {256, 51, 102, 154, 205, 256};
 
72
 
 
73
static const uint16_t silk_model_mid_only[] = {256, 192, 256};
 
74
 
 
75
static const uint16_t silk_model_frame_type_inactive[] = {256, 26, 256};
 
76
 
 
77
static const uint16_t silk_model_frame_type_active[] = {256, 24, 98, 246, 256};
 
78
 
 
79
static const uint16_t silk_model_gain_highbits[3][9] = {
 
80
    {256,  32, 144, 212, 241, 253, 254, 255, 256},
 
81
    {256,   2,  19,  64, 124, 186, 233, 252, 256},
 
82
    {256,   1,   4,  30, 101, 195, 245, 254, 256}
 
83
};
 
84
 
 
85
static const uint16_t silk_model_gain_lowbits[] = {256, 32, 64, 96, 128, 160, 192, 224, 256};
 
86
 
 
87
static const uint16_t silk_model_gain_delta[] = {
 
88
    256,   6,  11,  22,  53, 185, 206, 214, 218, 221, 223, 225, 227, 228, 229, 230,
 
89
    231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
 
90
    247, 248, 249, 250, 251, 252, 253, 254, 255, 256
 
91
};
 
92
static const uint16_t silk_model_lsf_s1[2][2][33] = {
 
93
    {
 
94
        {    // NB or MB, unvoiced
 
95
            256,  44,  78, 108, 127, 148, 160, 171, 174, 177, 179, 195, 197, 199, 200, 205,
 
96
            207, 208, 211, 214, 215, 216, 218, 220, 222, 225, 226, 235, 244, 246, 253, 255, 256
 
97
        }, { // NB or MB, voiced
 
98
            256,   1,  11,  12,  20,  23,  31,  39,  53,  66,  80,  81,  95, 107, 120, 131,
 
99
            142, 154, 165, 175, 185, 196, 204, 213, 221, 228, 236, 237, 238, 244, 245, 251, 256
 
100
        }
 
101
    }, {
 
102
        {    // WB, unvoiced
 
103
            256,  31,  52,  55,  72,  73,  81,  98, 102, 103, 121, 137, 141, 143, 146, 147,
 
104
            157, 158, 161, 177, 188, 204, 206, 208, 211, 213, 224, 225, 229, 238, 246, 253, 256
 
105
        }, { // WB, voiced
 
106
            256,   1,   5,  21,  26,  44,  55,  60,  74,  89,  90,  93, 105, 118, 132, 146,
 
107
            152, 166, 178, 180, 186, 187, 199, 211, 222, 232, 235, 245, 250, 251, 252, 253, 256
 
108
        }
 
109
    }
 
110
};
 
111
 
 
112
static const uint16_t silk_model_lsf_s2[32][10] = {
 
113
    // NB, MB
 
114
    { 256,   1,   2,   3,  18, 242, 253, 254, 255, 256 },
 
115
    { 256,   1,   2,   4,  38, 221, 253, 254, 255, 256 },
 
116
    { 256,   1,   2,   6,  48, 197, 252, 254, 255, 256 },
 
117
    { 256,   1,   2,  10,  62, 185, 246, 254, 255, 256 },
 
118
    { 256,   1,   4,  20,  73, 174, 248, 254, 255, 256 },
 
119
    { 256,   1,   4,  21,  76, 166, 239, 254, 255, 256 },
 
120
    { 256,   1,   8,  32,  85, 159, 226, 252, 255, 256 },
 
121
    { 256,   1,   2,  20,  83, 161, 219, 249, 255, 256 },
 
122
 
 
123
    // WB
 
124
    { 256,   1,   2,   3,  12, 244, 253, 254, 255, 256 },
 
125
    { 256,   1,   2,   4,  32, 218, 253, 254, 255, 256 },
 
126
    { 256,   1,   2,   5,  47, 199, 252, 254, 255, 256 },
 
127
    { 256,   1,   2,  12,  61, 187, 252, 254, 255, 256 },
 
128
    { 256,   1,   5,  24,  72, 172, 249, 254, 255, 256 },
 
129
    { 256,   1,   2,  16,  70, 170, 242, 254, 255, 256 },
 
130
    { 256,   1,   2,  17,  78, 165, 226, 251, 255, 256 },
 
131
    { 256,   1,   8,  29,  79, 156, 237, 254, 255, 256 }
 
132
};
 
133
 
 
134
static const uint16_t silk_model_lsf_s2_ext[] = { 256, 156, 216, 240, 249, 253, 255, 256 };
 
135
 
 
136
static const uint16_t silk_model_lsf_interpolation_offset[] = { 256, 13, 35, 64, 75, 256 };
 
137
 
 
138
static const uint16_t silk_model_pitch_highbits[] = {
 
139
    256,   3,   6,  12,  23,  44,  74, 106, 125, 136, 146, 158, 171, 184, 196, 207,
 
140
    216, 224, 231, 237, 241, 243, 245, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256
 
141
};
 
142
 
 
143
static const uint16_t silk_model_pitch_lowbits_nb[]= { 256, 64, 128, 192, 256 };
 
144
 
 
145
static const uint16_t silk_model_pitch_lowbits_mb[]= { 256, 43, 85, 128, 171, 213, 256 };
 
146
 
 
147
static const uint16_t silk_model_pitch_lowbits_wb[]= { 256, 32, 64, 96, 128, 160, 192, 224, 256 };
 
148
 
 
149
static const uint16_t silk_model_pitch_delta[] = {
 
150
    256,  46,  48,  50,  53,  57,  63,  73,  88, 114, 152, 182, 204, 219, 229, 236,
 
151
    242, 246, 250, 252, 254, 256
 
152
};
 
153
 
 
154
static const uint16_t silk_model_pitch_contour_nb10ms[] = { 256, 143, 193, 256 };
 
155
 
 
156
static const uint16_t silk_model_pitch_contour_nb20ms[] = {
 
157
    256,  68,  80, 101, 118, 137, 159, 189, 213, 230, 246, 256
 
158
};
 
159
 
 
160
static const uint16_t silk_model_pitch_contour_mbwb10ms[] = {
 
161
    256,  91, 137, 176, 195, 209, 221, 229, 236, 242, 247, 252, 256
 
162
};
 
163
 
 
164
static const uint16_t silk_model_pitch_contour_mbwb20ms[] = {
 
165
    256,  33,  55,  73,  89, 104, 118, 132, 145, 158, 168, 177, 186, 194, 200, 206,
 
166
    212, 217, 221, 225, 229, 232, 235, 238, 240, 242, 244, 246, 248, 250, 252, 253,
 
167
    254, 255, 256
 
168
};
 
169
 
 
170
static const uint16_t silk_model_ltp_filter[] = { 256, 77, 157, 256 };
 
171
 
 
172
static const uint16_t silk_model_ltp_filter0_sel[] = {
 
173
    256, 185, 200, 213, 226, 235, 244, 250, 256
 
174
};
 
175
 
 
176
static const uint16_t silk_model_ltp_filter1_sel[] = {
 
177
    256,  57,  91, 112, 132, 147, 160, 172, 185, 195, 205, 214, 224, 233, 241, 248, 256
 
178
};
 
179
 
 
180
static const uint16_t silk_model_ltp_filter2_sel[] = {
 
181
    256,  15,  31,  45,  57,  69,  81,  92, 103, 114, 124, 133, 142, 151, 160, 168,
 
182
    176, 184, 192, 199, 206, 212, 218, 223, 227, 232, 236, 240, 244, 247, 251, 254, 256
 
183
};
 
184
 
 
185
static const uint16_t silk_model_ltp_scale_index[] = { 256, 128, 192, 256 };
 
186
 
 
187
static const uint16_t silk_model_lcg_seed[] = { 256, 64, 128, 192, 256 };
 
188
 
 
189
static const uint16_t silk_model_exc_rate[2][10] = {
 
190
    { 256,  15,  66,  78, 124, 169, 182, 215, 242, 256 }, // unvoiced
 
191
    { 256,  33,  63,  99, 116, 150, 199, 217, 238, 256 }  // voiced
 
192
};
 
193
 
 
194
static const uint16_t silk_model_pulse_count[11][19] = {
 
195
    { 256, 131, 205, 230, 238, 241, 244, 245, 246,
 
196
      247, 248, 249, 250, 251, 252, 253, 254, 255, 256 },
 
197
    { 256,  58, 151, 211, 234, 241, 244, 245, 246,
 
198
      247, 248, 249, 250, 251, 252, 253, 254, 255, 256 },
 
199
    { 256,  43,  94, 140, 173, 197, 213, 224, 232,
 
200
      238, 241, 244, 247, 249, 250, 251, 253, 254, 256 },
 
201
    { 256,  17,  69, 140, 197, 228, 240, 245, 246,
 
202
      247, 248, 249, 250, 251, 252, 253, 254, 255, 256 },
 
203
    { 256,   6,  27,  68, 121, 170, 205, 226, 237,
 
204
      243, 246, 248, 250, 251, 252, 253, 254, 255, 256 },
 
205
    { 256,   7,  21,  43,  71, 100, 128, 153, 173,
 
206
      190, 203, 214, 223, 230, 235, 239, 243, 246, 256 },
 
207
    { 256,   2,   7,  21,  50,  92, 138, 179, 210,
 
208
      229, 240, 246, 249, 251, 252, 253, 254, 255, 256 },
 
209
    { 256,   1,   3,   7,  17,  36,  65, 100, 137,
 
210
      171, 199, 219, 233, 241, 246, 250, 252, 254, 256 },
 
211
    { 256,   1,   3,   5,  10,  19,  33,  53,  77,
 
212
      104, 132, 158, 181, 201, 216, 227, 235, 241, 256 },
 
213
    { 256,   1,   2,   3,   9,  36,  94, 150, 189,
 
214
      214, 228, 238, 244, 247, 250, 252, 253, 254, 256 },
 
215
    { 256,   2,   3,   9,  36,  94, 150, 189, 214,
 
216
      228, 238, 244, 247, 250, 252, 253, 254, 256, 256 }
 
217
};
 
218
 
 
219
static const uint16_t silk_model_pulse_location[4][168] = {
 
220
    {
 
221
        256, 126, 256,
 
222
        256, 56, 198, 256,
 
223
        256, 25, 126, 230, 256,
 
224
        256, 12, 72, 180, 244, 256,
 
225
        256, 7, 42, 126, 213, 250, 256,
 
226
        256, 4, 24, 83, 169, 232, 253, 256,
 
227
        256, 3, 15, 53, 125, 200, 242, 254, 256,
 
228
        256, 2, 10, 35, 89, 162, 221, 248, 255, 256,
 
229
        256, 2, 7, 24, 63, 126, 191, 233, 251, 255, 256,
 
230
        256, 1, 5, 17, 45, 94, 157, 211, 241, 252, 255, 256,
 
231
        256, 1, 5, 13, 33, 70, 125, 182, 223, 245, 253, 255, 256,
 
232
        256, 1, 4, 11, 26, 54, 98, 151, 199, 232, 248, 254, 255, 256,
 
233
        256, 1, 3, 9, 21, 42, 77, 124, 172, 212, 237, 249, 254, 255, 256,
 
234
        256, 1, 2, 6, 16, 33, 60, 97, 144, 187, 220, 241, 250, 254, 255, 256,
 
235
        256, 1, 2, 3, 11, 25, 47, 80, 120, 163, 201, 229, 245, 253, 254, 255, 256,
 
236
        256, 1, 2, 3, 4, 17, 35, 62, 98, 139, 180, 214, 238, 252, 253, 254, 255, 256
 
237
    },{
 
238
        256, 127, 256,
 
239
        256, 53, 202, 256,
 
240
        256, 22, 127, 233, 256,
 
241
        256, 11, 72, 183, 246, 256,
 
242
        256, 6, 41, 127, 215, 251, 256,
 
243
        256, 4, 24, 83, 170, 232, 253, 256,
 
244
        256, 3, 16, 56, 127, 200, 241, 254, 256,
 
245
        256, 3, 12, 39, 92, 162, 218, 246, 255, 256,
 
246
        256, 3, 11, 30, 67, 124, 185, 229, 249, 255, 256,
 
247
        256, 3, 10, 25, 53, 97, 151, 200, 233, 250, 255, 256,
 
248
        256, 1, 8, 21, 43, 77, 123, 171, 209, 237, 251, 255, 256,
 
249
        256, 1, 2, 13, 35, 62, 97, 139, 186, 219, 244, 254, 255, 256,
 
250
        256, 1, 2, 8, 22, 48, 85, 128, 171, 208, 234, 248, 254, 255, 256,
 
251
        256, 1, 2, 6, 16, 36, 67, 107, 149, 189, 220, 240, 250, 254, 255, 256,
 
252
        256, 1, 2, 5, 13, 29, 55, 90, 128, 166, 201, 227, 243, 251, 254, 255, 256,
 
253
        256, 1, 2, 4, 10, 22, 43, 73, 109, 147, 183, 213, 234, 246, 252, 254, 255, 256
 
254
    },{
 
255
        256, 127, 256,
 
256
        256, 49, 206, 256,
 
257
        256, 20, 127, 236, 256,
 
258
        256, 11, 71, 184, 246, 256,
 
259
        256, 7, 43, 127, 214, 250, 256,
 
260
        256, 6, 30, 87, 169, 229, 252, 256,
 
261
        256, 5, 23, 62, 126, 194, 236, 252, 256,
 
262
        256, 6, 20, 49, 96, 157, 209, 239, 253, 256,
 
263
        256, 1, 16, 39, 74, 125, 175, 215, 245, 255, 256,
 
264
        256, 1, 2, 23, 55, 97, 149, 195, 236, 254, 255, 256,
 
265
        256, 1, 7, 23, 50, 86, 128, 170, 206, 233, 249, 255, 256,
 
266
        256, 1, 6, 18, 39, 70, 108, 148, 186, 217, 238, 250, 255, 256,
 
267
        256, 1, 4, 13, 30, 56, 90, 128, 166, 200, 226, 243, 252, 255, 256,
 
268
        256, 1, 4, 11, 25, 47, 76, 110, 146, 180, 209, 231, 245, 252, 255, 256,
 
269
        256, 1, 3, 8, 19, 37, 62, 93, 128, 163, 194, 219, 237, 248, 253, 255, 256,
 
270
        256, 1, 2, 6, 15, 30, 51, 79, 111, 145, 177, 205, 226, 241, 250, 254, 255, 256
 
271
    },{
 
272
        256, 128, 256,
 
273
        256, 42, 214, 256,
 
274
        256, 21, 128, 235, 256,
 
275
        256, 12, 72, 184, 245, 256,
 
276
        256, 8, 42, 128, 214, 249, 256,
 
277
        256, 8, 31, 86, 176, 231, 251, 256,
 
278
        256, 5, 20, 58, 130, 202, 238, 253, 256,
 
279
        256, 6, 18, 45, 97, 174, 221, 241, 251, 256,
 
280
        256, 6, 25, 53, 88, 128, 168, 203, 231, 250, 256,
 
281
        256, 4, 18, 40, 71, 108, 148, 185, 216, 238, 252, 256,
 
282
        256, 3, 13, 31, 57, 90, 128, 166, 199, 225, 243, 253, 256,
 
283
        256, 2, 10, 23, 44, 73, 109, 147, 183, 212, 233, 246, 254, 256,
 
284
        256, 1, 6, 16, 33, 58, 90, 128, 166, 198, 223, 240, 250, 255, 256,
 
285
        256, 1, 5, 12, 25, 46, 75, 110, 146, 181, 210, 231, 244, 251, 255, 256,
 
286
        256, 1, 3, 8, 18, 35, 60, 92, 128, 164, 196, 221, 238, 248, 253, 255, 256,
 
287
        256, 1, 3, 7, 14, 27, 48, 76, 110, 146, 180, 208, 229, 242, 249, 253, 255, 256
 
288
    }
 
289
};
 
290
 
 
291
static const uint16_t silk_model_excitation_lsb[] = {256, 136, 256};
 
292
 
 
293
static const uint16_t silk_model_excitation_sign[3][2][7][3] = {
 
294
    {    // Inactive
 
295
        {    // Low offset
 
296
            {256,   2, 256},
 
297
            {256, 207, 256},
 
298
            {256, 189, 256},
 
299
            {256, 179, 256},
 
300
            {256, 174, 256},
 
301
            {256, 163, 256},
 
302
            {256, 157, 256}
 
303
        }, { // High offset
 
304
            {256,  58, 256},
 
305
            {256, 245, 256},
 
306
            {256, 238, 256},
 
307
            {256, 232, 256},
 
308
            {256, 225, 256},
 
309
            {256, 220, 256},
 
310
            {256, 211, 256}
 
311
        }
 
312
    }, { // Unvoiced
 
313
        {    // Low offset
 
314
            {256,   1, 256},
 
315
            {256, 210, 256},
 
316
            {256, 190, 256},
 
317
            {256, 178, 256},
 
318
            {256, 169, 256},
 
319
            {256, 162, 256},
 
320
            {256, 152, 256}
 
321
        }, { // High offset
 
322
            {256,  48, 256},
 
323
            {256, 242, 256},
 
324
            {256, 235, 256},
 
325
            {256, 224, 256},
 
326
            {256, 214, 256},
 
327
            {256, 205, 256},
 
328
            {256, 190, 256}
 
329
        }
 
330
    }, { // Voiced
 
331
        {    // Low offset
 
332
            {256,   1, 256},
 
333
            {256, 162, 256},
 
334
            {256, 152, 256},
 
335
            {256, 147, 256},
 
336
            {256, 144, 256},
 
337
            {256, 141, 256},
 
338
            {256, 138, 256}
 
339
        }, { // High offset
 
340
            {256,   8, 256},
 
341
            {256, 203, 256},
 
342
            {256, 187, 256},
 
343
            {256, 176, 256},
 
344
            {256, 168, 256},
 
345
            {256, 161, 256},
 
346
            {256, 154, 256}
 
347
        }
 
348
    }
 
349
};
 
350
 
 
351
static const int16_t silk_stereo_weights[] = {
 
352
    -13732, -10050,  -8266,  -7526,  -6500,  -5000,  -2950,   -820,
 
353
       820,   2950,   5000,   6500,   7526,   8266,  10050,  13732
 
354
};
 
355
 
 
356
static const uint8_t silk_lsf_s2_model_sel_nbmb[32][10] = {
 
357
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
358
    { 1, 3, 1, 2, 2, 1, 2, 1, 1, 1 },
 
359
    { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 
360
    { 1, 2, 2, 2, 2, 1, 2, 1, 1, 1 },
 
361
    { 2, 3, 3, 3, 3, 2, 2, 2, 2, 2 },
 
362
    { 0, 5, 3, 3, 2, 2, 2, 2, 1, 1 },
 
363
    { 0, 2, 2, 2, 2, 2, 2, 2, 2, 1 },
 
364
    { 2, 3, 6, 4, 4, 4, 5, 4, 5, 5 },
 
365
    { 2, 4, 5, 5, 4, 5, 4, 6, 4, 4 },
 
366
    { 2, 4, 4, 7, 4, 5, 4, 5, 5, 4 },
 
367
    { 4, 3, 3, 3, 2, 3, 2, 2, 2, 2 },
 
368
    { 1, 5, 5, 6, 4, 5, 4, 5, 5, 5 },
 
369
    { 2, 7, 4, 6, 5, 5, 5, 5, 5, 5 },
 
370
    { 2, 7, 5, 5, 5, 5, 5, 6, 5, 4 },
 
371
    { 3, 3, 5, 4, 4, 5, 4, 5, 4, 4 },
 
372
    { 2, 3, 3, 5, 5, 4, 4, 4, 4, 4 },
 
373
    { 2, 4, 4, 6, 4, 5, 4, 5, 5, 5 },
 
374
    { 2, 5, 4, 6, 5, 5, 5, 4, 5, 4 },
 
375
    { 2, 7, 4, 5, 4, 5, 4, 5, 5, 5 },
 
376
    { 2, 5, 4, 6, 7, 6, 5, 6, 5, 4 },
 
377
    { 3, 6, 7, 4, 6, 5, 5, 6, 4, 5 },
 
378
    { 2, 7, 6, 4, 4, 4, 5, 4, 5, 5 },
 
379
    { 4, 5, 5, 4, 6, 6, 5, 6, 5, 4 },
 
380
    { 2, 5, 5, 6, 5, 6, 4, 6, 4, 4 },
 
381
    { 4, 5, 5, 5, 3, 7, 4, 5, 5, 4 },
 
382
    { 2, 3, 4, 5, 5, 6, 4, 5, 5, 4 },
 
383
    { 2, 3, 2, 3, 3, 4, 2, 3, 3, 3 },
 
384
    { 1, 1, 2, 2, 2, 2, 2, 3, 2, 2 },
 
385
    { 4, 5, 5, 6, 6, 6, 5, 6, 4, 5 },
 
386
    { 3, 5, 5, 4, 4, 4, 4, 3, 3, 2 },
 
387
    { 2, 5, 3, 7, 5, 5, 4, 4, 5, 4 },
 
388
    { 4, 4, 5, 4, 5, 6, 5, 6, 5, 4 }
 
389
};
 
390
 
 
391
static const uint8_t silk_lsf_s2_model_sel_wb[32][16] = {
 
392
    {  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 },
 
393
    { 10, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10,  9,  9,  9,  8, 11 },
 
394
    { 10, 13, 13, 11, 15, 12, 12, 13, 10, 13, 12, 13, 13, 12, 11, 11 },
 
395
    {  8, 10,  9, 10, 10,  9,  9,  9,  9,  9,  8,  8,  8,  8,  8,  9 },
 
396
    {  8, 14, 13, 12, 14, 12, 15, 13, 12, 12, 12, 13, 13, 12, 12, 11 },
 
397
    {  8, 11, 13, 13, 12, 11, 11, 13, 11, 11, 11, 11, 11, 11, 10, 12 },
 
398
    {  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 },
 
399
    {  8, 10, 14, 11, 15, 10, 13, 11, 12, 13, 13, 12, 11, 11, 10, 11 },
 
400
    {  8, 14, 10, 14, 14, 12, 13, 12, 14, 13, 12, 12, 13, 11, 11, 11 },
 
401
    { 10,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 },
 
402
    {  8,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  9 },
 
403
    { 10, 10, 11, 12, 13, 11, 11, 11, 11, 11, 11, 11, 10, 10,  9, 11 },
 
404
    { 10, 10, 11, 11, 12, 11, 11, 11, 11, 11, 11, 11, 11, 10,  9, 11 },
 
405
    { 11, 12, 12, 12, 14, 12, 12, 13, 11, 13, 12, 12, 13, 12, 11, 12 },
 
406
    {  8, 14, 12, 13, 12, 15, 13, 10, 14, 13, 15, 12, 12, 11, 13, 11 },
 
407
    {  8,  9,  8,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,  8,  9,  8 },
 
408
    {  9, 14, 13, 15, 13, 12, 13, 11, 12, 13, 12, 12, 12, 11, 11, 12 },
 
409
    {  9, 11, 11, 12, 12, 11, 11, 13, 10, 11, 11, 13, 13, 13, 11, 12 },
 
410
    { 10, 11, 11, 10, 10, 10, 11, 10,  9, 10,  9, 10,  9,  9,  9, 12 },
 
411
    {  8, 10, 11, 13, 11, 11, 10, 10, 10,  9,  9,  8,  8,  8,  8,  8 },
 
412
    { 11, 12, 11, 13, 11, 11, 10, 10,  9,  9,  9,  9,  9, 10, 10, 12 },
 
413
    { 10, 14, 11, 15, 15, 12, 13, 12, 13, 11, 13, 11, 11, 10, 11, 11 },
 
414
    { 10, 11, 13, 14, 14, 11, 13, 11, 12, 12, 11, 11, 11, 11, 10, 12 },
 
415
    {  9, 11, 11, 12, 12, 12, 12, 11, 13, 13, 13, 11,  9,  9,  9,  9 },
 
416
    { 10, 13, 11, 14, 14, 12, 15, 12, 12, 13, 11, 12, 12, 11, 11, 11 },
 
417
    {  8, 14,  9,  9,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 },
 
418
    {  8, 14, 14, 11, 13, 10, 13, 13, 11, 12, 12, 15, 15, 12, 12, 12 },
 
419
    { 11, 11, 15, 11, 13, 12, 11, 11, 11, 10, 10, 11, 11, 11, 10, 11 },
 
420
    {  8,  8,  9,  8,  8,  8, 10,  9, 10,  9,  9, 10, 10, 10,  9,  9 },
 
421
    {  8, 11, 10, 13, 11, 11, 10, 11, 10,  9,  8,  8,  9,  8,  8,  9 },
 
422
    { 11, 13, 13, 12, 15, 13, 11, 11, 10, 11, 10, 10,  9,  8,  9,  8 },
 
423
    { 10, 11, 13, 11, 12, 11, 11, 11, 10,  9, 10, 14, 12,  8,  8,  8 }
 
424
};
 
425
 
 
426
static const uint8_t silk_lsf_pred_weights_nbmb[2][9] = {
 
427
    {179, 138, 140, 148, 151, 149, 153, 151, 163},
 
428
    {116,  67,  82,  59,  92,  72, 100,  89,  92}
 
429
};
 
430
 
 
431
static const uint8_t silk_lsf_pred_weights_wb[2][15] = {
 
432
    {175, 148, 160, 176, 178, 173, 174, 164, 177, 174, 196, 182, 198, 192, 182},
 
433
    { 68,  62,  66,  60,  72, 117,  85,  90, 118, 136, 151, 142, 160, 142, 155}
 
434
};
 
435
 
 
436
static const uint8_t silk_lsf_weight_sel_nbmb[32][9] = {
 
437
    { 0, 1, 0, 0, 0, 0, 0, 0, 0 },
 
438
    { 1, 0, 0, 0, 0, 0, 0, 0, 0 },
 
439
    { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
440
    { 1, 1, 1, 0, 0, 0, 0, 1, 0 },
 
441
    { 0, 1, 0, 0, 0, 0, 0, 0, 0 },
 
442
    { 0, 1, 0, 0, 0, 0, 0, 0, 0 },
 
443
    { 1, 0, 1, 1, 0, 0, 0, 1, 0 },
 
444
    { 0, 1, 1, 0, 0, 1, 1, 0, 0 },
 
445
    { 0, 0, 1, 1, 0, 1, 0, 1, 1 },
 
446
    { 0, 0, 1, 1, 0, 0, 1, 1, 1 },
 
447
    { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
448
    { 0, 1, 0, 1, 1, 1, 1, 1, 0 },
 
449
    { 0, 1, 0, 1, 1, 1, 1, 1, 0 },
 
450
    { 0, 1, 1, 1, 1, 1, 1, 1, 0 },
 
451
    { 1, 0, 1, 1, 0, 1, 1, 1, 1 },
 
452
    { 0, 1, 1, 1, 1, 1, 0, 1, 0 },
 
453
    { 0, 0, 1, 1, 0, 1, 0, 1, 0 },
 
454
    { 0, 0, 1, 1, 1, 0, 1, 1, 1 },
 
455
    { 0, 1, 1, 0, 0, 1, 1, 1, 0 },
 
456
    { 0, 0, 0, 1, 1, 1, 0, 1, 0 },
 
457
    { 0, 1, 1, 0, 0, 1, 0, 1, 0 },
 
458
    { 0, 1, 1, 0, 0, 0, 1, 1, 0 },
 
459
    { 0, 0, 0, 0, 0, 1, 1, 1, 1 },
 
460
    { 0, 0, 1, 1, 0, 0, 0, 1, 1 },
 
461
    { 0, 0, 0, 1, 0, 1, 1, 1, 1 },
 
462
    { 0, 1, 1, 1, 1, 1, 1, 1, 0 },
 
463
    { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
464
    { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
465
    { 0, 0, 1, 0, 1, 1, 0, 1, 0 },
 
466
    { 1, 0, 0, 1, 0, 0, 0, 0, 0 },
 
467
    { 0, 0, 0, 1, 1, 0, 1, 0, 1 },
 
468
    { 1, 0, 1, 1, 0, 1, 1, 1, 1 }
 
469
};
 
470
 
 
471
static const uint8_t silk_lsf_weight_sel_wb[32][15] = {
 
472
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 
473
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
474
    { 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0 },
 
475
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
 
476
    { 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0 },
 
477
    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
478
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 },
 
479
    { 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 },
 
480
    { 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1 },
 
481
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 
482
    { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
483
    { 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0 },
 
484
    { 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
 
485
    { 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0 },
 
486
    { 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 },
 
487
    { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
 
488
    { 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0 },
 
489
    { 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0 },
 
490
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 
491
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
 
492
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 
493
    { 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0 },
 
494
    { 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
 
495
    { 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0 },
 
496
    { 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1 },
 
497
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 
498
    { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1 },
 
499
    { 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 },
 
500
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 
501
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 
502
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
 
503
    { 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0 }
 
504
};
 
505
 
 
506
static const uint8_t silk_lsf_codebook_nbmb[32][10] = {
 
507
    { 12,  35,  60,  83, 108, 132, 157, 180, 206, 228 },
 
508
    { 15,  32,  55,  77, 101, 125, 151, 175, 201, 225 },
 
509
    { 19,  42,  66,  89, 114, 137, 162, 184, 209, 230 },
 
510
    { 12,  25,  50,  72,  97, 120, 147, 172, 200, 223 },
 
511
    { 26,  44,  69,  90, 114, 135, 159, 180, 205, 225 },
 
512
    { 13,  22,  53,  80, 106, 130, 156, 180, 205, 228 },
 
513
    { 15,  25,  44,  64,  90, 115, 142, 168, 196, 222 },
 
514
    { 19,  24,  62,  82, 100, 120, 145, 168, 190, 214 },
 
515
    { 22,  31,  50,  79, 103, 120, 151, 170, 203, 227 },
 
516
    { 21,  29,  45,  65, 106, 124, 150, 171, 196, 224 },
 
517
    { 30,  49,  75,  97, 121, 142, 165, 186, 209, 229 },
 
518
    { 19,  25,  52,  70,  93, 116, 143, 166, 192, 219 },
 
519
    { 26,  34,  62,  75,  97, 118, 145, 167, 194, 217 },
 
520
    { 25,  33,  56,  70,  91, 113, 143, 165, 196, 223 },
 
521
    { 21,  34,  51,  72,  97, 117, 145, 171, 196, 222 },
 
522
    { 20,  29,  50,  67,  90, 117, 144, 168, 197, 221 },
 
523
    { 22,  31,  48,  66,  95, 117, 146, 168, 196, 222 },
 
524
    { 24,  33,  51,  77, 116, 134, 158, 180, 200, 224 },
 
525
    { 21,  28,  70,  87, 106, 124, 149, 170, 194, 217 },
 
526
    { 26,  33,  53,  64,  83, 117, 152, 173, 204, 225 },
 
527
    { 27,  34,  65,  95, 108, 129, 155, 174, 210, 225 },
 
528
    { 20,  26,  72,  99, 113, 131, 154, 176, 200, 219 },
 
529
    { 34,  43,  61,  78,  93, 114, 155, 177, 205, 229 },
 
530
    { 23,  29,  54,  97, 124, 138, 163, 179, 209, 229 },
 
531
    { 30,  38,  56,  89, 118, 129, 158, 178, 200, 231 },
 
532
    { 21,  29,  49,  63,  85, 111, 142, 163, 193, 222 },
 
533
    { 27,  48,  77, 103, 133, 158, 179, 196, 215, 232 },
 
534
    { 29,  47,  74,  99, 124, 151, 176, 198, 220, 237 },
 
535
    { 33,  42,  61,  76,  93, 121, 155, 174, 207, 225 },
 
536
    { 29,  53,  87, 112, 136, 154, 170, 188, 208, 227 },
 
537
    { 24,  30,  52,  84, 131, 150, 166, 186, 203, 229 },
 
538
    { 37,  48,  64,  84, 104, 118, 156, 177, 201, 230 }
 
539
};
 
540
 
 
541
static const uint8_t silk_lsf_codebook_wb[32][16] = {
 
542
    {  7,  23,  38,  54,  69,  85, 100, 116, 131, 147, 162, 178, 193, 208, 223, 239 },
 
543
    { 13,  25,  41,  55,  69,  83,  98, 112, 127, 142, 157, 171, 187, 203, 220, 236 },
 
544
    { 15,  21,  34,  51,  61,  78,  92, 106, 126, 136, 152, 167, 185, 205, 225, 240 },
 
545
    { 10,  21,  36,  50,  63,  79,  95, 110, 126, 141, 157, 173, 189, 205, 221, 237 },
 
546
    { 17,  20,  37,  51,  59,  78,  89, 107, 123, 134, 150, 164, 184, 205, 224, 240 },
 
547
    { 10,  15,  32,  51,  67,  81,  96, 112, 129, 142, 158, 173, 189, 204, 220, 236 },
 
548
    {  8,  21,  37,  51,  65,  79,  98, 113, 126, 138, 155, 168, 179, 192, 209, 218 },
 
549
    { 12,  15,  34,  55,  63,  78,  87, 108, 118, 131, 148, 167, 185, 203, 219, 236 },
 
550
    { 16,  19,  32,  36,  56,  79,  91, 108, 118, 136, 154, 171, 186, 204, 220, 237 },
 
551
    { 11,  28,  43,  58,  74,  89, 105, 120, 135, 150, 165, 180, 196, 211, 226, 241 },
 
552
    {  6,  16,  33,  46,  60,  75,  92, 107, 123, 137, 156, 169, 185, 199, 214, 225 },
 
553
    { 11,  19,  30,  44,  57,  74,  89, 105, 121, 135, 152, 169, 186, 202, 218, 234 },
 
554
    { 12,  19,  29,  46,  57,  71,  88, 100, 120, 132, 148, 165, 182, 199, 216, 233 },
 
555
    { 17,  23,  35,  46,  56,  77,  92, 106, 123, 134, 152, 167, 185, 204, 222, 237 },
 
556
    { 14,  17,  45,  53,  63,  75,  89, 107, 115, 132, 151, 171, 188, 206, 221, 240 },
 
557
    {  9,  16,  29,  40,  56,  71,  88, 103, 119, 137, 154, 171, 189, 205, 222, 237 },
 
558
    { 16,  19,  36,  48,  57,  76,  87, 105, 118, 132, 150, 167, 185, 202, 218, 236 },
 
559
    { 12,  17,  29,  54,  71,  81,  94, 104, 126, 136, 149, 164, 182, 201, 221, 237 },
 
560
    { 15,  28,  47,  62,  79,  97, 115, 129, 142, 155, 168, 180, 194, 208, 223, 238 },
 
561
    {  8,  14,  30,  45,  62,  78,  94, 111, 127, 143, 159, 175, 192, 207, 223, 239 },
 
562
    { 17,  30,  49,  62,  79,  92, 107, 119, 132, 145, 160, 174, 190, 204, 220, 235 },
 
563
    { 14,  19,  36,  45,  61,  76,  91, 108, 121, 138, 154, 172, 189, 205, 222, 238 },
 
564
    { 12,  18,  31,  45,  60,  76,  91, 107, 123, 138, 154, 171, 187, 204, 221, 236 },
 
565
    { 13,  17,  31,  43,  53,  70,  83, 103, 114, 131, 149, 167, 185, 203, 220, 237 },
 
566
    { 17,  22,  35,  42,  58,  78,  93, 110, 125, 139, 155, 170, 188, 206, 224, 240 },
 
567
    {  8,  15,  34,  50,  67,  83,  99, 115, 131, 146, 162, 178, 193, 209, 224, 239 },
 
568
    { 13,  16,  41,  66,  73,  86,  95, 111, 128, 137, 150, 163, 183, 206, 225, 241 },
 
569
    { 17,  25,  37,  52,  63,  75,  92, 102, 119, 132, 144, 160, 175, 191, 212, 231 },
 
570
    { 19,  31,  49,  65,  83, 100, 117, 133, 147, 161, 174, 187, 200, 213, 227, 242 },
 
571
    { 18,  31,  52,  68,  88, 103, 117, 126, 138, 149, 163, 177, 192, 207, 223, 239 },
 
572
    { 16,  29,  47,  61,  76,  90, 106, 119, 133, 147, 161, 176, 193, 209, 224, 240 },
 
573
    { 15,  21,  35,  50,  61,  73,  86,  97, 110, 119, 129, 141, 175, 198, 218, 237 }
 
574
};
 
575
 
 
576
static const uint16_t silk_lsf_min_spacing_nbmb[] = {
 
577
    250, 3, 6, 3, 3, 3, 4, 3, 3, 3, 461
 
578
};
 
579
 
 
580
static const uint16_t silk_lsf_min_spacing_wb[] = {
 
581
    100, 3, 40, 3, 3, 3, 5, 14, 14, 10, 11, 3, 8, 9, 7, 3, 347
 
582
};
 
583
 
 
584
static const uint8_t silk_lsf_ordering_nbmb[] = {
 
585
    0, 9, 6, 3, 4, 5, 8, 1, 2, 7
 
586
};
 
587
 
 
588
static const uint8_t silk_lsf_ordering_wb[] = {
 
589
    0, 15, 8, 7, 4, 11, 12, 3, 2, 13, 10, 5, 6, 9, 14, 1
 
590
};
 
591
 
 
592
static const int16_t silk_cosine[] = { /* (0.12) */
 
593
     4096,  4095,  4091,  4085,
 
594
     4076,  4065,  4052,  4036,
 
595
     4017,  3997,  3973,  3948,
 
596
     3920,  3889,  3857,  3822,
 
597
     3784,  3745,  3703,  3659,
 
598
     3613,  3564,  3513,  3461,
 
599
     3406,  3349,  3290,  3229,
 
600
     3166,  3102,  3035,  2967,
 
601
     2896,  2824,  2751,  2676,
 
602
     2599,  2520,  2440,  2359,
 
603
     2276,  2191,  2106,  2019,
 
604
     1931,  1842,  1751,  1660,
 
605
     1568,  1474,  1380,  1285,
 
606
     1189,  1093,   995,   897,
 
607
      799,   700,   601,   501,
 
608
      401,   301,   201,   101,
 
609
        0,  -101,  -201,  -301,
 
610
     -401,  -501,  -601,  -700,
 
611
     -799,  -897,  -995, -1093,
 
612
    -1189, -1285, -1380, -1474,
 
613
    -1568, -1660, -1751, -1842,
 
614
    -1931, -2019, -2106, -2191,
 
615
    -2276, -2359, -2440, -2520,
 
616
    -2599, -2676, -2751, -2824,
 
617
    -2896, -2967, -3035, -3102,
 
618
    -3166, -3229, -3290, -3349,
 
619
    -3406, -3461, -3513, -3564,
 
620
    -3613, -3659, -3703, -3745,
 
621
    -3784, -3822, -3857, -3889,
 
622
    -3920, -3948, -3973, -3997,
 
623
    -4017, -4036, -4052, -4065,
 
624
    -4076, -4085, -4091, -4095,
 
625
    -4096
 
626
};
 
627
 
 
628
static const uint16_t silk_pitch_scale[]   = {  4,   6,   8};
 
629
 
 
630
static const uint16_t silk_pitch_min_lag[] = { 16,  24,  32};
 
631
 
 
632
static const uint16_t silk_pitch_max_lag[] = {144, 216, 288};
 
633
 
 
634
static const int8_t silk_pitch_offset_nb10ms[3][2] = {
 
635
    { 0,  0},
 
636
    { 1,  0},
 
637
    { 0,  1}
 
638
};
 
639
 
 
640
static const int8_t silk_pitch_offset_nb20ms[11][4] = {
 
641
    { 0,  0,  0,  0},
 
642
    { 2,  1,  0, -1},
 
643
    {-1,  0,  1,  2},
 
644
    {-1,  0,  0,  1},
 
645
    {-1,  0,  0,  0},
 
646
    { 0,  0,  0,  1},
 
647
    { 0,  0,  1,  1},
 
648
    { 1,  1,  0,  0},
 
649
    { 1,  0,  0,  0},
 
650
    { 0,  0,  0, -1},
 
651
    { 1,  0,  0, -1}
 
652
};
 
653
 
 
654
static const int8_t silk_pitch_offset_mbwb10ms[12][2] = {
 
655
    { 0,  0},
 
656
    { 0,  1},
 
657
    { 1,  0},
 
658
    {-1,  1},
 
659
    { 1, -1},
 
660
    {-1,  2},
 
661
    { 2, -1},
 
662
    {-2,  2},
 
663
    { 2, -2},
 
664
    {-2,  3},
 
665
    { 3, -2},
 
666
    {-3,  3}
 
667
};
 
668
 
 
669
static const int8_t silk_pitch_offset_mbwb20ms[34][4] = {
 
670
    { 0,  0,  0,  0},
 
671
    { 0,  0,  1,  1},
 
672
    { 1,  1,  0,  0},
 
673
    {-1,  0,  0,  0},
 
674
    { 0,  0,  0,  1},
 
675
    { 1,  0,  0,  0},
 
676
    {-1,  0,  0,  1},
 
677
    { 0,  0,  0, -1},
 
678
    {-1,  0,  1,  2},
 
679
    { 1,  0,  0, -1},
 
680
    {-2, -1,  1,  2},
 
681
    { 2,  1,  0, -1},
 
682
    {-2,  0,  0,  2},
 
683
    {-2,  0,  1,  3},
 
684
    { 2,  1, -1, -2},
 
685
    {-3, -1,  1,  3},
 
686
    { 2,  0,  0, -2},
 
687
    { 3,  1,  0, -2},
 
688
    {-3, -1,  2,  4},
 
689
    {-4, -1,  1,  4},
 
690
    { 3,  1, -1, -3},
 
691
    {-4, -1,  2,  5},
 
692
    { 4,  2, -1, -3},
 
693
    { 4,  1, -1, -4},
 
694
    {-5, -1,  2,  6},
 
695
    { 5,  2, -1, -4},
 
696
    {-6, -2,  2,  6},
 
697
    {-5, -2,  2,  5},
 
698
    { 6,  2, -1, -5},
 
699
    {-7, -2,  3,  8},
 
700
    { 6,  2, -2, -6},
 
701
    { 5,  2, -2, -5},
 
702
    { 8,  3, -2, -7},
 
703
    {-9, -3,  3,  9}
 
704
};
 
705
 
 
706
static const int8_t silk_ltp_filter0_taps[8][5] = {
 
707
    {  4,   6,  24,   7,   5},
 
708
    {  0,   0,   2,   0,   0},
 
709
    { 12,  28,  41,  13,  -4},
 
710
    { -9,  15,  42,  25,  14},
 
711
    {  1,  -2,  62,  41,  -9},
 
712
    {-10,  37,  65,  -4,   3},
 
713
    { -6,   4,  66,   7,  -8},
 
714
    { 16,  14,  38,  -3,  33}
 
715
};
 
716
 
 
717
static const int8_t silk_ltp_filter1_taps[16][5] = {
 
718
    { 13,  22,  39,  23,  12},
 
719
    { -1,  36,  64,  27,  -6},
 
720
    { -7,  10,  55,  43,  17},
 
721
    {  1,   1,   8,   1,   1},
 
722
    {  6, -11,  74,  53,  -9},
 
723
    {-12,  55,  76, -12,   8},
 
724
    { -3,   3,  93,  27,  -4},
 
725
    { 26,  39,  59,   3,  -8},
 
726
    {  2,   0,  77,  11,   9},
 
727
    { -8,  22,  44,  -6,   7},
 
728
    { 40,   9,  26,   3,   9},
 
729
    { -7,  20, 101,  -7,   4},
 
730
    {  3,  -8,  42,  26,   0},
 
731
    {-15,  33,  68,   2,  23},
 
732
    { -2,  55,  46,  -2,  15},
 
733
    {  3,  -1,  21,  16,  41}
 
734
};
 
735
 
 
736
static const int8_t silk_ltp_filter2_taps[32][5] = {
 
737
    { -6,  27,  61,  39,   5},
 
738
    {-11,  42,  88,   4,   1},
 
739
    { -2,  60,  65,   6,  -4},
 
740
    { -1,  -5,  73,  56,   1},
 
741
    { -9,  19,  94,  29,  -9},
 
742
    {  0,  12,  99,   6,   4},
 
743
    {  8, -19, 102,  46, -13},
 
744
    {  3,   2,  13,   3,   2},
 
745
    {  9, -21,  84,  72, -18},
 
746
    {-11,  46, 104, -22,   8},
 
747
    { 18,  38,  48,  23,   0},
 
748
    {-16,  70,  83, -21,  11},
 
749
    {  5, -11, 117,  22,  -8},
 
750
    { -6,  23, 117, -12,   3},
 
751
    {  3,  -8,  95,  28,   4},
 
752
    {-10,  15,  77,  60, -15},
 
753
    { -1,   4, 124,   2,  -4},
 
754
    {  3,  38,  84,  24, -25},
 
755
    {  2,  13,  42,  13,  31},
 
756
    { 21,  -4,  56,  46,  -1},
 
757
    { -1,  35,  79, -13,  19},
 
758
    { -7,  65,  88,  -9, -14},
 
759
    { 20,   4,  81,  49, -29},
 
760
    { 20,   0,  75,   3, -17},
 
761
    {  5,  -9,  44,  92,  -8},
 
762
    {  1,  -3,  22,  69,  31},
 
763
    { -6,  95,  41, -12,   5},
 
764
    { 39,  67,  16,  -4,   1},
 
765
    {  0,  -6, 120,  55, -36},
 
766
    {-13,  44, 122,   4, -24},
 
767
    { 81,   5,  11,   3,   7},
 
768
    {  2,   0,   9,  10,  88}
 
769
};
 
770
 
 
771
static const uint16_t silk_ltp_scale_factor[] = {15565, 12288, 8192};
 
772
 
 
773
static const uint8_t silk_shell_blocks[3][2] = {
 
774
    { 5, 10}, // NB
 
775
    { 8, 15}, // MB
 
776
    {10, 20}  // WB
 
777
};
 
778
 
 
779
static const uint8_t silk_quant_offset[2][2] = { /* (0.23) */
 
780
    {25, 60}, // Inactive or Unvoiced
 
781
    { 8, 25}  // Voiced
 
782
};
 
783
 
 
784
static const int silk_stereo_interp_len[3] = {
 
785
    64, 96, 128
 
786
};
 
787
 
 
788
static inline void silk_stabilize_lsf(int16_t nlsf[16], int order, const uint16_t min_delta[17])
 
789
{
 
790
    int pass, i;
 
791
    for (pass = 0; pass < 20; pass++) {
 
792
        int k, min_diff = 0;
 
793
        for (i = 0; i < order+1; i++) {
 
794
            int low  = i != 0     ? nlsf[i-1] : 0;
 
795
            int high = i != order ? nlsf[i]   : 32768;
 
796
            int diff = (high - low) - (min_delta[i]);
 
797
 
 
798
            if (diff < min_diff) {
 
799
                min_diff = diff;
 
800
                k = i;
 
801
 
 
802
                if (pass == 20)
 
803
                    break;
 
804
            }
 
805
        }
 
806
        if (min_diff == 0) /* no issues; stabilized */
 
807
            return;
 
808
 
 
809
        /* wiggle one or two LSFs */
 
810
        if (k == 0) {
 
811
            /* repel away from lower bound */
 
812
            nlsf[0] = min_delta[0];
 
813
        } else if (k == order) {
 
814
            /* repel away from higher bound */
 
815
            nlsf[order-1] = 32768 - min_delta[order];
 
816
        } else {
 
817
            /* repel away from current position */
 
818
            int min_center = 0, max_center = 32768, center_val;
 
819
 
 
820
            /* lower extent */
 
821
            for (i = 0; i < k; i++)
 
822
                min_center += min_delta[i];
 
823
            min_center += min_delta[k] >> 1;
 
824
 
 
825
            /* upper extent */
 
826
            for (i = order; i > k; i--)
 
827
                max_center -= min_delta[k];
 
828
            max_center -= min_delta[k] >> 1;
 
829
 
 
830
            /* move apart */
 
831
            center_val = nlsf[k - 1] + nlsf[k];
 
832
            center_val = (center_val >> 1) + (center_val & 1); // rounded divide by 2
 
833
            center_val = FFMIN(max_center, FFMAX(min_center, center_val));
 
834
 
 
835
            nlsf[k - 1] = center_val - (min_delta[k] >> 1);
 
836
            nlsf[k]     = nlsf[k - 1] + min_delta[k];
 
837
        }
 
838
    }
 
839
 
 
840
    /* resort to the fall-back method, the standard method for LSF stabilization */
 
841
 
 
842
    /* sort; as the LSFs should be nearly sorted, use insertion sort */
 
843
    for (i = 1; i < order; i++) {
 
844
        int j, value = nlsf[i];
 
845
        for (j = i - 1; j >= 0 && nlsf[j] > value; j--)
 
846
            nlsf[j + 1] = nlsf[j];
 
847
        nlsf[j + 1] = value;
 
848
    }
 
849
 
 
850
    /* push forwards to increase distance */
 
851
    if (nlsf[0] < min_delta[0])
 
852
        nlsf[0] = min_delta[0];
 
853
    for (i = 1; i < order; i++)
 
854
        if (nlsf[i] < nlsf[i - 1] + min_delta[i])
 
855
            nlsf[i] = nlsf[i - 1] + min_delta[i];
 
856
 
 
857
    /* push backwards to increase distance */
 
858
    if (nlsf[order-1] > 32768 - min_delta[order])
 
859
        nlsf[order-1] = 32768 - min_delta[order];
 
860
    for (i = order-2; i >= 0; i--)
 
861
        if (nlsf[i] > nlsf[i + 1] - min_delta[i+1])
 
862
            nlsf[i] = nlsf[i + 1] - min_delta[i+1];
 
863
 
 
864
    return;
 
865
}
 
866
 
 
867
static inline int silk_is_lpc_stable(const int16_t lpc[16], int order)
 
868
{
 
869
    int k, j, DC_resp = 0;
 
870
    int32_t lpc32[2][16];       // Q24
 
871
    int totalinvgain = 1 << 30; // 1.0 in Q30
 
872
    int32_t *row = lpc32[0], *prevrow;
 
873
 
 
874
    /* initialize the first row for the Levinson recursion */
 
875
    for (k = 0; k < order; k++) {
 
876
        DC_resp += lpc[k];
 
877
        row[k] = lpc[k] * 4096;
 
878
    }
 
879
 
 
880
    if (DC_resp >= 4096)
 
881
        return 0;
 
882
 
 
883
    /* check if prediction gain pushes any coefficients too far */
 
884
    for (k = order - 1; 1; k--) {
 
885
        int rc;      // Q31; reflection coefficient
 
886
        int gaindiv; // Q30; inverse of the gain (the divisor)
 
887
        int gain;    // gain for this reflection coefficient
 
888
        int fbits;   // fractional bits used for the gain
 
889
        int error;   // Q29; estimate of the error of our partial estimate of 1/gaindiv
 
890
 
 
891
        if (FFABS(row[k]) > 16773022)
 
892
            return 0;
 
893
 
 
894
        rc      = -(row[k] * 128);
 
895
        gaindiv = (1 << 30) - MULH(rc, rc);
 
896
 
 
897
        totalinvgain = MULH(totalinvgain, gaindiv) << 2;
 
898
        if (k == 0)
 
899
            return (totalinvgain >= 107374);
 
900
 
 
901
        /* approximate 1.0/gaindiv */
 
902
        fbits = opus_ilog(gaindiv);
 
903
        gain  = ((1 << 29) - 1) / (gaindiv >> (fbits + 1 - 16)); // Q<fbits-16>
 
904
        error = (1 << 29) - MULL(gaindiv << (15 + 16 - fbits), gain, 16);
 
905
        gain  = ((gain << 16) + (error * gain >> 13));
 
906
 
 
907
        /* switch to the next row of the LPC coefficients */
 
908
        prevrow = row;
 
909
        row = lpc32[k & 1];
 
910
 
 
911
        for (j = 0; j < k; j++) {
 
912
            int x = prevrow[j] - ROUND_MULL(prevrow[k - j - 1], rc, 31);
 
913
            row[j] = ROUND_MULL(x, gain, fbits);
 
914
        }
 
915
    }
 
916
}
 
917
 
 
918
static void silk_lsp2poly(const int32_t lsp[16], int32_t pol[16], int half_order)
 
919
{
 
920
    int i, j;
 
921
 
 
922
    pol[0] = 65536; // 1.0 in Q16
 
923
    pol[1] = -lsp[0];
 
924
 
 
925
    for (i = 1; i < half_order; i++) {
 
926
        pol[i + 1] = pol[i - 1] * 2 - ROUND_MULL(lsp[2 * i], pol[i], 16);
 
927
        for (j = i; j > 1; j--)
 
928
            pol[j] += pol[j - 2] - ROUND_MULL(lsp[2 * i], pol[j - 1], 16);
 
929
 
 
930
        pol[1] -= lsp[2 * i];
 
931
    }
 
932
}
 
933
 
 
934
static void silk_lsf2lpc(const int16_t nlsf[16], float lpcf[16], int order)
 
935
{
 
936
    int i, k;
 
937
    int32_t lsp[16];     // Q17; 2*cos(LSF)
 
938
    int32_t p[9], q[9];  // Q16
 
939
    int32_t lpc32[16];   // Q17
 
940
    int16_t lpc[16];     // Q12
 
941
 
 
942
    /* convert the LSFs to LSPs, i.e. 2*cos(LSF) */
 
943
    for (k = 0; k < order; k++) {
 
944
        int index = nlsf[k] >> 8;
 
945
        int offset = nlsf[k] & 255;
 
946
        int k2 = (order == 10) ? silk_lsf_ordering_nbmb[k] : silk_lsf_ordering_wb[k];
 
947
 
 
948
        /* interpolate and round */
 
949
        lsp[k2]  = silk_cosine[index] * 256;
 
950
        lsp[k2] += (silk_cosine[index + 1] - silk_cosine[index]) * offset;
 
951
        lsp[k2]  = (lsp[k2] + 4) >> 3;
 
952
    }
 
953
 
 
954
    silk_lsp2poly(lsp    , p, order >> 1);
 
955
    silk_lsp2poly(lsp + 1, q, order >> 1);
 
956
 
 
957
    /* reconstruct A(z) */
 
958
    for (k = 0; k < order>>1; k++) {
 
959
        lpc32[k]         = -p[k + 1] - p[k] - q[k + 1] + q[k];
 
960
        lpc32[order-k-1] = -p[k + 1] - p[k] + q[k + 1] - q[k];
 
961
    }
 
962
 
 
963
    /* limit the range of the LPC coefficients to each fit within an int16_t */
 
964
    for (i = 0; i < 10; i++) {
 
965
        int j;
 
966
        unsigned int maxabs = 0;
 
967
        for (j = 0, k = 0; j < order; j++) {
 
968
            unsigned int x = FFABS(lpc32[k]);
 
969
            if (x > maxabs) {
 
970
                maxabs = x; // Q17
 
971
                k      = j;
 
972
            }
 
973
        }
 
974
 
 
975
        maxabs = (maxabs + 16) >> 5; // convert to Q12
 
976
 
 
977
        if (maxabs > 32767) {
 
978
            /* perform bandwidth expansion */
 
979
            unsigned int chirp, chirp_base; // Q16
 
980
            maxabs = FFMIN(maxabs, 163838); // anything above this overflows chirp's numerator
 
981
            chirp_base = chirp = 65470 - ((maxabs - 32767) << 14) / ((maxabs * (k+1)) >> 2);
 
982
 
 
983
            for (k = 0; k < order; k++) {
 
984
                lpc32[k] = ROUND_MULL(lpc32[k], chirp, 16);
 
985
                chirp    = (chirp_base * chirp + 32768) >> 16;
 
986
            }
 
987
        } else break;
 
988
    }
 
989
 
 
990
    if (i == 10) {
 
991
        /* time's up: just clamp */
 
992
        for (k = 0; k < order; k++) {
 
993
            int x = (lpc32[k] + 16) >> 5;
 
994
            lpc[k] = av_clip_int16(x);
 
995
            lpc32[k] = lpc[k] << 5; // shortcut mandated by the spec; drops lower 5 bits
 
996
        }
 
997
    } else {
 
998
        for (k = 0; k < order; k++)
 
999
            lpc[k] = (lpc32[k] + 16) >> 5;
 
1000
    }
 
1001
 
 
1002
    /* if the prediction gain causes the LPC filter to become unstable,
 
1003
       apply further bandwidth expansion on the Q17 coefficients */
 
1004
    for (i = 1; i <= 16 && !silk_is_lpc_stable(lpc, order); i++) {
 
1005
        unsigned int chirp, chirp_base;
 
1006
        chirp_base = chirp = 65536 - (1 << i);
 
1007
 
 
1008
        for (k = 0; k < order; k++) {
 
1009
            lpc32[k] = ROUND_MULL(lpc32[k], chirp, 16);
 
1010
            lpc[k]   = (lpc32[k] + 16) >> 5;
 
1011
            chirp    = (chirp_base * chirp + 32768) >> 16;
 
1012
        }
 
1013
    }
 
1014
 
 
1015
    for (i = 0; i < order; i++)
 
1016
        lpcf[i] = lpc[i] / 4096.0f;
 
1017
}
 
1018
 
 
1019
static inline void silk_decode_lpc(SilkContext *s, SilkFrame *frame,
 
1020
                                   OpusRangeCoder *rc,
 
1021
                                   float lpc_leadin[16], float lpc[16],
 
1022
                                   int *lpc_order, int *has_lpc_leadin, int voiced)
 
1023
{
 
1024
    int i;
 
1025
    int order;                   // order of the LP polynomial; 10 for NB/MB and 16 for WB
 
1026
    int8_t  lsf_i1, lsf_i2[16];  // stage-1 and stage-2 codebook indices
 
1027
    int16_t lsf_res[16];         // residual as a Q10 value
 
1028
    int16_t nlsf[16];            // Q15
 
1029
 
 
1030
    *lpc_order = order = s->wb ? 16 : 10;
 
1031
 
 
1032
    /* obtain LSF stage-1 and stage-2 indices */
 
1033
    lsf_i1 = opus_rc_getsymbol(rc, silk_model_lsf_s1[s->wb][voiced]);
 
1034
    for (i = 0; i < order; i++) {
 
1035
        int index = s->wb ? silk_lsf_s2_model_sel_wb  [lsf_i1][i] :
 
1036
                            silk_lsf_s2_model_sel_nbmb[lsf_i1][i];
 
1037
        lsf_i2[i] = opus_rc_getsymbol(rc, silk_model_lsf_s2[index]) - 4;
 
1038
        if (lsf_i2[i] == -4)
 
1039
            lsf_i2[i] -= opus_rc_getsymbol(rc, silk_model_lsf_s2_ext);
 
1040
        else if (lsf_i2[i] == 4)
 
1041
            lsf_i2[i] += opus_rc_getsymbol(rc, silk_model_lsf_s2_ext);
 
1042
    }
 
1043
 
 
1044
    /* reverse the backwards-prediction step */
 
1045
    for (i = order - 1; i >= 0; i--) {
 
1046
        int qstep = s->wb ? 9830 : 11796;
 
1047
 
 
1048
        lsf_res[i] = lsf_i2[i] * 1024;
 
1049
        if (lsf_i2[i] < 0)      lsf_res[i] += 102;
 
1050
        else if (lsf_i2[i] > 0) lsf_res[i] -= 102;
 
1051
        lsf_res[i] = (lsf_res[i] * qstep) >> 16;
 
1052
 
 
1053
        if (i + 1 < order) {
 
1054
            int weight = s->wb ? silk_lsf_pred_weights_wb  [silk_lsf_weight_sel_wb  [lsf_i1][i]][i] :
 
1055
                                 silk_lsf_pred_weights_nbmb[silk_lsf_weight_sel_nbmb[lsf_i1][i]][i];
 
1056
            lsf_res[i] += (lsf_res[i+1] * weight) >> 8;
 
1057
        }
 
1058
    }
 
1059
 
 
1060
    /* reconstruct the NLSF coefficients from the supplied indices */
 
1061
    for (i = 0; i < order; i++) {
 
1062
        const uint8_t * codebook = s->wb ? silk_lsf_codebook_wb  [lsf_i1] :
 
1063
                                           silk_lsf_codebook_nbmb[lsf_i1];
 
1064
        int cur, prev, next, weight_sq, weight, ipart, fpart, y, value;
 
1065
 
 
1066
        /* find the weight of the residual */
 
1067
        /* TODO: precompute */
 
1068
        cur = codebook[i];
 
1069
        prev = i ? codebook[i - 1] : 0;
 
1070
        next = i + 1 < order ? codebook[i + 1] : 256;
 
1071
        weight_sq = (1024 / (cur - prev) + 1024 / (next - cur)) << 16;
 
1072
 
 
1073
        /* approximate square-root with mandated fixed-point arithmetic */
 
1074
        ipart = opus_ilog(weight_sq);
 
1075
        fpart = (weight_sq >> (ipart-8)) & 127;
 
1076
        y = ((ipart & 1) ? 32768 : 46214) >> ((32 - ipart)>>1);
 
1077
        weight = y + ((213 * fpart * y) >> 16);
 
1078
 
 
1079
        value = cur * 128 + (lsf_res[i] * 16384) / weight;
 
1080
        nlsf[i] = av_clip(value, 0, 32767);
 
1081
    }
 
1082
 
 
1083
    /* stabilize the NLSF coefficients */
 
1084
    silk_stabilize_lsf(nlsf, order, s->wb ? silk_lsf_min_spacing_wb :
 
1085
                                            silk_lsf_min_spacing_nbmb);
 
1086
 
 
1087
    /* produce an interpolation for the first 2 subframes, */
 
1088
    /* and then convert both sets of NLSFs to LPC coefficients */
 
1089
    *has_lpc_leadin = 0;
 
1090
    if (s->subframes == 4) {
 
1091
        int offset = opus_rc_getsymbol(rc, silk_model_lsf_interpolation_offset);
 
1092
        if (offset != 4 && frame->coded) {
 
1093
            *has_lpc_leadin = 1;
 
1094
            if (offset != 0) {
 
1095
                int16_t nlsf_leadin[16];
 
1096
                for (i = 0; i < order; i++)
 
1097
                    nlsf_leadin[i] = frame->nlsf[i] +
 
1098
                        ((nlsf[i] - frame->nlsf[i]) * offset >> 2);
 
1099
                silk_lsf2lpc(nlsf_leadin, lpc_leadin, order);
 
1100
            } else  /* avoid re-computation for a (roughly) 1-in-4 occurrence */
 
1101
                memcpy(lpc_leadin, frame->lpc, 16 * sizeof(float));
 
1102
        } else
 
1103
            offset = 4;
 
1104
        s->nlsf_interp_factor = offset;
 
1105
 
 
1106
        silk_lsf2lpc(nlsf, lpc, order);
 
1107
    } else {
 
1108
        s->nlsf_interp_factor = 4;
 
1109
        silk_lsf2lpc(nlsf, lpc, order);
 
1110
    }
 
1111
 
 
1112
    memcpy(frame->nlsf, nlsf, order * sizeof(nlsf[0]));
 
1113
    memcpy(frame->lpc,  lpc,  order * sizeof(lpc[0]));
 
1114
}
 
1115
 
 
1116
static inline void silk_count_children(OpusRangeCoder *rc, int model, int32_t total,
 
1117
                                       int32_t child[2])
 
1118
{
 
1119
    if (total != 0) {
 
1120
        child[0] = opus_rc_getsymbol(rc,
 
1121
                       silk_model_pulse_location[model] + (((total - 1 + 5) * (total - 1)) >> 1));
 
1122
        child[1] = total - child[0];
 
1123
    } else {
 
1124
        child[0] = 0;
 
1125
        child[1] = 0;
 
1126
    }
 
1127
}
 
1128
 
 
1129
static inline void silk_decode_excitation(SilkContext *s, OpusRangeCoder *rc,
 
1130
                                          float* excitationf,
 
1131
                                          int qoffset_high, int active, int voiced)
 
1132
{
 
1133
    int i;
 
1134
    uint32_t seed;
 
1135
    int shellblocks;
 
1136
    int ratelevel;
 
1137
    uint8_t pulsecount[20];     // total pulses in each shell block
 
1138
    uint8_t lsbcount[20] = {0}; // raw lsbits defined for each pulse in each shell block
 
1139
    int32_t excitation[320];    // Q23
 
1140
 
 
1141
    /* excitation parameters */
 
1142
    seed = opus_rc_getsymbol(rc, silk_model_lcg_seed);
 
1143
    shellblocks = silk_shell_blocks[s->bandwidth][s->subframes >> 2];
 
1144
    ratelevel = opus_rc_getsymbol(rc, silk_model_exc_rate[voiced]);
 
1145
 
 
1146
    for (i = 0; i < shellblocks; i++) {
 
1147
        pulsecount[i] = opus_rc_getsymbol(rc, silk_model_pulse_count[ratelevel]);
 
1148
        if (pulsecount[i] == 17) {
 
1149
            while (pulsecount[i] == 17 && ++lsbcount[i] != 10)
 
1150
                pulsecount[i] = opus_rc_getsymbol(rc, silk_model_pulse_count[9]);
 
1151
            if (lsbcount[i] == 10)
 
1152
                pulsecount[i] = opus_rc_getsymbol(rc, silk_model_pulse_count[10]);
 
1153
        }
 
1154
    }
 
1155
 
 
1156
    /* decode pulse locations using PVQ */
 
1157
    for (i = 0; i < shellblocks; i++) {
 
1158
        if (pulsecount[i] != 0) {
 
1159
            int a, b, c, d;
 
1160
            int32_t * location = excitation + 16*i;
 
1161
            int32_t branch[4][2];
 
1162
            branch[0][0] = pulsecount[i];
 
1163
 
 
1164
            /* unrolled tail recursion */
 
1165
            for (a = 0; a < 1; a++) {
 
1166
                silk_count_children(rc, 0, branch[0][a], branch[1]);
 
1167
                for (b = 0; b < 2; b++) {
 
1168
                    silk_count_children(rc, 1, branch[1][b], branch[2]);
 
1169
                    for (c = 0; c < 2; c++) {
 
1170
                        silk_count_children(rc, 2, branch[2][c], branch[3]);
 
1171
                        for (d = 0; d < 2; d++) {
 
1172
                            silk_count_children(rc, 3, branch[3][d], location);
 
1173
                            location += 2;
 
1174
                        }
 
1175
                    }
 
1176
                }
 
1177
            }
 
1178
        } else
 
1179
            memset(excitation + 16*i, 0, 16*sizeof(int32_t));
 
1180
    }
 
1181
 
 
1182
    /* decode least significant bits */
 
1183
    for (i = 0; i < shellblocks << 4; i++) {
 
1184
        int bit;
 
1185
        for (bit = 0; bit < lsbcount[i >> 4]; bit++)
 
1186
            excitation[i] = (excitation[i] << 1) |
 
1187
                            opus_rc_getsymbol(rc, silk_model_excitation_lsb);
 
1188
    }
 
1189
 
 
1190
    /* decode signs */
 
1191
    for (i = 0; i < shellblocks << 4; i++) {
 
1192
        if (excitation[i] != 0) {
 
1193
            int sign = opus_rc_getsymbol(rc, silk_model_excitation_sign[active +
 
1194
                                         voiced][qoffset_high][FFMIN(pulsecount[i >> 4], 6)]);
 
1195
            if (sign == 0)
 
1196
                excitation[i] *= -1;
 
1197
        }
 
1198
    }
 
1199
 
 
1200
    /* assemble the excitation */
 
1201
    for (i = 0; i < shellblocks << 4; i++) {
 
1202
        int value = excitation[i];
 
1203
        excitation[i] = value * 256 | silk_quant_offset[voiced][qoffset_high];
 
1204
        if (value < 0)      excitation[i] += 20;
 
1205
        else if (value > 0) excitation[i] -= 20;
 
1206
 
 
1207
        /* invert samples pseudorandomly */
 
1208
        seed = 196314165 * seed + 907633515;
 
1209
        if (seed & 0x80000000)
 
1210
            excitation[i] *= -1;
 
1211
        seed += value;
 
1212
 
 
1213
        excitationf[i] = excitation[i] / 8388608.0f;
 
1214
    }
 
1215
}
 
1216
 
 
1217
/** Maximum residual history according to 4.2.7.6.1 */
 
1218
#define SILK_MAX_LAG  (288 + LTP_ORDER / 2)
 
1219
 
 
1220
/** Order of the LTP filter */
 
1221
#define LTP_ORDER 5
 
1222
 
 
1223
static void silk_decode_frame(SilkContext *s, OpusRangeCoder *rc,
 
1224
                              int frame_num, int channel, int coded_channels, int active, int active1)
 
1225
{
 
1226
    /* per frame */
 
1227
    int voiced;       // combines with active to indicate inactive, active, or active+voiced
 
1228
    int qoffset_high;
 
1229
    int order;                             // order of the LPC coefficients
 
1230
    float lpc_leadin[16], lpc_body[16], residual[SILK_MAX_LAG + SILK_HISTORY];
 
1231
    int has_lpc_leadin;
 
1232
    float ltpscale;
 
1233
 
 
1234
    /* per subframe */
 
1235
    struct {
 
1236
        float gain;
 
1237
        int pitchlag;
 
1238
        float ltptaps[5];
 
1239
    } sf[4];
 
1240
 
 
1241
    SilkFrame * const frame = s->frame + channel;
 
1242
 
 
1243
    int i;
 
1244
 
 
1245
    /* obtain stereo weights */
 
1246
    if (coded_channels == 2 && channel == 0) {
 
1247
        int n, wi[2], ws[2], w[2];
 
1248
        n     = opus_rc_getsymbol(rc, silk_model_stereo_s1);
 
1249
        wi[0] = opus_rc_getsymbol(rc, silk_model_stereo_s2) + 3 * (n / 5);
 
1250
        ws[0] = opus_rc_getsymbol(rc, silk_model_stereo_s3);
 
1251
        wi[1] = opus_rc_getsymbol(rc, silk_model_stereo_s2) + 3 * (n % 5);
 
1252
        ws[1] = opus_rc_getsymbol(rc, silk_model_stereo_s3);
 
1253
 
 
1254
        for (i = 0; i < 2; i++)
 
1255
            w[i] = silk_stereo_weights[wi[i]] +
 
1256
                   (((silk_stereo_weights[wi[i] + 1] - silk_stereo_weights[wi[i]]) * 6554) >> 16)
 
1257
                    * (ws[i]*2 + 1);
 
1258
 
 
1259
        s->stereo_weights[0] = (w[0] - w[1]) / 8192.0;
 
1260
        s->stereo_weights[1] = w[1]          / 8192.0;
 
1261
 
 
1262
        /* and read the mid-only flag */
 
1263
        s->midonly = active1 ? 0 : opus_rc_getsymbol(rc, silk_model_mid_only);
 
1264
    }
 
1265
 
 
1266
    /* obtain frame type */
 
1267
    if (!active) {
 
1268
        qoffset_high = opus_rc_getsymbol(rc, silk_model_frame_type_inactive);
 
1269
        voiced = 0;
 
1270
    } else {
 
1271
        int type = opus_rc_getsymbol(rc, silk_model_frame_type_active);
 
1272
        qoffset_high = type & 1;
 
1273
        voiced = type >> 1;
 
1274
    }
 
1275
 
 
1276
    /* obtain subframe quantization gains */
 
1277
    for (i = 0; i < s->subframes; i++) {
 
1278
        int log_gain;     //Q7
 
1279
        int ipart, fpart, lingain;
 
1280
 
 
1281
        if (i == 0 && (frame_num == 0 || !frame->coded)) {
 
1282
            /* gain is coded absolute */
 
1283
            int x = opus_rc_getsymbol(rc, silk_model_gain_highbits[active + voiced]);
 
1284
            log_gain = (x<<3) | opus_rc_getsymbol(rc, silk_model_gain_lowbits);
 
1285
 
 
1286
            if (frame->coded)
 
1287
                log_gain = FFMAX(log_gain, frame->log_gain - 16);
 
1288
        } else {
 
1289
            /* gain is coded relative */
 
1290
            int delta_gain = opus_rc_getsymbol(rc, silk_model_gain_delta);
 
1291
            log_gain = av_clip(FFMAX((delta_gain<<1) - 16,
 
1292
                                     frame->log_gain + delta_gain - 4), 0, 63);
 
1293
        }
 
1294
 
 
1295
        frame->log_gain = log_gain;
 
1296
 
 
1297
        /* approximate 2**(x/128) with a Q7 (i.e. non-integer) input */
 
1298
        log_gain = (log_gain * 0x1D1C71 >> 16) + 2090;
 
1299
        ipart = log_gain >> 7;
 
1300
        fpart = log_gain & 127;
 
1301
        lingain = (1 << ipart) + ((-174 * fpart * (128-fpart) >>16) + fpart) * ((1<<ipart) >> 7);
 
1302
        sf[i].gain = lingain / 65536.0f;
 
1303
    }
 
1304
 
 
1305
    /* obtain LPC filter coefficients */
 
1306
    silk_decode_lpc(s, frame, rc, lpc_leadin, lpc_body, &order, &has_lpc_leadin, voiced);
 
1307
 
 
1308
    /* obtain pitch lags, if this is a voiced frame */
 
1309
    if (voiced) {
 
1310
        int lag_absolute = (!frame_num || !frame->prev_voiced);
 
1311
        int primarylag;         // primary pitch lag for the entire SILK frame
 
1312
        int ltpfilter;
 
1313
        const int8_t * offsets;
 
1314
 
 
1315
        if (!lag_absolute) {
 
1316
            int delta = opus_rc_getsymbol(rc, silk_model_pitch_delta);
 
1317
            if (delta)
 
1318
                primarylag = frame->primarylag + delta - 9;
 
1319
            else
 
1320
                lag_absolute = 1;
 
1321
        }
 
1322
 
 
1323
        if (lag_absolute) {
 
1324
            /* primary lag is coded absolute */
 
1325
            int highbits, lowbits;
 
1326
            const uint16_t *model[] = {
 
1327
                silk_model_pitch_lowbits_nb, silk_model_pitch_lowbits_mb,
 
1328
                silk_model_pitch_lowbits_wb
 
1329
            };
 
1330
            highbits = opus_rc_getsymbol(rc, silk_model_pitch_highbits);
 
1331
            lowbits  = opus_rc_getsymbol(rc, model[s->bandwidth]);
 
1332
 
 
1333
            primarylag = silk_pitch_min_lag[s->bandwidth] +
 
1334
                         highbits*silk_pitch_scale[s->bandwidth] + lowbits;
 
1335
        }
 
1336
        frame->primarylag = primarylag;
 
1337
 
 
1338
        if (s->subframes == 2)
 
1339
            offsets = (s->bandwidth == OPUS_BANDWIDTH_NARROWBAND)
 
1340
                     ? silk_pitch_offset_nb10ms[opus_rc_getsymbol(rc,
 
1341
                                                silk_model_pitch_contour_nb10ms)]
 
1342
                     : silk_pitch_offset_mbwb10ms[opus_rc_getsymbol(rc,
 
1343
                                                silk_model_pitch_contour_mbwb10ms)];
 
1344
        else
 
1345
            offsets = (s->bandwidth == OPUS_BANDWIDTH_NARROWBAND)
 
1346
                     ? silk_pitch_offset_nb20ms[opus_rc_getsymbol(rc,
 
1347
                                                silk_model_pitch_contour_nb20ms)]
 
1348
                     : silk_pitch_offset_mbwb20ms[opus_rc_getsymbol(rc,
 
1349
                                                silk_model_pitch_contour_mbwb20ms)];
 
1350
 
 
1351
        for (i = 0; i < s->subframes; i++)
 
1352
            sf[i].pitchlag = av_clip(primarylag + offsets[i],
 
1353
                                     silk_pitch_min_lag[s->bandwidth],
 
1354
                                     silk_pitch_max_lag[s->bandwidth]);
 
1355
 
 
1356
        /* obtain LTP filter coefficients */
 
1357
        ltpfilter = opus_rc_getsymbol(rc, silk_model_ltp_filter);
 
1358
        for (i = 0; i < s->subframes; i++) {
 
1359
            int index, j;
 
1360
            const uint16_t *filter_sel[] = {
 
1361
                silk_model_ltp_filter0_sel, silk_model_ltp_filter1_sel,
 
1362
                silk_model_ltp_filter2_sel
 
1363
            };
 
1364
            const int8_t (*filter_taps[])[5] = {
 
1365
                silk_ltp_filter0_taps, silk_ltp_filter1_taps, silk_ltp_filter2_taps
 
1366
            };
 
1367
            index = opus_rc_getsymbol(rc, filter_sel[ltpfilter]);
 
1368
            for (j = 0; j < 5; j++)
 
1369
                sf[i].ltptaps[j] = filter_taps[ltpfilter][index][j] / 128.0f;
 
1370
        }
 
1371
    }
 
1372
 
 
1373
    /* obtain LTP scale factor */
 
1374
    if (voiced && frame_num == 0)
 
1375
        ltpscale = silk_ltp_scale_factor[opus_rc_getsymbol(rc,
 
1376
                                         silk_model_ltp_scale_index)] / 16384.0f;
 
1377
    else ltpscale = 15565.0f/16384.0f;
 
1378
 
 
1379
    /* generate the excitation signal for the entire frame */
 
1380
    silk_decode_excitation(s, rc, residual + SILK_MAX_LAG, qoffset_high,
 
1381
                           active, voiced);
 
1382
 
 
1383
    /* skip synthesising the side channel if we want mono-only */
 
1384
    if (s->output_channels == channel)
 
1385
        return;
 
1386
 
 
1387
    /* generate the output signal */
 
1388
    for (i = 0; i < s->subframes; i++) {
 
1389
        const float * lpc_coeff = (i < 2 && has_lpc_leadin) ? lpc_leadin : lpc_body;
 
1390
        float *dst    = frame->output      + SILK_HISTORY + i * s->sflength;
 
1391
        float *resptr = residual           + SILK_MAX_LAG + i * s->sflength;
 
1392
        float *lpc    = frame->lpc_history + SILK_HISTORY + i * s->sflength;
 
1393
        float sum;
 
1394
        int j, k;
 
1395
 
 
1396
        if (voiced) {
 
1397
            int out_end;
 
1398
            float scale;
 
1399
 
 
1400
            if (i < 2 || s->nlsf_interp_factor == 4) {
 
1401
                out_end = -i * s->sflength;
 
1402
                scale   = ltpscale;
 
1403
            } else {
 
1404
                out_end = -(i - 2) * s->sflength;
 
1405
                scale   = 1.0f;
 
1406
            }
 
1407
 
 
1408
            /* when the LPC coefficients change, a re-whitening filter is used */
 
1409
            /* to produce a residual that accounts for the change */
 
1410
            for (j = - sf[i].pitchlag - LTP_ORDER/2; j < out_end; j++) {
 
1411
                sum = dst[j];
 
1412
                for (k = 0; k < order; k++)
 
1413
                    sum -= lpc_coeff[k] * dst[j - k - 1];
 
1414
                resptr[j] = av_clipf(sum, -1.0f, 1.0f) * scale / sf[i].gain;
 
1415
            }
 
1416
 
 
1417
            if (out_end) {
 
1418
                float rescale = sf[i-1].gain / sf[i].gain;
 
1419
                for (j = out_end; j < 0; j++)
 
1420
                    resptr[j] *= rescale;
 
1421
            }
 
1422
 
 
1423
            /* LTP synthesis */
 
1424
            for (j = 0; j < s->sflength; j++) {
 
1425
                sum = resptr[j];
 
1426
                for (k = 0; k < LTP_ORDER; k++)
 
1427
                    sum += sf[i].ltptaps[k] * resptr[j - sf[i].pitchlag + LTP_ORDER/2 - k];
 
1428
                resptr[j] = sum;
 
1429
            }
 
1430
        }
 
1431
 
 
1432
        /* LPC synthesis */
 
1433
        for (j = 0; j < s->sflength; j++) {
 
1434
            sum = resptr[j] * sf[i].gain;
 
1435
            for (k = 1; k <= order; k++)
 
1436
                sum += lpc_coeff[k - 1] * lpc[j - k];
 
1437
 
 
1438
            lpc[j] = sum;
 
1439
            dst[j] = av_clipf(sum, -1.0f, 1.0f);
 
1440
        }
 
1441
    }
 
1442
 
 
1443
    frame->prev_voiced = voiced;
 
1444
    memmove(frame->lpc_history, frame->lpc_history + s->flength, SILK_HISTORY * sizeof(float));
 
1445
    memmove(frame->output,      frame->output      + s->flength, SILK_HISTORY * sizeof(float));
 
1446
 
 
1447
    frame->coded = 1;
 
1448
}
 
1449
 
 
1450
static void silk_unmix_ms(SilkContext *s, float *l, float *r)
 
1451
{
 
1452
    float *mid    = s->frame[0].output + SILK_HISTORY - s->flength;
 
1453
    float *side   = s->frame[1].output + SILK_HISTORY - s->flength;
 
1454
    float w0_prev = s->prev_stereo_weights[0];
 
1455
    float w1_prev = s->prev_stereo_weights[1];
 
1456
    float w0      = s->stereo_weights[0];
 
1457
    float w1      = s->stereo_weights[1];
 
1458
    int n1        = silk_stereo_interp_len[s->bandwidth];
 
1459
    int i;
 
1460
 
 
1461
    for (i = 0; i < n1; i++) {
 
1462
        float interp0 = w0_prev + i * (w0 - w0_prev) / n1;
 
1463
        float interp1 = w1_prev + i * (w1 - w1_prev) / n1;
 
1464
        float p0      = 0.25 * (mid[i - 2] + 2 * mid[i - 1] + mid[i]);
 
1465
 
 
1466
        l[i] = av_clipf((1 + interp1) * mid[i - 1] + side[i - 1] + interp0 * p0, -1.0, 1.0);
 
1467
        r[i] = av_clipf((1 - interp1) * mid[i - 1] - side[i - 1] - interp0 * p0, -1.0, 1.0);
 
1468
    }
 
1469
 
 
1470
    for (; i < s->flength; i++) {
 
1471
        float p0 = 0.25 * (mid[i - 2] + 2 * mid[i - 1] + mid[i]);
 
1472
 
 
1473
        l[i] = av_clipf((1 + w1) * mid[i - 1] + side[i - 1] + w0 * p0, -1.0, 1.0);
 
1474
        r[i] = av_clipf((1 - w1) * mid[i - 1] - side[i - 1] - w0 * p0, -1.0, 1.0);
 
1475
    }
 
1476
 
 
1477
    memcpy(s->prev_stereo_weights, s->stereo_weights, sizeof(s->stereo_weights));
 
1478
}
 
1479
 
 
1480
static void silk_flush_frame(SilkFrame *frame)
 
1481
{
 
1482
    if (!frame->coded)
 
1483
        return;
 
1484
 
 
1485
    memset(frame->output,      0, sizeof(frame->output));
 
1486
    memset(frame->lpc_history, 0, sizeof(frame->lpc_history));
 
1487
 
 
1488
    memset(frame->lpc,  0, sizeof(frame->lpc));
 
1489
    memset(frame->nlsf, 0, sizeof(frame->nlsf));
 
1490
 
 
1491
    frame->log_gain = 0;
 
1492
 
 
1493
    frame->primarylag  = 0;
 
1494
    frame->prev_voiced = 0;
 
1495
    frame->coded       = 0;
 
1496
}
 
1497
 
 
1498
int ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc,
 
1499
                              float *output[2],
 
1500
                              enum OpusBandwidth bandwidth,
 
1501
                              int coded_channels,
 
1502
                              int duration_ms)
 
1503
{
 
1504
    int active[2][6], redundancy[2];
 
1505
    int nb_frames, i, j;
 
1506
 
 
1507
    if (bandwidth > OPUS_BANDWIDTH_WIDEBAND ||
 
1508
        coded_channels > 2 || duration_ms > 60) {
 
1509
        av_log(s->avctx, AV_LOG_ERROR, "Invalid parameters passed "
 
1510
               "to the SILK decoder.\n");
 
1511
        return AVERROR(EINVAL);
 
1512
    }
 
1513
 
 
1514
    nb_frames = 1 + (duration_ms > 20) + (duration_ms > 40);
 
1515
    s->subframes = duration_ms / nb_frames / 5;         // 5ms subframes
 
1516
    s->sflength  = 20 * (bandwidth + 2);
 
1517
    s->flength   = s->sflength * s->subframes;
 
1518
    s->bandwidth = bandwidth;
 
1519
    s->wb        = bandwidth == OPUS_BANDWIDTH_WIDEBAND;
 
1520
 
 
1521
    /* make sure to flush the side channel when switching from mono to stereo */
 
1522
    if (coded_channels > s->prev_coded_channels)
 
1523
        silk_flush_frame(&s->frame[1]);
 
1524
    s->prev_coded_channels = coded_channels;
 
1525
 
 
1526
    /* read the LP-layer header bits */
 
1527
    for (i = 0; i < coded_channels; i++) {
 
1528
        for (j = 0; j < nb_frames; j++)
 
1529
            active[i][j] = opus_rc_p2model(rc, 1);
 
1530
 
 
1531
        redundancy[i] = opus_rc_p2model(rc, 1);
 
1532
        if (redundancy[i]) {
 
1533
            av_log(s->avctx, AV_LOG_ERROR, "LBRR frames present; this is unsupported\n");
 
1534
            return AVERROR_PATCHWELCOME;
 
1535
        }
 
1536
    }
 
1537
 
 
1538
    for (i = 0; i < nb_frames; i++) {
 
1539
        for (j = 0; j < coded_channels && !s->midonly; j++)
 
1540
            silk_decode_frame(s, rc, i, j, coded_channels, active[j][i], active[1][i]);
 
1541
 
 
1542
        /* reset the side channel if it is not coded */
 
1543
        if (s->midonly && s->frame[1].coded)
 
1544
            silk_flush_frame(&s->frame[1]);
 
1545
 
 
1546
        if (coded_channels == 1 || s->output_channels == 1) {
 
1547
            for (j = 0; j < s->output_channels; j++) {
 
1548
                memcpy(output[j] + i * s->flength,
 
1549
                       s->frame[0].output + SILK_HISTORY - s->flength - 2,
 
1550
                       s->flength * sizeof(float));
 
1551
            }
 
1552
        } else {
 
1553
            silk_unmix_ms(s, output[0] + i * s->flength, output[1] + i * s->flength);
 
1554
        }
 
1555
 
 
1556
        s->midonly        = 0;
 
1557
    }
 
1558
 
 
1559
    return nb_frames * s->flength;
 
1560
}
 
1561
 
 
1562
void ff_silk_free(SilkContext **ps)
 
1563
{
 
1564
    av_freep(ps);
 
1565
}
 
1566
 
 
1567
void ff_silk_flush(SilkContext *s)
 
1568
{
 
1569
    silk_flush_frame(&s->frame[0]);
 
1570
    silk_flush_frame(&s->frame[1]);
 
1571
 
 
1572
    memset(s->prev_stereo_weights, 0, sizeof(s->prev_stereo_weights));
 
1573
}
 
1574
 
 
1575
int ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels)
 
1576
{
 
1577
    SilkContext *s;
 
1578
 
 
1579
    if (output_channels != 1 && output_channels != 2) {
 
1580
        av_log(avctx, AV_LOG_ERROR, "Invalid number of output channels: %d\n",
 
1581
               output_channels);
 
1582
        return AVERROR(EINVAL);
 
1583
    }
 
1584
 
 
1585
    s = av_mallocz(sizeof(*s));
 
1586
    if (!s)
 
1587
        return AVERROR(ENOMEM);
 
1588
 
 
1589
    s->avctx           = avctx;
 
1590
    s->output_channels = output_channels;
 
1591
 
 
1592
    ff_silk_flush(s);
 
1593
 
 
1594
    *ps = s;
 
1595
 
 
1596
    return 0;
 
1597
}