aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2017-06-25 09:35:49 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2017-06-25 09:35:49 +0200
commitd699da6e1340740b3224dd7395ba381b639acb4e (patch)
treef87edda94a3bfa6fed4a7bdf74b0832f41113d7e /src
parent3ff4cebbb4d6d7eefa9879eeef59de02481a00cc (diff)
downloadnihav-d699da6e1340740b3224dd7395ba381b639acb4e.tar.gz
imc: cosmetics
Diffstat (limited to 'src')
-rw-r--r--src/codecs/indeo/imc.rs184
1 files changed, 91 insertions, 93 deletions
diff --git a/src/codecs/indeo/imc.rs b/src/codecs/indeo/imc.rs
index 2664cce..b96b8a7 100644
--- a/src/codecs/indeo/imc.rs
+++ b/src/codecs/indeo/imc.rs
@@ -25,40 +25,40 @@ struct IMDCTContext {
struct IMCChannel {
old_floor: [f32; BANDS],
- coeffs1: [f32; BANDS], // new floor?
- coeffs2: [f32; BANDS], // log2 of coeffs1
- coeffs3: [f32; BANDS],
- coeffs4: [f32; BANDS],
- coeffs5: [f32; BANDS],
- coeffs6: [f32; BANDS],
+ new_floor: [f32; BANDS],
+ log_floor: [f32; BANDS],
+ log_floor2: [f32; BANDS],
+ bit_est: [f32; BANDS],
+ mask_wght: [f32; BANDS],
+ adj_floor: [f32; BANDS],
cw: [f32; COEFFS],
last_im: [f32; COEFFS/2],
}
struct BitAlloc {
- band_width: [usize; BANDS],
- band_flag: [bool; BANDS],
- band_skip: [bool; BANDS],
- band_bits: [u8; BANDS],
- cw_len: [u8; COEFFS],
- band_bitsum: [usize; BANDS],
- skip_flag: [bool; COEFFS],
+ band_width: [usize; BANDS],
+ band_present: [bool; BANDS],
+ band_skip: [bool; BANDS],
+ band_bits: [u8; BANDS],
+ cw_len: [u8; COEFFS],
+ band_bitsum: [usize; BANDS],
+ skip_flag: [bool; COEFFS],
skip_flag_bits: [u8; BANDS],
skips_per_band: [usize; BANDS],
- keep_flag: [bool; BANDS],
- coeff: [u8; COEFFS],
+ keep_flag: [bool; BANDS],
+ coeff: [u8; COEFFS],
}
impl IMCChannel {
fn new() -> Self {
IMCChannel {
old_floor: [0.0; BANDS],
- coeffs1: [0.0; BANDS],
- coeffs2: [0.0; BANDS],
- coeffs3: [0.0; BANDS],
- coeffs4: [0.0; BANDS],
- coeffs5: [0.0; BANDS],
- coeffs6: [0.0; BANDS],
+ new_floor: [0.0; BANDS],
+ log_floor: [0.0; BANDS],
+ log_floor2: [0.0; BANDS],
+ bit_est: [0.0; BANDS],
+ mask_wght: [0.0; BANDS],
+ adj_floor: [0.0; BANDS],
cw: [0.0; COEFFS],
last_im: [0.0; COEFFS/2],
}
@@ -74,45 +74,45 @@ const BITALLOC_TOP_LIMIT: f32 = 1.0e20;
impl BitAlloc {
fn new() -> Self {
BitAlloc {
- band_width: [0; BANDS],
- band_flag: [false; BANDS],
- band_skip: [false; BANDS],
- band_bits: [0; BANDS],
- cw_len: [0; COEFFS],
- band_bitsum: [0; BANDS],
- skip_flag: [false; COEFFS],
+ band_width: [0; BANDS],
+ band_present: [false; BANDS],
+ band_skip: [false; BANDS],
+ band_bits: [0; BANDS],
+ cw_len: [0; COEFFS],
+ band_bitsum: [0; BANDS],
+ skip_flag: [false; COEFFS],
skip_flag_bits: [0; BANDS],
skips_per_band: [0; BANDS],
- keep_flag: [false; BANDS],
- coeff: [0; COEFFS],
+ keep_flag: [false; BANDS],
+ coeff: [0; COEFFS],
}
}
fn reset(&mut self) {
for i in 0..BANDS {
- self.band_width[i] = 0;
- self.band_flag[i] = false;
- self.band_skip[i] = false;
- self.band_bits[i] = 0;
- self.keep_flag[i] = false;
- //self.band_bitsum[i] = 0;
- self.skips_per_band[i] = 0;
- self.skip_flag_bits[i] = 0;
+ self.band_width[i] = 0;
+ self.band_present[i] = false;
+ self.band_skip[i] = false;
+ self.band_bits[i] = 0;
+ self.keep_flag[i] = false;
+ self.band_bitsum[i] = 0;
+ self.skips_per_band[i] = 0;
+ self.skip_flag_bits[i] = 0;
}
for i in 0..COEFFS {
- //self.cw_len[i] = 0;
- self.skip_flag[i] = false;
+ self.cw_len[i] = 0;
+ self.skip_flag[i] = false;
}
}
fn calculate_bit_allocation(&mut self, ch_data: &mut IMCChannel, bits: usize, fixed_head: bool, adj_idx: usize) -> DecoderResult<()> {
let mut peak = 0.0;
- for coef in ch_data.coeffs1.iter() { if *coef > peak { peak = *coef; } }
+ for coef in ch_data.new_floor.iter() { if *coef > peak { peak = *coef; } }
peak *= 0.25;
for band in 0..BANDS-1 {
- ch_data.coeffs4[band] = ch_data.coeffs3[band] - ch_data.coeffs5[band].log2();
+ ch_data.bit_est[band] = ch_data.log_floor2[band] - ch_data.mask_wght[band].log2();
}
- ch_data.coeffs4[BANDS - 1] = BITALLOC_LIMIT;
+ ch_data.bit_est[BANDS - 1] = BITALLOC_LIMIT;
for band in 0..BANDS {
let mut idx = 42;
@@ -122,13 +122,13 @@ impl BitAlloc {
if band_w/2 >= self.band_width[band] { idx = 2; }
validate!(idx <= 2);
idx *= 2;
- if ch_data.coeffs1[band] < peak { idx += 1; }
- ch_data.coeffs4[band] += IMC_BITALLOC_ADJ[adj_idx][idx];
+ if ch_data.new_floor[band] < peak { idx += 1; }
+ ch_data.bit_est[band] += IMC_BITALLOC_ADJ[adj_idx][idx];
}
if fixed_head {
for i in 0..4 {
- ch_data.coeffs4[i] = BITALLOC_LIMIT;
+ ch_data.bit_est[i] = BITALLOC_LIMIT;
}
}
@@ -138,7 +138,7 @@ impl BitAlloc {
let mut pool = 0.0;
for band in start..BANDS-1 {
a_width += self.band_width[band];
- pool += (self.band_width[band] as f32) * ch_data.coeffs4[band];
+ pool += (self.band_width[band] as f32) * ch_data.bit_est[band];
}
validate!(a_width > 0);
@@ -156,7 +156,7 @@ impl BitAlloc {
cur_bits = 0;
let mut acc = 0;
for band in start..BANDS {
- let mut len = (ch_data.coeffs4[band] * 0.5 - pool + 0.5) as i32;
+ let mut len = (ch_data.bit_est[band] * 0.5 - pool + 0.5) as i32;
if len < 0 { len = 0; }
if len > 6 { len = 6; }
self.band_bits[band] = len as u8;
@@ -186,7 +186,7 @@ impl BitAlloc {
let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS];
for band in 0..BANDS {
if self.band_bits[band] != 6 {
- tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.coeffs4[band] - 0.415;
+ tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415;
}
}
let mut peak = 0.0;
@@ -220,7 +220,7 @@ impl BitAlloc {
let mut tmp: [f32; BANDS] = [BITALLOC_TOP_LIMIT; BANDS];
for band in start..BANDS {
if self.band_bits[band] != 0 {
- tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.coeffs4[band] - 0.415 + 2.0;
+ tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415 + 2.0;
}
}
while free_bits < cur_bits {
@@ -256,7 +256,7 @@ impl BitAlloc {
let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS];
for band in 0..BANDS {
if self.band_bits[band] != 6 {
- tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.coeffs4[band] - 0.415;
+ tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415;
}
}
let mut used_bits: i32 = 0;
@@ -299,7 +299,7 @@ impl LUTs {
fn new() -> Self {
let mut exp_lev: [f32; 16] = [0.0; 16];
for lev in 0..16 {
- exp_lev[lev] = 10.0f32.powf(-(lev as f32) * 0.4375); // almost exp(-lev)
+ exp_lev[lev] = 10.0f32.powf(-(lev as f32) * 0.4375);
}
let mut exp_10: [f32; 32] = [0.0; 32];
@@ -341,7 +341,7 @@ fn freq2bark(freq: f32) -> f32 {
}
fn calc_maxcoef(coef: f32) -> (f32, f32) {
- let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251); //2.0f32.powf(coef * 0.18945);
+ let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251);
(c1, c1.log2())
}
@@ -442,17 +442,16 @@ impl IMCDecoder {
for i in 0..BANDS {
if i != maxc_pos {
let level = br.read(4)?;
- ch_data.coeffs1[i] = c1 * self.luts.exp_lev[level as usize];
- ch_data.coeffs2[i] = c2 - 1.4533435415 * (level as f32);
+ ch_data.new_floor[i] = c1 * self.luts.exp_lev[level as usize];
+ ch_data.log_floor[i] = c2 - 1.4533435415 * (level as f32);
} else {
- ch_data.coeffs1[i] = c1;
- ch_data.coeffs2[i] = c2;
+ ch_data.new_floor[i] = c1;
+ ch_data.log_floor[i] = c2;
}
self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
- //self.ba.band_flag[i] = false;
- ch_data.coeffs3[i] = ch_data.coeffs2[i] * 2.0;
- ch_data.coeffs5[i] = 1.0;
+ ch_data.log_floor2[i] = ch_data.log_floor[i] * 2.0;
+ ch_data.mask_wght[i] = 1.0;
}
Ok(())
@@ -464,14 +463,14 @@ impl IMCDecoder {
let mut tmp3: [f32; BANDS] = [0.0; BANDS];
for band in 0..BANDS {
- ch_data.coeffs5[band] = 0.0;
+ ch_data.mask_wght[band] = 0.0;
let val;
if self.ba.band_width[band] > 0 {
- val = (ch_data.coeffs1[band] as f64).powi(2);
- ch_data.coeffs3[band] = 2.0 * ch_data.coeffs2[band];
+ val = (ch_data.new_floor[band] as f64).powi(2);
+ ch_data.log_floor2[band] = 2.0 * ch_data.log_floor[band];
} else {
val = 0.0;
- ch_data.coeffs3[band] = -30000.0;
+ ch_data.log_floor2[band] = -30000.0;
}
let tmp = val * (self.ba.band_width[band] as f64) * 0.01;
if val <= 1.0e-30 { tmp3[band] = 0.0; }
@@ -481,7 +480,7 @@ impl IMCDecoder {
for band in 0..BANDS {
let next_band = self.cycle1[band];
for band2 in band..next_band {
- ch_data.coeffs5[band2] += tmp3[band];
+ ch_data.mask_wght[band2] += tmp3[band];
}
tmp2[next_band] += tmp3[band];
}
@@ -489,7 +488,7 @@ impl IMCDecoder {
let mut accum = 0.0;
for band in 1..BANDS {
accum = (tmp2[band] + accum) * self.weights1[band - 1];
- ch_data.coeffs5[band] += accum;
+ ch_data.mask_wght[band] += accum;
}
let mut tmp2: [f32; BANDS] = [0.0; BANDS];
@@ -497,7 +496,7 @@ impl IMCDecoder {
for band in 1..BANDS {
let prev_band = self.cycle2[band];
for band2 in prev_band+1..band {
- ch_data.coeffs5[band2] += tmp3[band];
+ ch_data.mask_wght[band2] += tmp3[band];
}
tmp2[prev_band + 1] += tmp3[band];
}
@@ -506,7 +505,7 @@ impl IMCDecoder {
for i in 0..BANDS-1 {
let band = BANDS - 2 - i;
accum = (tmp2[band + 1] + accum) * self.weights2[band];
- ch_data.coeffs5[band] += accum;
+ ch_data.mask_wght[band] += accum;
}
}
@@ -529,12 +528,12 @@ impl IMCDecoder {
if reset {
let mut ch_data = &mut self.ch_data[ch];
let (mut c1, mut c2) = calc_maxcoef(level[0] as f32);
- ch_data.coeffs1[0] = c1;
- ch_data.coeffs2[0] = c2;
+ ch_data.new_floor[0] = c1;
+ ch_data.log_floor[0] = c2;
for i in 1..BANDS {
if level[i] == 16 {
- ch_data.coeffs1[i] = 1.0;
- ch_data.coeffs2[i] = 0.0;
+ ch_data.new_floor[i] = 1.0;
+ ch_data.log_floor[i] = 0.0;
} else {
let lval;
if level[i] < 17 {
@@ -546,8 +545,8 @@ impl IMCDecoder {
}
c1 *= self.luts.exp_10[(lval + 16) as usize];
c2 += 0.83048 * (lval as f32);
- ch_data.coeffs1[i] = c1;
- ch_data.coeffs2[i] = c2;
+ ch_data.new_floor[i] = c1;
+ ch_data.log_floor[i] = c2;
}
}
} else {
@@ -555,10 +554,10 @@ impl IMCDecoder {
for i in 0..BANDS {
if level[i] < 16 {
let lval = level[i] - 7;
- ch_data.coeffs1[i] = self.luts.exp_10[(lval + 16) as usize] * ch_data.old_floor[i];
- ch_data.coeffs2[i] += (lval as f32) * 0.83048;
+ ch_data.new_floor[i] = self.luts.exp_10[(lval + 16) as usize] * ch_data.old_floor[i];
+ ch_data.log_floor[i] += (lval as f32) * 0.83048;
} else {
- ch_data.coeffs1[i] = ch_data.old_floor[i];
+ ch_data.new_floor[i] = ch_data.old_floor[i];
}
}
}
@@ -570,12 +569,11 @@ impl IMCDecoder {
} else {
self.ba.band_width[i] = 0;
}
- //self.ba.band_flag[i] = false;
}
for i in 0..BANDS-1 {
if self.ba.band_width[i] > 0 {
- self.ba.band_flag[i] = br.read_bool()?;
+ self.ba.band_present[i] = br.read_bool()?;
}
}
self.calculate_channel_values(ch);
@@ -586,7 +584,7 @@ impl IMCDecoder {
fn read_skip_flags(&mut self, br: &mut BitReader) -> DecoderResult<()> {
let mut ba = &mut self.ba;
for band in 0..BANDS {
- if !ba.band_flag[band] || ba.band_width[band] == 0 { continue; }
+ if !ba.band_present[band] || ba.band_width[band] == 0 { continue; }
if !ba.band_skip[band] {
ba.skip_flag_bits[band] = (IMC_BANDS[band + 1] - IMC_BANDS[band]) as u8;
@@ -642,7 +640,7 @@ impl IMCDecoder {
for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize;
}
- if self.ba.band_flag[band] {
+ if self.ba.band_present[band] {
let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
let bitsum = self.ba.band_bitsum[band] as usize;
if (bitsum > 0) && (((band_w * 3) >> 1) > bitsum) {
@@ -655,17 +653,17 @@ impl IMCDecoder {
let mut ch_data = &mut self.ch_data[ch];
for band in 0..BANDS {
- ch_data.coeffs6[band] = ch_data.coeffs1[band];
+ ch_data.adj_floor[band] = ch_data.new_floor[band];
let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
let nonskip = band_w - self.ba.skips_per_band[band];
- if self.ba.band_flag[band] && nonskip > 0 {
- ch_data.coeffs6[band] *= self.luts.sqrt_tab[band_w] / self.luts.sqrt_tab[nonskip];
+ if self.ba.band_present[band] && nonskip > 0 {
+ ch_data.adj_floor[band] *= self.luts.sqrt_tab[band_w] / self.luts.sqrt_tab[nonskip];
}
}
let mut bits_freed: i32 = 0;
for band in 0..BANDS {
- if !self.ba.band_flag[band] { continue; }
+ if !self.ba.band_present[band] { continue; }
for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
if self.ba.skip_flag[i] {
bits_freed += self.ba.cw_len[i] as i32;
@@ -684,10 +682,10 @@ impl IMCDecoder {
fn read_coeffs(&mut self, br: &mut BitReader) -> DecoderResult<()> {
for band in 0..BANDS {
if self.ba.band_bitsum[band] == 0 { continue; }
- if !self.ba.band_flag[band] && (self.ba.band_width[band] == 0) { continue; }
+ if !self.ba.band_present[band] && (self.ba.band_width[band] == 0) { continue; }
for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
let len = self.ba.cw_len[i];
- if len > 0 && (!self.ba.band_flag[band] || !self.ba.skip_flag[i]) {
+ if len > 0 && (!self.ba.band_present[band] || !self.ba.skip_flag[i]) {
self.ba.coeff[i] = br.read(len)? as u8;
} else {
self.ba.coeff[i] = 0;
@@ -712,17 +710,17 @@ impl IMCDecoder {
if cw_len >= 4 {
let quant = &IMC_QUANT_LARGE[qidx];
if val >= mid {
- ch_data.cw[i] = quant[val - 8] * ch_data.coeffs6[band];
+ ch_data.cw[i] = quant[val - 8] * ch_data.adj_floor[band];
} else {
- ch_data.cw[i] = -quant[max - val - 8] * ch_data.coeffs6[band];
+ ch_data.cw[i] = -quant[max - val - 8] * ch_data.adj_floor[band];
}
} else {
- let idx = qidx + (if self.ba.band_flag[band] { 2 } else { 0 });
+ let idx = qidx + (if self.ba.band_present[band] { 2 } else { 0 });
let quant = &IMC_QUANT_SMALL[idx];
if val >= mid {
- ch_data.cw[i] = quant[val - 1] * ch_data.coeffs6[band];
+ ch_data.cw[i] = quant[val - 1] * ch_data.adj_floor[band];
} else {
- ch_data.cw[i] = -quant[max - val - 1] * ch_data.coeffs6[band];
+ ch_data.cw[i] = -quant[max - val - 1] * ch_data.adj_floor[band];
}
}
}
@@ -752,7 +750,7 @@ impl IMCDecoder {
self.read_level_coeffs(&mut br, reset, cb_idx, ch)?;
}
- self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].coeffs1);
+ self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].new_floor);
let mut bitcount: usize = 0;
if fixed_head {