unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
pub mod tuning_parameters_h {
    pub const FIND_PITCH_WHITE_NOISE_FRACTION: f32 = 1e-3f32;
    pub const FIND_PITCH_BANDWIDTH_EXPANSION: f32 = 0.99f32;
}
pub use self::tuning_parameters_h::{
    FIND_PITCH_BANDWIDTH_EXPANSION, FIND_PITCH_WHITE_NOISE_FRACTION,
};
use crate::externs::{memcpy, memset};
use crate::silk::define::{TYPE_NO_VOICE_ACTIVITY, TYPE_UNVOICED, TYPE_VOICED};
use crate::silk::float::apply_sine_window_FLP::silk_apply_sine_window_FLP;
use crate::silk::float::autocorrelation_FLP::silk_autocorrelation_FLP;
use crate::silk::float::bwexpander_FLP::silk_bwexpander_FLP;
use crate::silk::float::k2a_FLP::silk_k2a_FLP;
use crate::silk::float::pitch_analysis_core_FLP::silk_pitch_analysis_core_FLP;
use crate::silk::float::schur_FLP::silk_schur_FLP;
use crate::silk::float::structs_FLP::{silk_encoder_control_FLP, silk_encoder_state_FLP};
use crate::silk::float::LPC_analysis_filter_FLP::silk_LPC_analysis_filter_FLP;

pub unsafe fn silk_find_pitch_lags_FLP(
    psEnc: *mut silk_encoder_state_FLP,
    psEncCtrl: *mut silk_encoder_control_FLP,
    res: *mut f32,
    x: *const f32,
    arch: i32,
) {
    let mut buf_len: i32 = 0;
    let mut thrhld: f32 = 0.;
    let mut res_nrg: f32 = 0.;
    let mut x_buf_ptr: *const f32 = 0 as *const f32;
    let mut x_buf: *const f32 = 0 as *const f32;
    let mut auto_corr: [f32; 17] = [0.; 17];
    let mut A: [f32; 16] = [0.; 16];
    let mut refl_coef: [f32; 16] = [0.; 16];
    let mut Wsig: [f32; 384] = [0.; 384];
    let mut Wsig_ptr: *mut f32 = 0 as *mut f32;
    buf_len = (*psEnc).sCmn.la_pitch + (*psEnc).sCmn.frame_length + (*psEnc).sCmn.ltp_mem_length;
    assert!(buf_len >= (*psEnc).sCmn.pitch_LPC_win_length);
    x_buf = x.offset(-((*psEnc).sCmn.ltp_mem_length as isize));
    x_buf_ptr = x_buf
        .offset(buf_len as isize)
        .offset(-((*psEnc).sCmn.pitch_LPC_win_length as isize));
    Wsig_ptr = Wsig.as_mut_ptr();
    silk_apply_sine_window_FLP(Wsig_ptr, x_buf_ptr, 1, (*psEnc).sCmn.la_pitch);
    Wsig_ptr = Wsig_ptr.offset((*psEnc).sCmn.la_pitch as isize);
    x_buf_ptr = x_buf_ptr.offset((*psEnc).sCmn.la_pitch as isize);
    memcpy(
        Wsig_ptr as *mut core::ffi::c_void,
        x_buf_ptr as *const core::ffi::c_void,
        (((*psEnc).sCmn.pitch_LPC_win_length - ((*psEnc).sCmn.la_pitch << 1)) as u64)
            .wrapping_mul(::core::mem::size_of::<f32>() as u64),
    );
    Wsig_ptr = Wsig_ptr
        .offset(((*psEnc).sCmn.pitch_LPC_win_length - ((*psEnc).sCmn.la_pitch << 1)) as isize);
    x_buf_ptr = x_buf_ptr
        .offset(((*psEnc).sCmn.pitch_LPC_win_length - ((*psEnc).sCmn.la_pitch << 1)) as isize);
    silk_apply_sine_window_FLP(Wsig_ptr, x_buf_ptr, 2, (*psEnc).sCmn.la_pitch);
    silk_autocorrelation_FLP(
        auto_corr.as_mut_ptr(),
        Wsig.as_mut_ptr(),
        (*psEnc).sCmn.pitch_LPC_win_length,
        (*psEnc).sCmn.pitchEstimationLPCOrder + 1,
    );
    auto_corr[0 as usize] += auto_corr[0 as usize] * FIND_PITCH_WHITE_NOISE_FRACTION + 1 as f32;
    res_nrg = silk_schur_FLP(
        refl_coef.as_mut_ptr(),
        auto_corr.as_mut_ptr() as *const f32,
        (*psEnc).sCmn.pitchEstimationLPCOrder,
    );
    (*psEncCtrl).predGain =
        auto_corr[0 as usize] / (if res_nrg > 1.0f32 { res_nrg } else { 1.0f32 });
    silk_k2a_FLP(
        A.as_mut_ptr(),
        refl_coef.as_mut_ptr(),
        (*psEnc).sCmn.pitchEstimationLPCOrder,
    );
    silk_bwexpander_FLP(
        A.as_mut_ptr(),
        (*psEnc).sCmn.pitchEstimationLPCOrder,
        FIND_PITCH_BANDWIDTH_EXPANSION,
    );
    silk_LPC_analysis_filter_FLP(
        res,
        A.as_mut_ptr() as *const f32,
        x_buf,
        buf_len,
        (*psEnc).sCmn.pitchEstimationLPCOrder,
    );
    if (*psEnc).sCmn.indices.signalType as i32 != TYPE_NO_VOICE_ACTIVITY
        && (*psEnc).sCmn.first_frame_after_reset == 0
    {
        thrhld = 0.6f32;
        thrhld -= 0.004f32 * (*psEnc).sCmn.pitchEstimationLPCOrder as f32;
        thrhld -= 0.1f32 * (*psEnc).sCmn.speech_activity_Q8 as f32 * (1.0f32 / 256.0f32);
        thrhld -= 0.15f32 * ((*psEnc).sCmn.prevSignalType as i32 >> 1) as f32;
        thrhld -= 0.1f32 * (*psEnc).sCmn.input_tilt_Q15 as f32 * (1.0f32 / 32768.0f32);
        if silk_pitch_analysis_core_FLP(
            res as *const f32,
            ((*psEncCtrl).pitchL).as_mut_ptr(),
            &mut (*psEnc).sCmn.indices.lagIndex,
            &mut (*psEnc).sCmn.indices.contourIndex,
            &mut (*psEnc).LTPCorr,
            (*psEnc).sCmn.prevLag,
            (*psEnc).sCmn.pitchEstimationThreshold_Q16 as f32 / 65536.0f32,
            thrhld,
            (*psEnc).sCmn.fs_kHz,
            (*psEnc).sCmn.pitchEstimationComplexity,
            (*psEnc).sCmn.nb_subfr,
            arch,
        ) == 0
        {
            (*psEnc).sCmn.indices.signalType = TYPE_VOICED as i8;
        } else {
            (*psEnc).sCmn.indices.signalType = TYPE_UNVOICED as i8;
        }
    } else {
        memset(
            ((*psEncCtrl).pitchL).as_mut_ptr() as *mut core::ffi::c_void,
            0,
            ::core::mem::size_of::<[i32; 4]>() as u64,
        );
        (*psEnc).sCmn.indices.lagIndex = 0;
        (*psEnc).sCmn.indices.contourIndex = 0;
        (*psEnc).LTPCorr = 0 as f32;
    };
}