unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
use crate::externs::memcpy;
use crate::silk::define::MAX_LPC_ORDER;
use crate::silk::lin2log::silk_lin2log;
use crate::silk::sort::silk_insertion_sort_increasing;
use crate::silk::structs::silk_NLSF_CB_struct;
use crate::silk::Inlines::silk_DIV32_varQ;
use crate::silk::NLSF_decode::silk_NLSF_decode;
use crate::silk::NLSF_del_dec_quant::silk_NLSF_del_dec_quant;
use crate::silk::NLSF_stabilize::silk_NLSF_stabilize;
use crate::silk::NLSF_unpack::silk_NLSF_unpack;
use crate::silk::NLSF_VQ::silk_NLSF_VQ;

pub unsafe fn silk_NLSF_encode(
    NLSFIndices: *mut i8,
    pNLSF_Q15: *mut i16,
    psNLSF_CB: &silk_NLSF_CB_struct,
    pW_Q2: *const i16,
    NLSF_mu_Q20: i32,
    nSurvivors: i32,
    signalType: i32,
) -> i32 {
    let mut i: i32 = 0;
    let mut s: i32 = 0;
    let mut ind1: i32 = 0;
    let mut bestIndex: i32 = 0;
    let mut prob_Q8: i32 = 0;
    let mut bits_q7: i32 = 0;
    let mut W_tmp_Q9: i32 = 0;
    let mut ret: i32 = 0;
    let mut res_Q10: [i16; 16] = [0; 16];
    let mut NLSF_tmp_Q15: [i16; 16] = [0; 16];
    let mut W_adj_Q5: [i16; 16] = [0; 16];
    let mut pred_Q8: [u8; 16] = [0; 16];
    let mut ec_ix: [i16; 16] = [0; 16];
    assert!((0..=2).contains(&signalType));
    silk_NLSF_stabilize(
        std::slice::from_raw_parts_mut(pNLSF_Q15, psNLSF_CB.order as usize),
        psNLSF_CB.deltaMin_Q15,
    );
    let vla = psNLSF_CB.nVectors as usize;
    let mut err_Q24: Vec<i32> = ::std::vec::from_elem(0, vla);
    silk_NLSF_VQ(
        &mut err_Q24,
        std::slice::from_raw_parts(pNLSF_Q15, psNLSF_CB.order as usize),
        psNLSF_CB.CB1_NLSF_Q8,
        psNLSF_CB.CB1_Wght_Q9,
        psNLSF_CB.nVectors as usize,
        psNLSF_CB.order as usize,
    );
    let vla_0 = nSurvivors as usize;
    let mut tempIndices1: Vec<i32> = ::std::vec::from_elem(0, vla_0);
    silk_insertion_sort_increasing(
        err_Q24.as_mut_ptr(),
        tempIndices1.as_mut_ptr(),
        psNLSF_CB.nVectors as i32,
        nSurvivors,
    );
    let vla_1 = nSurvivors as usize;
    let mut RD_Q25: Vec<i32> = ::std::vec::from_elem(0, vla_1);
    let vla_2 = (nSurvivors * 16) as usize;
    let mut tempIndices2: Vec<i8> = ::std::vec::from_elem(0, vla_2);
    s = 0;
    while s < nSurvivors {
        ind1 = *tempIndices1.as_mut_ptr().offset(s as isize);
        let pCB_element = &psNLSF_CB.CB1_NLSF_Q8[(ind1 * psNLSF_CB.order as i32) as usize..];
        let pCB_Wght_Q9 = &psNLSF_CB.CB1_Wght_Q9[(ind1 * psNLSF_CB.order as i32) as usize..];
        i = 0;
        while i < psNLSF_CB.order as i32 {
            NLSF_tmp_Q15[i as usize] = ((pCB_element[i as usize] as i16 as u16 as i32) << 7) as i16;
            W_tmp_Q9 = pCB_Wght_Q9[i as usize] as i32;
            res_Q10[i as usize] = ((*pNLSF_Q15.offset(i as isize) as i32
                - NLSF_tmp_Q15[i as usize] as i32) as i16 as i32
                * W_tmp_Q9 as i16 as i32
                >> 14) as i16;
            W_adj_Q5[i as usize] = silk_DIV32_varQ(
                *pW_Q2.offset(i as isize) as i32,
                W_tmp_Q9 as i16 as i32 * W_tmp_Q9 as i16 as i32,
                21,
            ) as i16;
            i += 1;
        }
        silk_NLSF_unpack(&mut ec_ix, &mut pred_Q8, psNLSF_CB, ind1);
        *RD_Q25.as_mut_ptr().offset(s as isize) = silk_NLSF_del_dec_quant(
            &mut *tempIndices2
                .as_mut_ptr()
                .offset((s * MAX_LPC_ORDER) as isize),
            res_Q10.as_mut_ptr() as *const i16,
            W_adj_Q5.as_mut_ptr() as *const i16,
            pred_Q8.as_mut_ptr() as *const u8,
            ec_ix.as_mut_ptr() as *const i16,
            psNLSF_CB.ec_Rates_Q5,
            psNLSF_CB.quantStepSize_Q16 as i32,
            psNLSF_CB.invQuantStepSize_Q6,
            NLSF_mu_Q20,
            psNLSF_CB.order,
        );
        let iCDF_ptr =
            &(psNLSF_CB.CB1_iCDF)[((signalType >> 1) * psNLSF_CB.nVectors as i32) as usize..];
        if ind1 == 0 {
            prob_Q8 = 256 - iCDF_ptr[ind1 as usize] as i32;
        } else {
            prob_Q8 = iCDF_ptr[(ind1 - 1) as usize] as i32 - iCDF_ptr[ind1 as usize] as i32;
        }
        bits_q7 = ((8) << 7) - silk_lin2log(prob_Q8);
        *RD_Q25.as_mut_ptr().offset(s as isize) = *RD_Q25.as_mut_ptr().offset(s as isize)
            + bits_q7 as i16 as i32 * (NLSF_mu_Q20 >> 2) as i16 as i32;
        s += 1;
    }
    silk_insertion_sort_increasing(RD_Q25.as_mut_ptr(), &mut bestIndex, nSurvivors, 1);
    *NLSFIndices.offset(0 as isize) = *tempIndices1.as_mut_ptr().offset(bestIndex as isize) as i8;
    memcpy(
        &mut *NLSFIndices.offset(1 as isize) as *mut i8 as *mut core::ffi::c_void,
        &mut *tempIndices2.as_mut_ptr().offset((bestIndex * 16) as isize) as *mut i8
            as *const core::ffi::c_void,
        (psNLSF_CB.order as u64).wrapping_mul(::core::mem::size_of::<i8>() as u64),
    );
    silk_NLSF_decode(
        std::slice::from_raw_parts_mut(pNLSF_Q15, psNLSF_CB.order as usize),
        std::slice::from_raw_parts(NLSFIndices, psNLSF_CB.order as usize + 1),
        psNLSF_CB,
    );
    ret = *RD_Q25.as_mut_ptr().offset(0 as isize);
    return ret;
}