unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
pub mod float_h {
    pub const FLT_MAX: f32 = __FLT_MAX__;
    use super::internal::__FLT_MAX__;
}
pub mod typedef_h {
    pub const silk_float_MAX: f32 = FLT_MAX;
    use super::float_h::FLT_MAX;
}
pub mod internal {
    pub const __FLT_MAX__: f32 = 3.40282347e+38f32;
}
pub use self::float_h::FLT_MAX;
pub use self::internal::__FLT_MAX__;
pub use self::typedef_h::silk_float_MAX;
use crate::silk::define::MAX_NB_SUBFR;
use crate::silk::float::burg_modified_FLP::silk_burg_modified_FLP;
use crate::silk::float::energy_FLP::silk_energy_FLP;
use crate::silk::float::wrappers_FLP::{silk_A2NLSF_FLP, silk_NLSF2A_FLP};
use crate::silk::float::LPC_analysis_filter_FLP::silk_LPC_analysis_filter_FLP;
use crate::silk::interpolate::silk_interpolate;
use crate::silk::structs::silk_encoder_state;

pub unsafe fn silk_find_LPC_FLP(
    psEncC: *mut silk_encoder_state,
    NLSF_Q15: *mut i16,
    x: *const f32,
    minInvGain: f32,
) {
    let mut k: i32 = 0;
    let mut subfr_length: i32 = 0;
    let mut a: [f32; 16] = [0.; 16];
    let mut res_nrg: f32 = 0.;
    let mut res_nrg_2nd: f32 = 0.;
    let mut res_nrg_interp: f32 = 0.;
    let mut NLSF0_Q15: [i16; 16] = [0; 16];
    let mut a_tmp: [f32; 16] = [0.; 16];
    let mut LPC_res: [f32; 384] = [0.; 384];
    subfr_length = (*psEncC).subfr_length + (*psEncC).predictLPCOrder;
    (*psEncC).indices.NLSFInterpCoef_Q2 = 4;
    res_nrg = silk_burg_modified_FLP(
        a.as_mut_ptr(),
        x,
        minInvGain,
        subfr_length,
        (*psEncC).nb_subfr,
        (*psEncC).predictLPCOrder,
    );
    if (*psEncC).useInterpolatedNLSFs != 0
        && (*psEncC).first_frame_after_reset == 0
        && (*psEncC).nb_subfr == MAX_NB_SUBFR
    {
        res_nrg -= silk_burg_modified_FLP(
            a_tmp.as_mut_ptr(),
            x.offset((MAX_NB_SUBFR / 2 * subfr_length) as isize),
            minInvGain,
            subfr_length,
            MAX_NB_SUBFR / 2,
            (*psEncC).predictLPCOrder,
        );
        silk_A2NLSF_FLP(NLSF_Q15, a_tmp.as_mut_ptr(), (*psEncC).predictLPCOrder);
        res_nrg_2nd = silk_float_MAX;
        k = 3;
        while k >= 0 {
            silk_interpolate(
                &mut NLSF0_Q15[..(*psEncC).predictLPCOrder as usize],
                &(*psEncC).prev_NLSFq_Q15[..(*psEncC).predictLPCOrder as usize],
                std::slice::from_raw_parts(NLSF_Q15, (*psEncC).predictLPCOrder as usize),
                k,
            );
            silk_NLSF2A_FLP(
                a_tmp.as_mut_ptr(),
                NLSF0_Q15.as_mut_ptr(),
                (*psEncC).predictLPCOrder,
                (*psEncC).arch,
            );
            silk_LPC_analysis_filter_FLP(
                LPC_res.as_mut_ptr(),
                a_tmp.as_mut_ptr() as *const f32,
                x,
                2 * subfr_length,
                (*psEncC).predictLPCOrder,
            );
            res_nrg_interp = (silk_energy_FLP(
                LPC_res
                    .as_mut_ptr()
                    .offset((*psEncC).predictLPCOrder as isize),
                subfr_length - (*psEncC).predictLPCOrder,
            ) + silk_energy_FLP(
                LPC_res
                    .as_mut_ptr()
                    .offset((*psEncC).predictLPCOrder as isize)
                    .offset(subfr_length as isize),
                subfr_length - (*psEncC).predictLPCOrder,
            )) as f32;
            if res_nrg_interp < res_nrg {
                res_nrg = res_nrg_interp;
                (*psEncC).indices.NLSFInterpCoef_Q2 = k as i8;
            } else if res_nrg_interp > res_nrg_2nd {
                break;
            }
            res_nrg_2nd = res_nrg_interp;
            k -= 1;
        }
    }
    if (*psEncC).indices.NLSFInterpCoef_Q2 as i32 == 4 {
        silk_A2NLSF_FLP(NLSF_Q15, a.as_mut_ptr(), (*psEncC).predictLPCOrder);
    }
    assert!(
        (*psEncC).indices.NLSFInterpCoef_Q2 as i32 == 4
            || (*psEncC).useInterpolatedNLSFs != 0
                && (*psEncC).first_frame_after_reset == 0
                && (*psEncC).nb_subfr == 4
    );
}