X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fon2avc.rs;h=59fa8f8156d45fbe76ede4beccd5bc6c6a106958;hb=c39708928eaa7eeb53e4b243cb5c18ea6013d82d;hp=2cd7a8802a190ac7b9a7fe4c65eb7913898767d9;hpb=7d57ae2f680d7a1eba7af2ee831f305b2f0f9324;p=nihav.git diff --git a/nihav-duck/src/codecs/on2avc.rs b/nihav-duck/src/codecs/on2avc.rs index 2cd7a88..59fa8f8 100644 --- a/nihav-duck/src/codecs/on2avc.rs +++ b/nihav-duck/src/codecs/on2avc.rs @@ -210,21 +210,36 @@ impl AVCDecoder { let mut cur_band = 0; let mut scale = 0; let mut first = true; - for wg in self.win_grp.iter().take(self.windows) { - if *wg { + for wg in 0..self.windows { + if self.win_grp[wg] { for _ in 0..bands { if self.cbs[cur_band] == 0 { - self.scales[cur_band] = 0; - } else { - if first { - scale = br.read(7)? as i16; - first = false - } else { - scale += br.read_cb(&self.codebooks.scale_cb)? as i16; - validate!((scale >= 0) && (scale < 128)); + let mut all_zero = true; + let mut band2 = cur_band; + for wg2 in wg + 1..self.windows { + if self.win_grp[wg2] { + break; + } + band2 += bands; + if self.cbs[band2] != 0 { + all_zero = false; + break; + } + } + if all_zero { + self.scales[cur_band] = 0; + cur_band += 1; + continue; } - self.scales[cur_band] = scale as u8; } + if first { + scale = br.read(7)? as i16; + first = false; + } else { + scale += i16::from(br.read_cb(&self.codebooks.scale_cb)?); + validate!((scale >= 0) && (scale < 128)); + } + self.scales[cur_band] = scale as u8; cur_band += 1; } } else { @@ -331,6 +346,7 @@ impl AVCDecoder { } Ok(()) } + #[allow(clippy::cyclomatic_complexity)] fn synth_channel(&mut self, chno: usize, dst: &mut [f32]) { let coeffs = &mut self.coeffs[chno]; let delay = &mut self.delay[chno]; @@ -490,12 +506,12 @@ macro_rules! synth_step0_template { fn $name(src: &[f32], dst: &mut [f32], step: usize, off: usize, sp: &SynthParams) { for i in 0..step { for j in 0..sp.p0 { - dst[i] += ((src[j] as f64) * $tab[sp.idx][j][i]) as f32; + dst[i] += (f64::from(src[j]) * $tab[sp.idx][j][i]) as f32; } } for i in 0..step { for j in 0..sp.p1 { - dst[$size - step + i] += ((src[sp.p0 + off + j] as f64) * $tab[sp.idx][sp.p0 + j][i]) as f32; + dst[$size - step + i] += (f64::from(src[sp.p0 + off + j]) * $tab[sp.idx][sp.p0 + j][i]) as f32; } } } @@ -511,7 +527,7 @@ fn synth_step1(src: &[f32], dst: &mut [f32], size: usize, stride: usize, step: u { let mut pos = step - 1; for _ in 0..off { - let scale = src[p0] as f64; + let scale = f64::from(src[p0]); p0 += 1; pos &= size - 1; for i in 0..pos.min(step) { @@ -683,7 +699,7 @@ fn synth_generic(src: &[f32], dst: &mut [f32], tmpbuf: &mut [f32; COEFFS * 2], i (&mut dst[..size]).copy_from_slice(&src[..size]); let mut order_idx = 0; synth_recursive(dst, tmpbuf, size, order, &mut order_idx, false); - for i in 0..COEFFS { dst[i] *= 0.125; } + for el in dst.iter_mut().take(COEFFS) { *el *= 0.125; } } fn synth1024(dsp: &mut SynthDSP, src: &[f32], dst: &mut [f32], tmpbuf: &mut [f32; COEFFS * 2], is_40khz: bool) { @@ -1067,14 +1083,14 @@ mod test { use nihav_core::codecs::RegisteredDecoders; use nihav_core::demuxers::RegisteredDemuxers; use nihav_codec_support::test::dec_video::*; - use crate::duck_register_all_codecs; + use crate::duck_register_all_decoders; use nihav_commonfmt::generic_register_all_demuxers; #[test] fn test_avc() { let mut dmx_reg = RegisteredDemuxers::new(); generic_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - duck_register_all_codecs(&mut dec_reg); + duck_register_all_decoders(&mut dec_reg); //let file = "assets/Duck/Cell-140.vp5"; //let file = "assets/Duck/Chocolat-500.vp5";