unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
use crate::externs::memset;
use crate::silk::define::{MAX_LPC_ORDER, MAX_NB_SUBFR, MIN_LPC_ORDER, TYPE_NO_VOICE_ACTIVITY};
use crate::silk::resampler::silk_resampler_init;
use crate::silk::structs::silk_decoder_state;
use crate::silk::tables_NLSF_CB_NB_MB::silk_NLSF_CB_NB_MB;
use crate::silk::tables_NLSF_CB_WB::silk_NLSF_CB_WB;
use crate::silk::tables_other::{silk_uniform4_iCDF, silk_uniform6_iCDF, silk_uniform8_iCDF};
use crate::silk::tables_pitch_lag::{
    silk_pitch_contour_10_ms_NB_iCDF, silk_pitch_contour_10_ms_iCDF, silk_pitch_contour_NB_iCDF,
    silk_pitch_contour_iCDF,
};

pub unsafe fn silk_decoder_set_fs(
    psDec: *mut silk_decoder_state,
    fs_kHz: i32,
    fs_API_Hz: i32,
) -> i32 {
    let mut frame_length: i32 = 0;
    assert!(fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16);
    assert!((*psDec).nb_subfr == 4 || (*psDec).nb_subfr == 4 / 2);
    (*psDec).subfr_length = 5 * fs_kHz as i16 as i32;
    frame_length = (*psDec).nb_subfr as i16 as i32 * (*psDec).subfr_length as i16 as i32;
    if (*psDec).fs_kHz != fs_kHz || (*psDec).fs_API_hz != fs_API_Hz {
        (*psDec).resampler_state = silk_resampler_init(fs_kHz as i16 as i32 * 1000, fs_API_Hz, 0);
        (*psDec).fs_API_hz = fs_API_Hz;
    }
    if (*psDec).fs_kHz != fs_kHz || frame_length != (*psDec).frame_length {
        if fs_kHz == 8 {
            if (*psDec).nb_subfr == MAX_NB_SUBFR {
                (*psDec).pitch_contour_iCDF = &silk_pitch_contour_NB_iCDF;
            } else {
                (*psDec).pitch_contour_iCDF = &silk_pitch_contour_10_ms_NB_iCDF;
            }
        } else if (*psDec).nb_subfr == MAX_NB_SUBFR {
            (*psDec).pitch_contour_iCDF = &silk_pitch_contour_iCDF;
        } else {
            (*psDec).pitch_contour_iCDF = &silk_pitch_contour_10_ms_iCDF;
        }
        if (*psDec).fs_kHz != fs_kHz {
            (*psDec).ltp_mem_length = 20 * fs_kHz as i16 as i32;
            if fs_kHz == 8 || fs_kHz == 12 {
                (*psDec).LPC_order = MIN_LPC_ORDER;
                (*psDec).psNLSF_CB = &silk_NLSF_CB_NB_MB;
            } else {
                (*psDec).LPC_order = MAX_LPC_ORDER;
                (*psDec).psNLSF_CB = &silk_NLSF_CB_WB;
            }
            if fs_kHz == 16 {
                (*psDec).pitch_lag_low_bits_iCDF = &silk_uniform8_iCDF;
            } else if fs_kHz == 12 {
                (*psDec).pitch_lag_low_bits_iCDF = &silk_uniform6_iCDF;
            } else if fs_kHz == 8 {
                (*psDec).pitch_lag_low_bits_iCDF = &silk_uniform4_iCDF;
            } else {
                panic!("libopus: assert(0) called");
            }
            (*psDec).first_frame_after_reset = 1;
            (*psDec).lagPrev = 100;
            (*psDec).LastGainIndex = 10;
            (*psDec).prevSignalType = TYPE_NO_VOICE_ACTIVITY;
            memset(
                ((*psDec).outBuf).as_mut_ptr() as *mut core::ffi::c_void,
                0,
                ::core::mem::size_of::<[i16; 480]>() as u64,
            );
            memset(
                ((*psDec).sLPC_Q14_buf).as_mut_ptr() as *mut core::ffi::c_void,
                0,
                ::core::mem::size_of::<[i32; 16]>() as u64,
            );
        }
        (*psDec).fs_kHz = fs_kHz;
        (*psDec).frame_length = frame_length;
    }
    assert!((*psDec).frame_length > 0 && (*psDec).frame_length <= 5 * 4 * 16);

    return 0;
}