X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fcodecs%2Fsipro.rs;h=bd72643b663103a6585d9cafe50f4b340d826364;hp=8820a011149d5d2ae5826c7b6e7087ed156f5f76;hb=e64739f87a35f29be0bbbce366876180ba3eb57e;hpb=4f6124ac474e05ab343505444cdbb69b67829e2c diff --git a/nihav-commonfmt/src/codecs/sipro.rs b/nihav-commonfmt/src/codecs/sipro.rs index 8820a01..bd72643 100644 --- a/nihav-commonfmt/src/codecs/sipro.rs +++ b/nihav-commonfmt/src/codecs/sipro.rs @@ -1,5 +1,3 @@ -use std::rc::Rc; -use std::cell::RefCell; use nihav_core::formats::*; use nihav_core::frame::*; use nihav_core::codecs::*; @@ -8,6 +6,7 @@ use nihav_core::io::bitreader::*; use std::f32::consts::PI; #[derive(Clone,Copy,PartialEq)] +#[allow(clippy::enum_variant_names)] enum SiproMode { Mode16k, Mode8_5k, @@ -16,7 +15,7 @@ enum SiproMode { } impl SiproMode { - fn is16k(&self) -> bool { *self == SiproMode::Mode16k } + fn is16k(self) -> bool { self == SiproMode::Mode16k } } const SIPRO_MODE_FROM_IDX: [SiproMode; 4] = [ @@ -28,7 +27,7 @@ const EXCITATION_OFFSET: usize = 281 + 10 + 1; struct SiproDecoder { chmap: NAChannelMap, ainfo: NAAudioInfo, - info: Rc, + info: NACodecInfoRef, mode: &'static SiproModeInfo, mode_type: SiproMode, @@ -393,9 +392,9 @@ impl SiproDecoder { fn update_gain_16k(&mut self, sf: usize) { let mut energy: f64 = 0.0; for i in 0..80 { - energy += (self.fix_vec[i] as f64) * (self.fix_vec[i] as f64); + energy += f64::from(self.fix_vec[i]) * f64::from(self.fix_vec[i]); } - let ehist = ((0.8 * self.energy_hist[0] + 0.6 * self.energy_hist[1]) as f64) - 71.30899869919435856603; + let ehist = f64::from(0.8 * self.energy_hist[0] + 0.6 * self.energy_hist[1]) - 71.30899869919435856603; let rms = 8.94427190999915878559 * (10.0f64.ln() / 20.0 * ehist).exp() / (0.01 + energy).sqrt(); let gain = SIPRO_GAIN_CB_16K[self.gc_index[sf]] * (rms as f32); @@ -427,7 +426,7 @@ impl SiproDecoder { } self.energy_hist[3] = 20.0 * gain1.log10(); - let gain = ((gain1 as f64) * ((sum as f64) * (10.0f64).ln() * 0.05).exp() / (self.avg_energy as f64).sqrt()) as f32; + let gain = (f64::from(gain1) * (f64::from(sum) * (10.0f64).ln() * 0.05).exp() / f64::from(self.avg_energy).sqrt()) as f32; let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 48..][..48]; for i in 0..48 { exc[i] = exc[i] * gain0 + self.fix_vec[i] * gain; @@ -588,13 +587,13 @@ impl SiproDecoder { fn lsp2poly(lsp: &[f32], poly: &mut [f64], order: usize) { poly[0] = 1.0; - poly[1] = -2.0 * (lsp[0] as f64); + poly[1] = -2.0 * f64::from(lsp[0]); for i in 1..order { - poly[i + 1] = -2.0 * (lsp[2 * i] as f64) * poly[i] + 2.0 * poly[i - 1]; + poly[i + 1] = -2.0 * f64::from(lsp[2 * i]) * poly[i] + 2.0 * poly[i - 1]; for j in (2..i+1).rev() { - poly[j] += -2.0 * (lsp[2 * i] as f64) * poly[j - 1] + poly[j - 2]; + poly[j] += -2.0 * f64::from(lsp[2 * i]) * poly[j - 1] + poly[j - 2]; } - poly[1] += -2.0 * (lsp[2 * i] as f64); + poly[1] += -2.0 * f64::from(lsp[2 * i]); } } @@ -616,8 +615,8 @@ fn lsp2lpc_lbr(lpc: &mut [f32], lsp: &[f32]) { lsp2poly(&lsp[0..], &mut a[0..], 5); lsp2poly(&lsp[1..], &mut b[1..], 4); - let ascale = (1.0 + lsp[9]) as f64; - let bscale = (1.0 - lsp[9]) as f64; + let ascale = f64::from(1.0 + lsp[9]); + let bscale = f64::from(1.0 - lsp[9]); for i in 1..5 { let ta = ascale * a[i]; let tb = bscale * (b[i + 1] - b[i - 1]); @@ -640,7 +639,7 @@ fn synth_filter(dst: &mut [f32], doff: usize, filt: &[f32], src: &[f32], len: us const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; impl NADecoder for SiproDecoder { - fn init(&mut self, info: Rc) -> DecoderResult<()> { + fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { let mut found = false; for i in 0..SIPRO_MODES.len() { @@ -664,13 +663,13 @@ impl NADecoder for SiproDecoder { self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), 1, SND_F32P_FORMAT, 0); - self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone())); + self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo)); Ok(()) } else { Err(DecoderError::InvalidData) } } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult { + fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult { let info = pkt.get_stream().get_info(); validate!(info.get_properties().is_audio()); let pktbuf = pkt.get_buffer(); @@ -680,13 +679,13 @@ impl NADecoder for SiproDecoder { let duration = out_frm_size * nframes; - let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?; + let abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?; let mut adata = abuf.get_abuf_f32().unwrap(); - let mut dst = adata.get_data_mut(); + let dst = adata.get_data_mut().unwrap(); let frame_len = self.mode.subframe_len * self.mode.subframes; for (input, output) in pktbuf.chunks(frm_size).zip(dst.chunks_mut(out_frm_size)) { - let mut br = BitReader::new(input, input.len(), BitReaderMode::LE); + let mut br = BitReader::new(input, BitReaderMode::LE); for dst in output.chunks_mut(frame_len) { self.unpack_frame(&mut br)?; if self.mode_type.is16k() { @@ -731,11 +730,13 @@ impl NADecoder for SiproDecoder { let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf); frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) + Ok(frm.into_ref()) + } + fn flush(&mut self) { } } -pub fn get_decoder() -> Box { +pub fn get_decoder() -> Box { Box::new(SiproDecoder::new()) } @@ -744,8 +745,8 @@ mod test { use nihav_core::codecs::RegisteredDecoders; use nihav_core::demuxers::RegisteredDemuxers; use nihav_core::test::dec_video::test_decode_audio; - use crate::codecs::generic_register_all_codecs; - use nihav_realmedia::demuxers::realmedia_register_all_demuxers; + use crate::generic_register_all_codecs; + use nihav_realmedia::realmedia_register_all_demuxers; #[test] fn test_sipro() { let mut dmx_reg = RegisteredDemuxers::new(); @@ -754,7 +755,7 @@ mod test { generic_register_all_codecs(&mut dec_reg); let file = "assets/RV/autahi-vox.rm"; - test_decode_audio("realmedia", file, Some(5000), "sipro", &dmx_reg, &dec_reg); + test_decode_audio("realmedia", file, Some(5000), None/*Some("sipro")*/, &dmx_reg, &dec_reg); } }