unsafe-libopus 0.2.0

libopus transpiled to rust by c2rust
Documentation
use crate::celt::kiss_fft::{kiss_fft_cpx, kiss_fft_state, opus_fft_impl};
use num_traits::Zero;

pub mod arch_h {
    pub type opus_val16 = f32;
}

#[derive(Copy, Clone)]
#[repr(C)]
pub struct mdct_lookup<'a> {
    pub n: i32,
    pub maxshift: i32,
    pub kfft: [&'a kiss_fft_state<'a>; 4],
    pub trig: &'a [&'a [f32]; 4],
}
pub use self::arch_h::opus_val16;

pub unsafe fn clt_mdct_forward_c(
    l: &mdct_lookup,
    in_0: *mut f32,
    out: *mut f32,
    window: *const opus_val16,
    overlap: i32,
    shift: i32,
    stride: i32,
    _arch: i32,
) {
    let mut i: i32 = 0;
    let mut N: i32 = 0;
    let mut N2: i32 = 0;
    let mut N4: i32 = 0;
    let st: &kiss_fft_state = l.kfft[shift as usize];
    let mut scale: opus_val16 = 0.;
    scale = st.scale;
    let trig = l.trig[shift as usize];
    N = l.n >> shift;
    N2 = N >> 1;
    N4 = N >> 2;
    let vla = N2 as usize;
    let mut f: Vec<f32> = ::std::vec::from_elem(0., vla);
    let vla_0 = N4 as usize;
    let mut f2: Vec<kiss_fft_cpx> = ::std::vec::from_elem(kiss_fft_cpx::zero(), vla_0);
    let mut xp1: *const f32 = in_0.offset((overlap >> 1) as isize);
    let mut xp2: *const f32 = in_0
        .offset(N2 as isize)
        .offset(-(1 as isize))
        .offset((overlap >> 1) as isize);
    let mut yp: *mut f32 = f.as_mut_ptr();
    let mut wp1: *const opus_val16 = window.offset((overlap >> 1) as isize);
    let mut wp2: *const opus_val16 = window.offset((overlap >> 1) as isize).offset(-(1 as isize));
    i = 0;
    while i < overlap + 3 >> 2 {
        let fresh0 = yp;
        yp = yp.offset(1);
        *fresh0 = *wp2 * *xp1.offset(N2 as isize) + *wp1 * *xp2;
        let fresh1 = yp;
        yp = yp.offset(1);
        *fresh1 = *wp1 * *xp1 - *wp2 * *xp2.offset(-N2 as isize);
        xp1 = xp1.offset(2 as isize);
        xp2 = xp2.offset(-(2 as isize));
        wp1 = wp1.offset(2 as isize);
        wp2 = wp2.offset(-(2 as isize));
        i += 1;
    }
    wp1 = window;
    wp2 = window.offset(overlap as isize).offset(-(1 as isize));
    while i < N4 - (overlap + 3 >> 2) {
        let fresh2 = yp;
        yp = yp.offset(1);
        *fresh2 = *xp2;
        let fresh3 = yp;
        yp = yp.offset(1);
        *fresh3 = *xp1;
        xp1 = xp1.offset(2 as isize);
        xp2 = xp2.offset(-(2 as isize));
        i += 1;
    }
    while i < N4 {
        let fresh4 = yp;
        yp = yp.offset(1);
        *fresh4 = -(*wp1 * *xp1.offset(-N2 as isize)) + *wp2 * *xp2;
        let fresh5 = yp;
        yp = yp.offset(1);
        *fresh5 = *wp2 * *xp1 + *wp1 * *xp2.offset(N2 as isize);
        xp1 = xp1.offset(2 as isize);
        xp2 = xp2.offset(-(2 as isize));
        wp1 = wp1.offset(2 as isize);
        wp2 = wp2.offset(-(2 as isize));
        i += 1;
    }
    let mut yp_0: *mut f32 = f.as_mut_ptr();
    let t = trig;
    i = 0;
    while i < N4 {
        let mut yc: kiss_fft_cpx = kiss_fft_cpx::zero();
        let mut t0: f32 = 0.;
        let mut t1: f32 = 0.;
        let mut re: f32 = 0.;
        let mut im: f32 = 0.;
        let mut yr: f32 = 0.;
        let mut yi: f32 = 0.;
        t0 = t[i as usize];
        t1 = t[(N4 + i) as usize];
        let fresh6 = yp_0;
        yp_0 = yp_0.offset(1);
        re = *fresh6;
        let fresh7 = yp_0;
        yp_0 = yp_0.offset(1);
        im = *fresh7;
        yr = re * t0 - im * t1;
        yi = im * t0 + re * t1;
        yc.re = yr;
        yc.im = yi;
        yc.re = scale * yc.re;
        yc.im = scale * yc.im;
        *f2.as_mut_ptr().offset(st.bitrev[i as usize] as isize) = yc;
        i += 1;
    }
    opus_fft_impl(st, &mut f2);
    let mut fp: *const kiss_fft_cpx = f2.as_mut_ptr();
    let mut yp1: *mut f32 = out;
    let mut yp2: *mut f32 = out.offset((stride * (N2 - 1)) as isize);
    let t = trig;
    i = 0;
    while i < N4 {
        let mut yr_0: f32 = 0.;
        let mut yi_0: f32 = 0.;
        yr_0 = (*fp).im * t[(N4 + i) as usize] - (*fp).re * t[i as usize];
        yi_0 = (*fp).re * t[(N4 + i) as usize] + (*fp).im * t[i as usize];
        *yp1 = yr_0;
        *yp2 = yi_0;
        fp = fp.offset(1);
        yp1 = yp1.offset((2 * stride) as isize);
        yp2 = yp2.offset(-((2 * stride) as isize));
        i += 1;
    }
}
pub unsafe fn clt_mdct_backward_c(
    l: &mdct_lookup,
    in_0: *mut f32,
    out: *mut f32,
    window: *const opus_val16,
    overlap: i32,
    shift: i32,
    stride: i32,
    _arch: i32,
) {
    let mut i: i32 = 0;
    let mut N: i32 = 0;
    let mut N2: i32 = 0;
    let mut N4: i32 = 0;
    let trig = l.trig[shift as usize];
    N = l.n >> shift;
    N2 = N >> 1;
    N4 = N >> 2;
    let mut xp1: *const f32 = in_0;
    let mut xp2: *const f32 = in_0.offset((stride * (N2 - 1)) as isize);
    let yp: *mut f32 = out.offset((overlap >> 1) as isize);
    let t = trig;
    let mut bitrev: *const i16 = l.kfft[shift as usize].bitrev.as_ptr();
    i = 0;
    while i < N4 {
        let mut rev: i32 = 0;
        let mut yr: f32 = 0.;
        let mut yi: f32 = 0.;
        let fresh8 = bitrev;
        bitrev = bitrev.offset(1);
        rev = *fresh8 as i32;
        yr = *xp2 * t[i as usize] + *xp1 * t[(N4 + i) as usize];
        yi = *xp1 * t[i as usize] - *xp2 * t[(N4 + i) as usize];
        *yp.offset((2 * rev + 1) as isize) = yr;
        *yp.offset((2 * rev) as isize) = yi;
        xp1 = xp1.offset((2 * stride) as isize);
        xp2 = xp2.offset(-((2 * stride) as isize));
        i += 1;
    }
    opus_fft_impl(
        l.kfft[shift as usize],
        std::slice::from_raw_parts_mut(
            out.offset((overlap >> 1) as isize) as *mut kiss_fft_cpx,
            l.kfft[shift as usize].nfft,
        ),
    );
    let mut yp0: *mut f32 = out.offset((overlap >> 1) as isize);
    let mut yp1: *mut f32 = out
        .offset((overlap >> 1) as isize)
        .offset(N2 as isize)
        .offset(-(2 as isize));
    let t = trig;
    i = 0;
    while i < N4 + 1 >> 1 {
        let mut re: f32 = 0.;
        let mut im: f32 = 0.;
        let mut yr_0: f32 = 0.;
        let mut yi_0: f32 = 0.;
        let mut t0: f32 = 0.;
        let mut t1: f32 = 0.;
        re = *yp0.offset(1 as isize);
        im = *yp0.offset(0 as isize);
        t0 = t[i as usize];
        t1 = t[(N4 + i) as usize];
        yr_0 = re * t0 + im * t1;
        yi_0 = re * t1 - im * t0;
        re = *yp1.offset(1 as isize);
        im = *yp1.offset(0 as isize);
        *yp0.offset(0 as isize) = yr_0;
        *yp1.offset(1 as isize) = yi_0;
        t0 = t[(N4 - i - 1) as usize];
        t1 = t[(N2 - i - 1) as usize];
        yr_0 = re * t0 + im * t1;
        yi_0 = re * t1 - im * t0;
        *yp1.offset(0 as isize) = yr_0;
        *yp0.offset(1 as isize) = yi_0;
        yp0 = yp0.offset(2 as isize);
        yp1 = yp1.offset(-(2 as isize));
        i += 1;
    }
    let mut xp1_0: *mut f32 = out.offset(overlap as isize).offset(-(1 as isize));
    let mut yp1_0: *mut f32 = out;
    let mut wp1: *const opus_val16 = window;
    let mut wp2: *const opus_val16 = window.offset(overlap as isize).offset(-(1 as isize));
    i = 0;
    while i < overlap / 2 {
        let mut x1: f32 = 0.;
        let mut x2: f32 = 0.;
        x1 = *xp1_0;
        x2 = *yp1_0;
        let fresh9 = yp1_0;
        yp1_0 = yp1_0.offset(1);
        *fresh9 = *wp2 * x2 - *wp1 * x1;
        let fresh10 = xp1_0;
        xp1_0 = xp1_0.offset(-1);
        *fresh10 = *wp1 * x2 + *wp2 * x1;
        wp1 = wp1.offset(1);
        wp2 = wp2.offset(-1);
        i += 1;
    }
}