opus-rs 0.1.8

pure Rust implementation of Opus codec
Documentation
use crate::silk::define::*;

pub const LSF_COS_TAB_SZ_FIX: usize = 128;

pub const SILK_LSF_COS_TAB_FIX_Q12: [i16; LSF_COS_TAB_SZ_FIX + 1] = [
    8192, 8190, 8182, 8170, 8152, 8130, 8104, 8072, 8034, 7994, 7946, 7896, 7840, 7778, 7714, 7644,
    7568, 7490, 7406, 7318, 7226, 7128, 7026, 6922, 6812, 6698, 6580, 6458, 6332, 6204, 6070, 5934,
    5792, 5648, 5502, 5352, 5198, 5040, 4880, 4718, 4552, 4382, 4212, 4038, 3862, 3684, 3502, 3320,
    3136, 2948, 2760, 2570, 2378, 2186, 1990, 1794, 1598, 1400, 1202, 1002, 802, 602, 402, 202, 0,
    -202, -402, -602, -802, -1002, -1202, -1400, -1598, -1794, -1990, -2186, -2378, -2570, -2760,
    -2948, -3136, -3320, -3502, -3684, -3862, -4038, -4212, -4382, -4552, -4718, -4880, -5040,
    -5198, -5352, -5502, -5648, -5792, -5934, -6070, -6204, -6332, -6458, -6580, -6698, -6812,
    -6922, -7026, -7128, -7226, -7318, -7406, -7490, -7568, -7644, -7714, -7778, -7840, -7896,
    -7946, -7994, -8034, -8072, -8104, -8130, -8152, -8170, -8182, -8190, -8192,
];

pub const SILK_CB_LAGS_STAGE2_10_MS: [[i8; PE_NB_CBKS_STAGE2_10MS]; PE_MAX_NB_SUBFR >> 1] =
    [[0, 1, 0], [0, 0, 1]];

pub const SILK_CB_LAGS_STAGE3_10_MS: [[i8; PE_NB_CBKS_STAGE3_10MS]; PE_MAX_NB_SUBFR >> 1] = [
    [0, 0, 1, -1, 1, -1, 2, -2, 2, -2, 3, -3],
    [0, 1, 0, 1, -1, 2, -1, 2, -2, 3, -2, 3],
];

pub const SILK_LAG_RANGE_STAGE3_10_MS: [[i8; 2]; PE_MAX_NB_SUBFR >> 1] = [[-3, 7], [-2, 7]];

