opus-rs 0.1.13

pure Rust implementation of Opus codec
Documentation
use crate::silk::macros::{silk_mul, silk_smlawb};

pub fn silk_lin2log(in_lin: i32) -> i32 {
    if in_lin <= 0 {
        return 0;
    }

    let lz = in_lin.leading_zeros() as i32;

    let rot = 24 - lz;
    let x = in_lin as u32;
    let frac_q7 = if rot == 0 {
        x & 0x7f
    } else if rot < 0 {
        let m = (-rot) as u32;
        ((x << m) | (x >> (32 - m))) & 0x7f
    } else {
        let r = rot as u32;
        ((x << (32 - r)) | (x >> r)) & 0x7f
    } as i32;

    let res = silk_smlawb(frac_q7, silk_mul(frac_q7, 128 - frac_q7), 179);
    res + ((31 - lz) << 7)
}