unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
use crate::externs::memcpy;
use crate::silk::interpolate::silk_interpolate;
use crate::silk::structs::silk_encoder_state;
use crate::silk::NLSF_VQ_weights_laroia::silk_NLSF_VQ_weights_laroia;
use crate::silk::NLSF_encode::silk_NLSF_encode;
use crate::silk::NLSF2A::silk_NLSF2A;

pub unsafe fn silk_process_NLSFs(
    psEncC: *mut silk_encoder_state,
    PredCoef_Q12: *mut [i16; 16],
    pNLSF_Q15: *mut i16,
    prev_NLSFq_Q15: *const i16,
) {
    let mut i: i32 = 0;
    let mut doInterpolate: i32 = 0;
    let mut NLSF_mu_Q20: i32 = 0;
    let mut i_sqr_Q15: i16 = 0;
    let mut pNLSF0_temp_Q15: [i16; 16] = [0; 16];
    let mut pNLSFW_QW: [i16; 16] = [0; 16];
    let mut pNLSFW0_temp_QW: [i16; 16] = [0; 16];
    assert!(
        (*psEncC).useInterpolatedNLSFs == 1
            || (*psEncC).indices.NLSFInterpCoef_Q2 as i32 == (1) << 2
    );
    NLSF_mu_Q20 = ((0.003f64 * ((1) << 20) as f64 + 0.5f64) as i32 as i64
        + ((-0.001f64 * ((1) << 28) as f64 + 0.5f64) as i32 as i64
            * (*psEncC).speech_activity_Q8 as i16 as i64
            >> 16)) as i32;
    if (*psEncC).nb_subfr == 2 {
        NLSF_mu_Q20 = NLSF_mu_Q20 + (NLSF_mu_Q20 >> 1);
    }
    assert!(NLSF_mu_Q20 > 0);
    silk_NLSF_VQ_weights_laroia(
        &mut pNLSFW_QW[..(*psEncC).predictLPCOrder as usize],
        std::slice::from_raw_parts(pNLSF_Q15, (*psEncC).predictLPCOrder as usize),
    );
    doInterpolate = ((*psEncC).useInterpolatedNLSFs == 1
        && ((*psEncC).indices.NLSFInterpCoef_Q2 as i32) < 4) as i32;
    if doInterpolate != 0 {
        silk_interpolate(
            &mut pNLSF0_temp_Q15[..(*psEncC).predictLPCOrder as usize],
            std::slice::from_raw_parts(prev_NLSFq_Q15, (*psEncC).predictLPCOrder as usize),
            std::slice::from_raw_parts(pNLSF_Q15, (*psEncC).predictLPCOrder as usize),
            (*psEncC).indices.NLSFInterpCoef_Q2 as i32,
        );
        silk_NLSF_VQ_weights_laroia(
            &mut pNLSFW0_temp_QW[..(*psEncC).predictLPCOrder as usize],
            &pNLSF0_temp_Q15[..(*psEncC).predictLPCOrder as usize],
        );
        i_sqr_Q15 = ((((*psEncC).indices.NLSFInterpCoef_Q2 as i16 as i32
            * (*psEncC).indices.NLSFInterpCoef_Q2 as i16 as i32) as u32)
            << 11) as i32 as i16;
        i = 0;
        while i < (*psEncC).predictLPCOrder {
            pNLSFW_QW[i as usize] = ((pNLSFW_QW[i as usize] as i32 >> 1)
                + (pNLSFW0_temp_QW[i as usize] as i32 * i_sqr_Q15 as i32 >> 16))
                as i16;
            i += 1;
        }
    }
    silk_NLSF_encode(
        ((*psEncC).indices.NLSFIndices).as_mut_ptr(),
        pNLSF_Q15,
        (*psEncC).psNLSF_CB,
        pNLSFW_QW.as_mut_ptr(),
        NLSF_mu_Q20,
        (*psEncC).NLSF_MSVQ_Survivors,
        (*psEncC).indices.signalType as i32,
    );
    silk_NLSF2A(
        (*PredCoef_Q12.offset(1 as isize)).as_mut_ptr(),
        pNLSF_Q15 as *const i16,
        (*psEncC).predictLPCOrder,
        (*psEncC).arch,
    );
    if doInterpolate != 0 {
        silk_interpolate(
            &mut pNLSF0_temp_Q15[..(*psEncC).predictLPCOrder as usize],
            std::slice::from_raw_parts(prev_NLSFq_Q15, (*psEncC).predictLPCOrder as usize),
            std::slice::from_raw_parts(pNLSF_Q15 as *const i16, (*psEncC).predictLPCOrder as usize),
            (*psEncC).indices.NLSFInterpCoef_Q2 as i32,
        );
        silk_NLSF2A(
            (*PredCoef_Q12.offset(0 as isize)).as_mut_ptr(),
            pNLSF0_temp_Q15.as_mut_ptr(),
            (*psEncC).predictLPCOrder,
            (*psEncC).arch,
        );
    } else {
        assert!((*psEncC).predictLPCOrder <= 16);
        memcpy(
            (*PredCoef_Q12.offset(0 as isize)).as_mut_ptr() as *mut core::ffi::c_void,
            (*PredCoef_Q12.offset(1 as isize)).as_mut_ptr() as *const core::ffi::c_void,
            ((*psEncC).predictLPCOrder as u64).wrapping_mul(::core::mem::size_of::<i16>() as u64),
        );
    };
}