pub const SILK_CB_LAGS_STAGE2: [[i8; PE_NB_CBKS_STAGE2_EXT]; PE_MAX_NB_SUBFR] = [
    [0, 2, -1, -1, -1, 0, 0, 1, 1, 0, 1],
    [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
    [0, -1, 2, 1, 0, 1, 1, 0, 0, -1, -1],
];

pub const SILK_CB_LAGS_STAGE3: [[i8; PE_NB_CBKS_STAGE3_MAX]; PE_MAX_NB_SUBFR] = [
    [
        0, 0, 1, -1, 0, 1, -1, 0, -1, 1, -2, 2, -2, -2, 2, -3, 2, 3, -3, -4, 3, -4, 4, 4, -5, 5,
        -6, -5, 6, -7, 6, 5, 8, -9,
    ],
    [
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 1, -1, 0, 1, -1, -1, 1, -1, 2, 1, -1, 2, -2, -2,
        2, -2, 2, 2, 3, -3,
    ],
    [
        0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, -1, 1, 0, 0, 2, 1, -1, 2, -1, -1, 2, -1, 2, 2,
        -1, 3, -2, -2, -2, 3,
    ],
    [
        0, 1, 0, 0, 1, 0, 1, -1, 2, -1, 2, -1, 2, 3, -2, 3, -2, -2, 4, 4, -3, 5, -3, -4, 6, -4, 6,
        5, -5, 8, -6, -5, -7, 9,
    ],
];

pub const SILK_LAG_RANGE_STAGE3: [[[i8; 2]; PE_MAX_NB_SUBFR]; SILK_PE_MAX_COMPLEX + 1] = [
    [[-5, 8], [-1, 6], [-1, 6], [-4, 10]],
    [[-6, 10], [-2, 6], [-1, 6], [-5, 10]],
    [[-9, 12], [-3, 7], [-2, 7], [-7, 13]],
];

pub const SILK_NB_CBK_SEARCHS_STAGE3: [usize; SILK_PE_MAX_COMPLEX + 1] = [
    PE_NB_CBKS_STAGE3_MIN,
    PE_NB_CBKS_STAGE3_MID,
    PE_NB_CBKS_STAGE3_MAX,
];

pub const SILK_PITCH_LAG_ICDF: [u8; 32] = [
    253, 250, 244, 233, 212, 182, 150, 131, 120, 110, 98, 85, 72, 60, 49, 40, 32, 25, 19, 15, 13,
    11, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
];

pub const SILK_PITCH_DELTA_ICDF: [u8; 21] = [
    210, 208, 206, 203, 199, 193, 183, 168, 142, 104, 74, 52, 37, 27, 20, 14, 10, 6, 4, 2, 0,
];

pub const SILK_PITCH_CONTOUR_ICDF: [u8; 34] = [
    223, 201, 183, 167, 152, 138, 124, 111, 98, 88, 79, 70, 62, 56, 50, 44, 39, 35, 31, 27, 24, 21,
    18, 16, 14, 12, 10, 8, 6, 4, 3, 2, 1, 0,
];

pub const SILK_PITCH_CONTOUR_NB_ICDF: [u8; 11] = [188, 176, 155, 138, 119, 97, 67, 43, 26, 10, 0];

pub const SILK_PITCH_CONTOUR_10_MS_ICDF: [u8; 12] = [165, 119, 80, 61, 47, 35, 27, 20, 14, 9, 4, 0];

pub const SILK_PITCH_CONTOUR_10_MS_NB_ICDF: [u8; 3] = [113, 63, 0];

pub const SILK_LTP_PER_INDEX_ICDF: [u8; 3] = [179, 99, 0];

pub const SILK_LTP_GAIN_ICDF_0: [u8; 8] = [71, 56, 43, 30, 21, 12, 6, 0];
pub const SILK_LTP_GAIN_ICDF_1: [u8; 16] = [
    199, 165, 144, 124, 109, 96, 84, 71, 61, 51, 42, 32, 23, 15, 8, 0,
];
pub const SILK_LTP_GAIN_ICDF_2: [u8; 32] = [
    241, 225, 211, 199, 187, 175, 164, 153, 142, 132, 123, 114, 105, 96, 88, 80, 72, 64, 57, 50, 44,
    38, 33, 29, 24, 20, 16, 12, 9, 5, 2, 0,
];

pub const SILK_LTP_GAIN_ICDF_PTRS: [&[u8]; 3] = [
    &SILK_LTP_GAIN_ICDF_0,
    &SILK_LTP_GAIN_ICDF_1,
    &SILK_LTP_GAIN_ICDF_2,
];

pub const SILK_LTP_GAIN_BITS_Q5_0: [u8; 8] = [15, 131, 138, 138, 155, 155, 173, 173];
pub const SILK_LTP_GAIN_BITS_Q5_1: [u8; 16] = [
    69, 93, 115, 118, 131, 138, 141, 138, 150, 150, 155, 150, 155, 160, 166, 160,
];
pub const SILK_LTP_GAIN_BITS_Q5_2: [u8; 32] = [
    131, 128, 134, 141, 141, 141, 145, 145, 145, 150, 155, 155, 155, 155, 160, 160, 160, 160, 166,
    166, 173, 173, 182, 192, 182, 192, 192, 192, 205, 192, 205, 224,
];

pub const SILK_LTP_GAIN_BITS_Q5_PTRS: [&[u8]; 3] = [
    &SILK_LTP_GAIN_BITS_Q5_0,
    &SILK_LTP_GAIN_BITS_Q5_1,
    &SILK_LTP_GAIN_BITS_Q5_2,
];

pub const SILK_LTP_VQ_0_Q7: [[i8; LTP_ORDER]; 8] = [
    [4, 6, 24, 7, 5],
    [0, 0, 2, 0, 0],
    [12, 28, 41, 13, -4],
    [-9, 15, 42, 25, 14],
    [1, -2, 62, 41, -9],
    [-10, 37, 65, -4, 3],
    [-6, 4, 66, 7, -8],
    [16, 14, 38, -3, 33],
];

pub const SILK_LTP_VQ_1_Q7: [[i8; LTP_ORDER]; 16] = [
    [13, 22, 39, 23, 12],
    [-1, 36, 64, 27, -6],
    [-7, 10, 55, 43, 17],
    [1, 1, 8, 1, 1],
    [6, -11, 74, 53, -9],
    [-12, 55, 76, -12, 8],
    [-3, 3, 93, 27, -4],
    [26, 39, 59, 3, -8],
    [2, 0, 77, 11, 9],
    [-8, 22, 44, -6, 7],
    [40, 9, 26, 3, 9],
    [-7, 20, 101, -7, 4],
    [3, -8, 42, 26, 0],
    [-15, 33, 68, 2, 23],
    [-2, 55, 46, -2, 15],
    [3, -1, 21, 16, 41],
];

pub const SILK_LTP_VQ_2_Q7: [[i8; LTP_ORDER]; 32] = [
    [-6, 27, 61, 39, 5],
    [-11, 42, 88, 4, 1],
    [-2, 60, 65, 6, -4],
    [-1, -5, 73, 56, 1],
    [-9, 19, 94, 29, -9],
    [0, 12, 99, 6, 4],
    [8, -19, 102, 46, -13],
    [3, 2, 13, 3, 2],
    [9, -21, 84, 72, -18],
    [-11, 46, 104, -22, 8],
    [18, 38, 48, 23, 0],
    [-16, 70, 83, -21, 11],
    [5, -11, 117, 22, -8],
    [-6, 23, 117, -12, 3],
    [3, -8, 95, 28, 4],
    [-10, 15, 77, 60, -15],
    [-1, 4, 124, 2, -4],
    [3, 38, 84, 24, -25],
    [2, 13, 42, 13, 31],
    [21, -4, 56, 46, -1],
    [-1, 35, 79, -13, 19],
    [-7, 65, 88, -9, -14],
    [20, 4, 81, 49, -29],
    [20, 0, 75, 3, -17],
    [5, -9, 44, 92, -8],
    [1, -3, 22, 69, 31],
    [-6, 95, 41, -12, 5],
    [39, 67, 16, -4, 1],
    [0, -6, 120, 55, -36],
    [-13, 44, 122, 4, -24],
    [81, 5, 11, 3, 7],
    [2, 0, 9, 10, 88],
];

pub const SILK_LTP_VQ_PTRS_Q7: [&[[i8; LTP_ORDER]]; 3] = [
    &SILK_LTP_VQ_0_Q7,
    &SILK_LTP_VQ_1_Q7,
    &SILK_LTP_VQ_2_Q7,
];

pub const SILK_LTP_GAIN_VQ_0_GAIN: [u8; 8] = [46, 2, 90, 87, 93, 91, 82, 98];
pub const SILK_LTP_GAIN_VQ_1_GAIN: [u8; 16] = [
    109, 120, 118, 12, 113, 115, 117, 119, 99, 59, 87, 111, 63, 111, 112, 80,
];
pub const SILK_LTP_GAIN_VQ_2_GAIN: [u8; 32] = [
    126, 124, 125, 124, 129, 121, 126, 23, 132, 127, 127, 127, 126, 127, 122, 133, 130, 134, 101,
    118, 119, 145, 126, 86, 124, 120, 123, 119, 170, 173, 107, 109,
];

pub const SILK_LTP_VQ_GAIN_PTRS_Q7: [&[u8]; 3] = [
    &SILK_LTP_GAIN_VQ_0_GAIN,
    &SILK_LTP_GAIN_VQ_1_GAIN,
    &SILK_LTP_GAIN_VQ_2_GAIN,
];

pub const SILK_LTP_VQ_SIZES: [i32; 3] = [8, 16, 32];

pub const SILK_QUANT_OFFSETS_Q10: [[i16; 2]; 2] = [
    [100, 240],
    [32, 100],
];

pub const SILK_LTP_SCALES_TABLE_Q14: [i16; 3] = [15565, 12288, 8192];

pub const SILK_QUANTIZATION_OFFSETS_Q10: [[i16; 2]; 2] = [
    [100, 240],
    [32, 100],
];

pub const SILK_STEREO_PRED_QUANT_Q13: [i16; 16] = [
    -13732, -10050, -8266, -7526, -6500, -5000, -2950, -820, 820, 2950, 5000, 6500, 7526, 8266,
    10050, 13732,
];

pub const SILK_STEREO_PRED_JOINT_ICDF: [u8; 25] = [
    249, 247, 246, 245, 244, 234, 210, 202, 201, 200, 197, 174, 82, 59, 56, 55, 54, 46, 22, 12, 11,
    10, 9, 7, 0,
];

pub const SILK_STEREO_ONLY_CODE_MID_ICDF: [u8; 2] = [64, 0];

pub const SILK_LBRR_FLAGS_2_ICDF: [u8; 3] = [203, 150, 0];
pub const SILK_LBRR_FLAGS_3_ICDF: [u8; 7] = [215, 195, 166, 125, 110, 82, 0];

pub const SILK_LSB_ICDF: [u8; 2] = [120, 0];

pub const SILK_LTPSCALE_ICDF: [u8; 3] = [128, 64, 0];

pub const SILK_TYPE_OFFSET_VAD_ICDF: [u8; 4] = [232, 158, 10, 0];
pub const SILK_TYPE_OFFSET_NO_VAD_ICDF: [u8; 2] = [230, 0];

pub const SILK_NLSF_INTERPOLATION_FACTOR_ICDF: [u8; 5] = [243, 221, 192, 181, 0];

pub const SILK_UNIFORM3_ICDF: [u8; 3] = [171, 85, 0];
pub const SILK_UNIFORM4_ICDF: [u8; 4] = [192, 128, 64, 0];
pub const SILK_UNIFORM5_ICDF: [u8; 5] = [205, 154, 102, 51, 0];
pub const SILK_UNIFORM6_ICDF: [u8; 6] = [213, 171, 128, 85, 43, 0];
pub const SILK_UNIFORM8_ICDF: [u8; 8] = [224, 192, 160, 128, 96, 64, 32, 0];

pub const SILK_NLSF_EXT_ICDF: [u8; 7] = [100, 40, 16, 7, 3, 1, 0];

pub const SILK_GAIN_ICDF: [[u8; 8]; 3] = [
    [224, 112, 44, 15, 3, 2, 1, 0],
    [254, 237, 192, 132, 70, 23, 4, 0],
    [255, 252, 226, 155, 61, 11, 2, 0],
];

pub const SILK_DELTA_GAIN_ICDF: [u8; 41] = [
    250, 245, 234, 203, 71, 50, 42, 38, 35, 33, 31, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18,
    17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
];

pub const SILK_MAX_PULSES_TABLE: [u8; 4] = [8, 10, 12, 16];

pub const SILK_PULSES_PER_BLOCK_ICDF: [[u8; 18]; 10] = [
    [125, 51, 26, 18, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
    [198, 105, 45, 22, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
    [213, 162, 116, 83, 59, 43, 32, 24, 18, 15, 12, 9, 7, 6, 5, 3, 2, 0],
    [239, 187, 116, 59, 28, 16, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
    [250, 229, 188, 135, 86, 51, 30, 19, 13, 10, 8, 6, 5, 4, 3, 2, 1, 0],
    [249, 235, 213, 185, 156, 128, 103, 83, 66, 53, 42, 33, 26, 21, 17, 13, 10, 0],
    [254, 249, 235, 206, 164, 118, 77, 46, 27, 16, 10, 7, 5, 4, 3, 2, 1, 0],
    [255, 253, 249, 239, 220, 191, 156, 119, 85, 57, 37, 23, 15, 10, 6, 4, 2, 0],
    [255, 253, 251, 246, 237, 223, 203, 179, 152, 124, 98, 75, 55, 40, 29, 21, 15, 0],
    [255, 254, 253, 247, 220, 162, 106, 67, 42, 28, 18, 12, 9, 6, 4, 3, 2, 0],
];

pub const SILK_SHELL_CODE_TABLE0: [u8; 152] = [
    128, 0, 214, 42, 0, 235, 128, 21, 0, 244, 184, 72, 11, 0, 248, 214, 128, 42, 7, 0, 248, 225,
    170, 80, 25, 5, 0, 251, 236, 198, 126, 54, 18, 3, 0, 250, 238, 211, 159, 82, 35, 15, 5, 0, 250,
    231, 203, 168, 128, 88, 53, 25, 6, 0, 252, 238, 216, 185, 148, 108, 71, 40, 18, 4, 0, 253, 243,
    225, 199, 166, 128, 90, 57, 31, 13, 3, 0, 254, 246, 233, 212, 183, 147, 109, 73, 44, 23, 10, 2,
    0, 255, 250, 240, 223, 198, 166, 128, 90, 58, 33, 16, 6, 1, 0, 255, 251, 244, 231, 210, 181,
    146, 110, 75, 46, 25, 12, 5, 1, 0, 255, 253, 248, 238, 221, 196, 164, 128, 92, 60, 35, 18, 8, 3,
    1, 0, 255, 253, 249, 242, 229, 208, 180, 146, 110, 76, 48, 27, 14, 7, 3, 1, 0,
];

pub const SILK_SHELL_CODE_TABLE1: [u8; 152] = [
    129, 0, 207, 50, 0, 236, 129, 20, 0, 245, 185, 72, 10, 0, 249, 213, 129, 42, 6, 0, 250, 226,
    169, 87, 27, 4, 0, 251, 233, 194, 130, 62, 20, 4, 0, 250, 236, 207, 160, 99, 47, 17, 3, 0, 255,
    240, 217, 182, 131, 81, 41, 11, 1, 0, 255, 254, 233, 201, 159, 107, 61, 20, 2, 1, 0, 255, 249,
    233, 206, 170, 128, 86, 50, 23, 7, 1, 0, 255, 250, 238, 217, 186, 148, 108, 70, 39, 18, 6, 1, 0,
    255, 252, 243, 226, 200, 166, 128, 90, 56, 30, 13, 4, 1, 0, 255, 252, 245, 231, 209, 180, 146,
    110, 76, 47, 25, 11, 4, 1, 0, 255, 253, 248, 237, 219, 194, 163, 128, 93, 62, 37, 19, 8, 3, 1, 0,
    255, 254, 250, 241, 226, 205, 177, 145, 111, 79, 51, 30, 15, 6, 2, 1, 0,
];

pub const SILK_SHELL_CODE_TABLE2: [u8; 152] = [
    129, 0, 203, 54, 0, 234, 129, 23, 0, 245, 184, 73, 10, 0, 250, 215, 129, 41, 5, 0, 252, 232,
    173, 86, 24, 3, 0, 253, 240, 200, 129, 56, 15, 2, 0, 253, 244, 217, 164, 94, 38, 10, 1, 0, 253,
    245, 226, 189, 132, 71, 27, 7, 1, 0, 253, 246, 231, 203, 159, 105, 56, 23, 6, 1, 0, 255, 248,
    235, 213, 179, 133, 85, 47, 19, 5, 1, 0, 255, 254, 243, 221, 194, 159, 117, 70, 37, 12, 2, 1, 0,
    255, 254, 248, 234, 208, 171, 128, 85, 48, 22, 8, 2, 1, 0, 255, 254, 250, 240, 220, 189, 149,
    107, 67, 36, 16, 6, 2, 1, 0, 255, 254, 251, 243, 227, 201, 166, 128, 90, 55, 29, 13, 5, 2, 1, 0,
    255, 254, 252, 246, 234, 213, 183, 147, 109, 73, 43, 22, 10, 4, 2, 1, 0,
];

pub const SILK_SHELL_CODE_TABLE3: [u8; 152] = [
    130, 0, 200, 58, 0, 231, 130, 26, 0, 244, 184, 76, 12, 0, 249, 214, 130, 43, 6, 0, 252, 232,
    173, 87, 24, 3, 0, 253, 241, 203, 131, 56, 14, 2, 0, 254, 246, 221, 167, 94, 35, 8, 1, 0, 254,
    249, 232, 193, 130, 65, 23, 5, 1, 0, 255, 251, 239, 211, 162, 99, 45, 15, 4, 1, 0, 255, 251,
    243, 223, 186, 131, 74, 33, 11, 3, 1, 0, 255, 252, 245, 230, 202, 158, 105, 57, 24, 8, 2, 1, 0,
    255, 253, 247, 235, 214, 179, 132, 84, 44, 19, 7, 2, 1, 0, 255, 254, 250, 240, 223, 196, 159,
    112, 69, 36, 15, 6, 2, 1, 0, 255, 254, 253, 245, 231, 209, 176, 136, 93, 55, 27, 11, 3, 2, 1, 0,
    255, 254, 253, 252, 239, 221, 194, 158, 117, 76, 42, 18, 4, 3, 2, 1, 0,
];

pub const SILK_SHELL_CODE_TABLE_OFFSETS: [u8; 17] =
    [0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 77, 90, 104, 119, 135];

pub const SILK_SIGN_ICDF: [u8; 42] = [
    254, 49, 67, 77, 82, 93, 99, 198, 11, 18, 24, 31, 36, 45, 255, 46, 66, 78, 87, 94, 104, 208, 14,
    21, 32, 42, 51, 66, 255, 94, 104, 109, 112, 115, 118, 248, 53, 69, 80, 88, 95, 102,
];

pub const SILK_PULSES_PER_BLOCK_BITS_Q5: [[u8; 18]; 9] = [
    [31, 57, 107, 160, 205, 205, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
    [69, 47, 67, 111, 166, 205, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
    [82, 74, 79, 95, 109, 128, 145, 160, 173, 205, 205, 205, 224, 255, 255, 224, 255, 224],
    [125, 74, 59, 69, 97, 141, 182, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
    [173, 115, 85, 73, 76, 92, 115, 145, 173, 205, 224, 224, 255, 255, 255, 255, 255, 255],
    [166, 134, 113, 102, 101, 102, 107, 118, 125, 138, 145, 155, 166, 182, 192, 192, 205, 150],
    [224, 182, 134, 101, 83, 79, 85, 97, 120, 145, 173, 205, 224, 255, 255, 255, 255, 255],
    [255, 224, 192, 150, 120, 101, 92, 89, 93, 102, 118, 134, 160, 182, 192, 224, 224, 224],
    [255, 224, 224, 182, 155, 134, 118, 109, 104, 102, 106, 111, 118, 131, 145, 160, 173, 131],
];

pub const SILK_RATE_LEVELS_ICDF: [[u8; 9]; 2] = [
    [241, 190, 178, 132, 87, 74, 41, 14, 0],
    [223, 193, 157, 140, 106, 57, 39, 18, 0],
];

pub const SILK_RATE_LEVELS_BITS_Q5: [[u8; 9]; 2] = [
    [131, 74, 141, 79, 80, 138, 95, 104, 134],
    [95, 99, 91, 125, 93, 76, 123, 115, 123],
];

pub const SILK_TRANSITION_LP_B_Q28: [[i32; TRANSITION_NB]; TRANSITION_INT_NUM] = [
    [250767114, 501534038, 250767114],
    [209867381, 419732057, 209867381],
    [170987846, 341967853, 170987846],
    [131531482, 263046905, 131531482],
    [89306658, 178584282, 89306658],
];

pub const SILK_TRANSITION_LP_A_Q28: [[i32; TRANSITION_NA]; TRANSITION_INT_NUM] = [
    [506393414, 239854379],
    [411067935, 169683996],
    [306733530, 116694253],
    [185807084, 77959395],
    [35497197, 57401098],
];