1/* 2 * Copyright (c) 2012 Andrew D'Addesio 3 * Copyright (c) 2013-2014 Mozilla Corporation 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/** 23 * @file 24 * Opus SILK decoder 25 */ 26 27#include <stdint.h> 28 29#include "opus.h" 30 31typedef 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 44struct 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 64static 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 69static const uint16_t silk_model_stereo_s2[] = {256, 85, 171, 256}; 70 71static const uint16_t silk_model_stereo_s3[] = {256, 51, 102, 154, 205, 256}; 72 73static const uint16_t silk_model_mid_only[] = {256, 192, 256}; 74 75static const uint16_t silk_model_frame_type_inactive[] = {256, 26, 256}; 76 77static const uint16_t silk_model_frame_type_active[] = {256, 24, 98, 246, 256}; 78 79static 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 85static const uint16_t silk_model_gain_lowbits[] = {256, 32, 64, 96, 128, 160, 192, 224, 256}; 86 87static 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}; 92static 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 112static 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 134static const uint16_t silk_model_lsf_s2_ext[] = { 256, 156, 216, 240, 249, 253, 255, 256 }; 135 136static const uint16_t silk_model_lsf_interpolation_offset[] = { 256, 13, 35, 64, 75, 256 }; 137 138static 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 143static const uint16_t silk_model_pitch_lowbits_nb[]= { 256, 64, 128, 192, 256 }; 144 145static const uint16_t silk_model_pitch_lowbits_mb[]= { 256, 43, 85, 128, 171, 213, 256 }; 146 147static const uint16_t silk_model_pitch_lowbits_wb[]= { 256, 32, 64, 96, 128, 160, 192, 224, 256 }; 148 149static 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 154static const uint16_t silk_model_pitch_contour_nb10ms[] = { 256, 143, 193, 256 }; 155 156static const uint16_t silk_model_pitch_contour_nb20ms[] = { 157 256, 68, 80, 101, 118, 137, 159, 189, 213, 230, 246, 256 158}; 159 160static const uint16_t silk_model_pitch_contour_mbwb10ms[] = { 161 256, 91, 137, 176, 195, 209, 221, 229, 236, 242, 247, 252, 256 162}; 163 164static 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 170static const uint16_t silk_model_ltp_filter[] = { 256, 77, 157, 256 }; 171 172static const uint16_t silk_model_ltp_filter0_sel[] = { 173 256, 185, 200, 213, 226, 235, 244, 250, 256 174}; 175 176static 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 180static 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 185static const uint16_t silk_model_ltp_scale_index[] = { 256, 128, 192, 256 }; 186 187static const uint16_t silk_model_lcg_seed[] = { 256, 64, 128, 192, 256 }; 188 189static 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 194static 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 219static 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 291static const uint16_t silk_model_excitation_lsb[] = {256, 136, 256}; 292 293static 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 351static 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 356static 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 391static 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 426static 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 431static 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 436static 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 471static 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 506static 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 541static 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 576static const uint16_t silk_lsf_min_spacing_nbmb[] = { 577 250, 3, 6, 3, 3, 3, 4, 3, 3, 3, 461 578}; 579 580static 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 584static const uint8_t silk_lsf_ordering_nbmb[] = { 585 0, 9, 6, 3, 4, 5, 8, 1, 2, 7 586}; 587 588static 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 592static 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 628static const uint16_t silk_pitch_scale[] = { 4, 6, 8}; 629 630static const uint16_t silk_pitch_min_lag[] = { 16, 24, 32}; 631 632static const uint16_t silk_pitch_max_lag[] = {144, 216, 288}; 633 634static const int8_t silk_pitch_offset_nb10ms[3][2] = { 635 { 0, 0}, 636 { 1, 0}, 637 { 0, 1} 638}; 639 640static 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 654static 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 669static 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 706static 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 717static 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 736static 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 771static const uint16_t silk_ltp_scale_factor[] = {15565, 12288, 8192}; 772 773static const uint8_t silk_shell_blocks[3][2] = { 774 { 5, 10}, // NB 775 { 8, 15}, // MB 776 {10, 20} // WB 777}; 778 779static const uint8_t silk_quant_offset[2][2] = { /* (0.23) */ 780 {25, 60}, // Inactive or Unvoiced 781 { 8, 25} // Voiced 782}; 783 784static const int silk_stereo_interp_len[3] = { 785 64, 96, 128 786}; 787 788static 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 867static 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 918static 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 934static 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 1019static 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 1116static 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 1129static 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 1223static 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 1450static 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 1480static 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 1498int 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 1562void ff_silk_free(SilkContext **ps) 1563{ 1564 av_freep(ps); 1565} 1566 1567void 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 1575int 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} 1598