unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
use crate::celt::entenc::{ec_enc, ec_enc_icdf};
use crate::silk::define::{
    CODE_CONDITIONALLY, CODE_INDEPENDENTLY, MAX_NB_SUBFR, NLSF_QUANT_MAX_AMPLITUDE, TYPE_VOICED,
};
use crate::silk::structs::{silk_encoder_state, SideInfoIndices};
use crate::silk::tables_LTP::{silk_LTP_gain_iCDF_ptrs, silk_LTP_per_index_iCDF};
use crate::silk::tables_gain::{silk_delta_gain_iCDF, silk_gain_iCDF};
use crate::silk::tables_other::{
    silk_LTPscale_iCDF, silk_NLSF_EXT_iCDF, silk_NLSF_interpolation_factor_iCDF,
    silk_type_offset_VAD_iCDF, silk_type_offset_no_VAD_iCDF, silk_uniform4_iCDF,
    silk_uniform8_iCDF,
};
use crate::silk::tables_pitch_lag::{silk_pitch_delta_iCDF, silk_pitch_lag_iCDF};
use crate::silk::NLSF_unpack::silk_NLSF_unpack;

pub unsafe fn silk_encode_indices(
    psEncC: *mut silk_encoder_state,
    psRangeEnc: &mut ec_enc,
    FrameIndex: i32,
    encode_LBRR: i32,
    condCoding: i32,
) {
    let mut i: i32 = 0;
    let mut k: i32 = 0;
    let mut typeOffset: i32 = 0;
    let mut encode_absolute_lagIndex: i32 = 0;
    let mut delta_lagIndex: i32 = 0;
    let mut ec_ix: [i16; 16] = [0; 16];
    let mut pred_Q8: [u8; 16] = [0; 16];
    let mut psIndices: *const SideInfoIndices = 0 as *const SideInfoIndices;
    if encode_LBRR != 0 {
        psIndices = &mut *((*psEncC).indices_LBRR)
            .as_mut_ptr()
            .offset(FrameIndex as isize) as *mut SideInfoIndices;
    } else {
        psIndices = &mut (*psEncC).indices;
    }
    typeOffset = 2 * (*psIndices).signalType as i32 + (*psIndices).quantOffsetType as i32;
    assert!(typeOffset >= 0 && typeOffset < 6);
    assert!(encode_LBRR == 0 || typeOffset >= 2);
    if encode_LBRR != 0 || typeOffset >= 2 {
        ec_enc_icdf(psRangeEnc, typeOffset - 2, &silk_type_offset_VAD_iCDF, 8);
    } else {
        ec_enc_icdf(psRangeEnc, typeOffset, &silk_type_offset_no_VAD_iCDF, 8);
    }
    if condCoding == CODE_CONDITIONALLY {
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).GainsIndices[0 as usize] as i32,
            &silk_delta_gain_iCDF,
            8,
        );
    } else {
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).GainsIndices[0 as usize] as i32 >> 3,
            &silk_gain_iCDF[(*psIndices).signalType as usize],
            8,
        );
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).GainsIndices[0 as usize] as i32 & 7,
            &silk_uniform8_iCDF,
            8,
        );
    }
    i = 1;
    while i < (*psEncC).nb_subfr {
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).GainsIndices[i as usize] as i32,
            &silk_delta_gain_iCDF,
            8,
        );
        i += 1;
    }
    ec_enc_icdf(
        psRangeEnc,
        (*psIndices).NLSFIndices[0 as usize] as i32,
        &(*(*psEncC).psNLSF_CB).CB1_iCDF[(((*psIndices).signalType as i32 >> 1)
            * (*(*psEncC).psNLSF_CB).nVectors as i32)
            as usize..],
        8,
    );
    silk_NLSF_unpack(
        &mut ec_ix,
        &mut pred_Q8,
        (*psEncC).psNLSF_CB,
        (*psIndices).NLSFIndices[0 as usize] as i32,
    );
    assert!((*(*psEncC).psNLSF_CB).order as i32 == (*psEncC).predictLPCOrder);
    i = 0;
    while i < (*(*psEncC).psNLSF_CB).order as i32 {
        if (*psIndices).NLSFIndices[(i + 1) as usize] as i32 >= NLSF_QUANT_MAX_AMPLITUDE {
            ec_enc_icdf(
                psRangeEnc,
                2 * NLSF_QUANT_MAX_AMPLITUDE,
                &(*(*psEncC).psNLSF_CB).ec_iCDF[*ec_ix.as_mut_ptr().offset(i as isize) as usize..],
                8,
            );
            ec_enc_icdf(
                psRangeEnc,
                (*psIndices).NLSFIndices[(i + 1) as usize] as i32 - NLSF_QUANT_MAX_AMPLITUDE,
                &silk_NLSF_EXT_iCDF,
                8,
            );
        } else if (*psIndices).NLSFIndices[(i + 1) as usize] as i32 <= -NLSF_QUANT_MAX_AMPLITUDE {
            ec_enc_icdf(
                psRangeEnc,
                0,
                &(*(*psEncC).psNLSF_CB).ec_iCDF[*ec_ix.as_mut_ptr().offset(i as isize) as usize..],
                8,
            );
            ec_enc_icdf(
                psRangeEnc,
                -((*psIndices).NLSFIndices[(i + 1) as usize] as i32) - NLSF_QUANT_MAX_AMPLITUDE,
                &silk_NLSF_EXT_iCDF,
                8,
            );
        } else {
            ec_enc_icdf(
                psRangeEnc,
                (*psIndices).NLSFIndices[(i + 1) as usize] as i32 + NLSF_QUANT_MAX_AMPLITUDE,
                &(*(*psEncC).psNLSF_CB).ec_iCDF[*ec_ix.as_mut_ptr().offset(i as isize) as usize..],
                8,
            );
        }
        i += 1;
    }
    if (*psEncC).nb_subfr == MAX_NB_SUBFR {
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).NLSFInterpCoef_Q2 as i32,
            &silk_NLSF_interpolation_factor_iCDF,
            8,
        );
    }
    if (*psIndices).signalType as i32 == TYPE_VOICED {
        encode_absolute_lagIndex = 1;
        if condCoding == CODE_CONDITIONALLY && (*psEncC).ec_prevSignalType == TYPE_VOICED {
            delta_lagIndex = (*psIndices).lagIndex as i32 - (*psEncC).ec_prevLagIndex as i32;
            if delta_lagIndex < -(8) || delta_lagIndex > 11 {
                delta_lagIndex = 0;
            } else {
                delta_lagIndex = delta_lagIndex + 9;
                encode_absolute_lagIndex = 0;
            }
            ec_enc_icdf(psRangeEnc, delta_lagIndex, &silk_pitch_delta_iCDF, 8);
        }
        if encode_absolute_lagIndex != 0 {
            let mut pitch_high_bits: i32 = 0;
            let mut pitch_low_bits: i32 = 0;
            pitch_high_bits = (*psIndices).lagIndex as i32 / ((*psEncC).fs_kHz >> 1);
            pitch_low_bits = (*psIndices).lagIndex as i32
                - pitch_high_bits as i16 as i32 * ((*psEncC).fs_kHz >> 1) as i16 as i32;
            ec_enc_icdf(psRangeEnc, pitch_high_bits, &silk_pitch_lag_iCDF, 8);
            ec_enc_icdf(
                psRangeEnc,
                pitch_low_bits,
                (*psEncC).pitch_lag_low_bits_iCDF,
                8,
            );
        }
        (*psEncC).ec_prevLagIndex = (*psIndices).lagIndex;
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).contourIndex as i32,
            (*psEncC).pitch_contour_iCDF,
            8,
        );
        ec_enc_icdf(
            psRangeEnc,
            (*psIndices).PERIndex as i32,
            &silk_LTP_per_index_iCDF,
            8,
        );
        k = 0;
        while k < (*psEncC).nb_subfr {
            ec_enc_icdf(
                psRangeEnc,
                (*psIndices).LTPIndex[k as usize] as i32,
                silk_LTP_gain_iCDF_ptrs[(*psIndices).PERIndex as usize],
                8,
            );
            k += 1;
        }
        if condCoding == CODE_INDEPENDENTLY {
            ec_enc_icdf(
                psRangeEnc,
                (*psIndices).LTP_scaleIndex as i32,
                &silk_LTPscale_iCDF,
                8,
            );
        }
    }
    (*psEncC).ec_prevSignalType = (*psIndices).signalType as i32;
    ec_enc_icdf(psRangeEnc, (*psIndices).Seed as i32, &silk_uniform4_iCDF, 8);
}