unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
pub mod SigProc_FLP_h {
    #[inline]
    pub unsafe fn silk_sigmoid(x: f32) -> f32 {
        return (1.0f64 / (1.0f64 + (-x as f64).exp())) as f32;
    }
}
pub mod tuning_parameters_h {
    pub const LAMBDA_OFFSET: f32 = 1.2f32;
    pub const LAMBDA_SPEECH_ACT: f32 = -0.2f32;
    pub const LAMBDA_DELAYED_DECISIONS: f32 = -0.05f32;
    pub const LAMBDA_INPUT_QUALITY: f32 = -0.1f32;
    pub const LAMBDA_CODING_QUALITY: f32 = -0.2f32;
    pub const LAMBDA_QUANT_OFFSET: f32 = 0.8f32;
}

pub use self::tuning_parameters_h::{
    LAMBDA_CODING_QUALITY, LAMBDA_DELAYED_DECISIONS, LAMBDA_INPUT_QUALITY, LAMBDA_OFFSET,
    LAMBDA_QUANT_OFFSET, LAMBDA_SPEECH_ACT,
};
pub use self::SigProc_FLP_h::silk_sigmoid;
use crate::celt::mathops::celt_sqrt;
use crate::externs::memcpy;
use crate::silk::define::{CODE_CONDITIONALLY, TYPE_VOICED};
use crate::silk::float::structs_FLP::{
    silk_encoder_control_FLP, silk_encoder_state_FLP, silk_shape_state_FLP,
};
use crate::silk::gain_quant::silk_gains_quant;
use crate::silk::mathops::silk_exp2;
use crate::silk::tables_other::silk_Quantization_Offsets_Q10;

pub unsafe fn silk_process_gains_FLP(
    psEnc: *mut silk_encoder_state_FLP,
    psEncCtrl: *mut silk_encoder_control_FLP,
    condCoding: i32,
) {
    let psShapeSt: *mut silk_shape_state_FLP = &mut (*psEnc).sShape;
    let mut k: i32 = 0;
    let mut pGains_Q16: [i32; 4] = [0; 4];
    let mut s: f32 = 0.;
    let mut InvMaxSqrVal: f32 = 0.;
    let mut gain: f32 = 0.;
    let mut quant_offset: f32 = 0.;
    if (*psEnc).sCmn.indices.signalType as i32 == TYPE_VOICED {
        s = 1.0f32 - 0.5f32 * silk_sigmoid(0.25f32 * ((*psEncCtrl).LTPredCodGain - 12.0f32));
        k = 0;
        while k < (*psEnc).sCmn.nb_subfr {
            (*psEncCtrl).Gains[k as usize] *= s;
            k += 1;
        }
    }
    InvMaxSqrVal = silk_exp2(0.33f32 * (21.0f32 - (*psEnc).sCmn.SNR_dB_Q7 as f32 * (1.0 / 128.0)))
        / (*psEnc).sCmn.subfr_length as f32;
    k = 0;
    while k < (*psEnc).sCmn.nb_subfr {
        gain = (*psEncCtrl).Gains[k as usize];
        gain = celt_sqrt(gain * gain + (*psEncCtrl).ResNrg[k as usize] * InvMaxSqrVal);
        (*psEncCtrl).Gains[k as usize] = if gain < 32767.0f32 { gain } else { 32767.0f32 };
        k += 1;
    }
    k = 0;
    while k < (*psEnc).sCmn.nb_subfr {
        pGains_Q16[k as usize] = ((*psEncCtrl).Gains[k as usize] * 65536.0f32) as i32;
        k += 1;
    }
    memcpy(
        ((*psEncCtrl).GainsUnq_Q16).as_mut_ptr() as *mut core::ffi::c_void,
        pGains_Q16.as_mut_ptr() as *const core::ffi::c_void,
        ((*psEnc).sCmn.nb_subfr as u64).wrapping_mul(::core::mem::size_of::<i32>() as u64),
    );
    (*psEncCtrl).lastGainIndexPrev = (*psShapeSt).LastGainIndex;
    silk_gains_quant(
        ((*psEnc).sCmn.indices.GainsIndices).as_mut_ptr(),
        pGains_Q16.as_mut_ptr(),
        &mut (*psShapeSt).LastGainIndex,
        (condCoding == CODE_CONDITIONALLY) as i32,
        (*psEnc).sCmn.nb_subfr,
    );
    k = 0;
    while k < (*psEnc).sCmn.nb_subfr {
        (*psEncCtrl).Gains[k as usize] = pGains_Q16[k as usize] as f32 / 65536.0f32;
        k += 1;
    }
    if (*psEnc).sCmn.indices.signalType as i32 == TYPE_VOICED {
        if (*psEncCtrl).LTPredCodGain + (*psEnc).sCmn.input_tilt_Q15 as f32 * (1.0f32 / 32768.0f32)
            > 1.0f32
        {
            (*psEnc).sCmn.indices.quantOffsetType = 0;
        } else {
            (*psEnc).sCmn.indices.quantOffsetType = 1;
        }
    }
    quant_offset = silk_Quantization_Offsets_Q10
        [((*psEnc).sCmn.indices.signalType as i32 >> 1) as usize]
        [(*psEnc).sCmn.indices.quantOffsetType as usize] as i32 as f32
        / 1024.0f32;
    (*psEncCtrl).Lambda = LAMBDA_OFFSET
        + LAMBDA_DELAYED_DECISIONS * (*psEnc).sCmn.nStatesDelayedDecision as f32
        + LAMBDA_SPEECH_ACT * (*psEnc).sCmn.speech_activity_Q8 as f32 * (1.0f32 / 256.0f32)
        + LAMBDA_INPUT_QUALITY * (*psEncCtrl).input_quality
        + LAMBDA_CODING_QUALITY * (*psEncCtrl).coding_quality
        + LAMBDA_QUANT_OFFSET * quant_offset;
}