X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-vivo%2Fsrc%2Fcodecs%2Fg723_1.rs;h=89d694d15df2e979888a998a7b4005cb055c0d29;hb=refs%2Fheads%2Fmaster;hp=1b6d8c626952c4bc795188f2a1328da926387e00;hpb=494ad253e745d90795e6e1bbce622e4d2a1ef7e6;p=nihav.git diff --git a/nihav-vivo/src/codecs/g723_1.rs b/nihav-vivo/src/codecs/g723_1.rs index 1b6d8c6..ea229fb 100644 --- a/nihav-vivo/src/codecs/g723_1.rs +++ b/nihav-vivo/src/codecs/g723_1.rs @@ -396,7 +396,7 @@ impl G7231Decoder { Self::inverse_quant(&self.prev_lsp, &mut cur_lsp, &self.lsp_index, bad_frame); Self::interpolate_lsp(&mut self.lpc, &cur_lsp, &self.prev_lsp); self.prev_lsp.copy_from_slice(&cur_lsp); - (&mut self.excitation[..MAX_PITCH]).copy_from_slice(&self.prev_excitation); + self.excitation[..MAX_PITCH].copy_from_slice(&self.prev_excitation); if self.erased_frames == 0 { let mut acb_vector = [0; SUBFRAME_LEN]; self.interp_gain = FIXED_CB_GAIN[(self.subframe[2].amp_index + self.subframe[3].amp_index) >> 1]; @@ -404,9 +404,9 @@ impl G7231Decoder { for (i, subframe) in self.subframe.iter_mut().enumerate() { subframe.gen_fcb_excitation(&mut self.excitation[exc_start..], self.is_6300, FCB_MAX_POS[i], if (i & 1) == 0 { 6 } else { 5 }); subframe.gen_acb_excitation(&mut acb_vector, &self.excitation[SUBFRAME_LEN * i..], self.is_6300); - for i in 0..SUBFRAME_LEN { - let val = self.excitation[exc_start + i]; - self.excitation[exc_start + i] = val.saturating_add(val).saturating_add(acb_vector[i]); + for (exc, &acb) in self.excitation[exc_start..][..SUBFRAME_LEN].iter_mut() + .zip(acb_vector.iter()) { + *exc = exc.saturating_add(*exc).saturating_add(acb); } exc_start += SUBFRAME_LEN; } @@ -538,7 +538,7 @@ impl G7231Decoder { subframe.acb_lag = ADAPTIVE_LAG[i]; } - let mut off = [0; 4]; + let mut off = [0; SUBFRAMES]; let mut signs = [[0; 11]; 2]; for i in (0..4).step_by(2) { let t = self.cng_rnd.next_range(1 << 13); @@ -552,30 +552,27 @@ impl G7231Decoder { let mut pos = [0; 11 * SUBFRAMES]; let mut pidx = 0; let mut tmp = [0; SUBFRAME_LEN / 2]; - for i in 0..SUBFRAMES { + for (i, &offset) in off.iter().enumerate() { let npulses = if (i & 1) == 0 { 6 } else { 5 }; for j in 0..npulses { let idx = self.cng_rnd.next_range(SUBFRAME_LEN / 2 - j); - pos[pidx] = tmp[idx] * 2 + off[i]; + pos[pidx] = tmp[idx] * 2 + offset; pidx += 1; tmp[idx] = tmp[SUBFRAME_LEN / 2 - 1 - j]; } } - (&mut self.synth_buf[LPC_ORDER..][..MAX_PITCH]).copy_from_slice(&self.prev_excitation); + self.synth_buf[LPC_ORDER..][..MAX_PITCH].copy_from_slice(&self.prev_excitation); let mut acb_vec = [0; SUBFRAME_LEN]; let mut tmp = [0; SUBFRAME_LEN * 2]; for i in (0..SUBFRAMES).step_by(2) { let buf = &mut self.synth_buf[LPC_ORDER + SUBFRAME_LEN * i..]; self.subframe[i].gen_acb_excitation(&mut acb_vec, buf, self.is_6300); - (&mut buf[..SUBFRAME_LEN]).copy_from_slice(&acb_vec); + buf[..SUBFRAME_LEN].copy_from_slice(&acb_vec); self.subframe[i + 1].gen_acb_excitation(&mut acb_vec, &buf[SUBFRAME_LEN..], self.is_6300); - (&mut buf[SUBFRAME_LEN..][..SUBFRAME_LEN]).copy_from_slice(&acb_vec); + buf[SUBFRAME_LEN..][..SUBFRAME_LEN].copy_from_slice(&acb_vec); - let mut max = 0; - for j in 0..SUBFRAME_LEN*2 { - max |= i32::from(buf[j]).abs(); - } + let max = buf[..SUBFRAME_LEN * 2].iter().fold(0i32, |acc, &a| acc | i32::from(a).abs()); let shift = if max == 0 { 0 } else { (-10 + (32 - max.min(0x7FFF).leading_zeros()) as i32).max(-2) }; @@ -783,9 +780,9 @@ impl G7231Decoder { } } fn formant_postfilter(&mut self, dst: &mut [i16]) { - (&mut self.synth_buf[..LPC_ORDER]).copy_from_slice(&self.fir_mem); + self.synth_buf[..LPC_ORDER].copy_from_slice(&self.fir_mem); let mut filter_data = [0; LPC_ORDER + SAMPLES]; - (&mut filter_data[..LPC_ORDER]).copy_from_slice(&self.iir_mem); + filter_data[..LPC_ORDER].copy_from_slice(&self.iir_mem); let mut filter_coef = [[0; LPC_ORDER]; 2]; for i in 0..SUBFRAMES { @@ -830,8 +827,8 @@ impl G7231Decoder { } fn gain_scale(pf_gain: &mut i32, buf: &mut [i16], energy: i32) { let mut den = 0i32; - for i in 0..SUBFRAME_LEN { - let val = i32::from(buf[i] >> 2); + for &samp in buf[..SUBFRAME_LEN].iter() { + let val = i32::from(samp >> 2); den = den.saturating_add(val * val).saturating_add(val * val); } let mut num = energy; @@ -848,19 +845,19 @@ impl G7231Decoder { gain = 1 << 12; } - for i in 0..SUBFRAME_LEN { + for val in buf[..SUBFRAME_LEN].iter_mut() { *pf_gain = (15 * *pf_gain + gain + (1 << 3)) >> 4; - buf[i] = clip16((i32::from(buf[i]) * (*pf_gain + (*pf_gain >> 4)) + (1 << 10)) >> 11); + *val = clip16((i32::from(*val) * (*pf_gain + (*pf_gain >> 4)) + (1 << 10)) >> 11); } } } fn clip16(a: i32) -> i16 { - a.min(i32::from(std::i16::MAX)).max(i32::from(std::i16::MIN)) as i16 + a.min(i32::from(i16::MAX)).max(i32::from(i16::MIN)) as i16 } fn clip32(a: i64) -> i32 { - a.min(i64::from(std::i32::MAX)).max(i64::from(std::i32::MIN)) as i32 + a.min(i64::from(i32::MAX)).max(i64::from(i32::MIN)) as i32 } fn mul16(a: i32, b: i16) -> i32 { @@ -938,14 +935,14 @@ impl NADecoder for G7231Decoder { let abuf = alloc_audio_buffer(self.ainfo, SAMPLES, self.chmap.clone())?; let mut adata = abuf.get_abuf_i16().unwrap(); - let mut asamples = adata.get_data_mut().unwrap(); + let asamples = adata.get_data_mut().unwrap(); if self.cur_ftype == G7231FrameType::Active { - self.synth_frame_active(&mut asamples, bad_frame); + self.synth_frame_active(asamples, bad_frame); } else { self.synth_frame_other(); } self.prev_ftype = self.cur_ftype; - (&mut self.synth_buf[..LPC_ORDER]).copy_from_slice(&self.filt_mem); + self.synth_buf[..LPC_ORDER].copy_from_slice(&self.filt_mem); for i in 0..SUBFRAMES { Self::do_lpc(&mut self.synth_buf, LPC_ORDER + i * SUBFRAME_LEN, &self.lpc[i]); } @@ -975,15 +972,16 @@ mod test { use nihav_core::codecs::RegisteredDecoders; use nihav_core::demuxers::RegisteredDemuxers; use nihav_codec_support::test::dec_video::*; - use crate::vivo_register_all_codecs; + use crate::vivo_register_all_decoders; use crate::vivo_register_all_demuxers; #[test] fn test_g723_1() { let mut dmx_reg = RegisteredDemuxers::new(); vivo_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - vivo_register_all_codecs(&mut dec_reg); + vivo_register_all_decoders(&mut dec_reg); + // sample: https://samples.mplayerhq.hu/vivo/viv1/adalogo.viv let file = "assets/Misc/adalogo.viv"; //let file = "assets/Misc/gr_al.viv"; //test_decode_audio("vivo", file, Some(1500), None/*Some("g7231")*/, &dmx_reg, &dec_reg);