X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fcodecs%2Fsipro.rs;h=a1a1ed3aac4cc97e9fcc3b98df927177098df64f;hp=c36c7ed17297bcbc65cf126ddb540df27662399d;hb=78fb6560c73965d834b215fb0b49505ae5443288;hpb=01613464323864a655c994820d3c43df1954e3b2 diff --git a/nihav-commonfmt/src/codecs/sipro.rs b/nihav-commonfmt/src/codecs/sipro.rs index c36c7ed..a1a1ed3 100644 --- a/nihav-commonfmt/src/codecs/sipro.rs +++ b/nihav-commonfmt/src/codecs/sipro.rs @@ -6,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, @@ -14,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] = [ @@ -201,11 +202,9 @@ impl SiproDecoder { newfilt[i] = filter[i] + 0.33 * self.lsf_hist[i] + SIPRO_MEAN_LSF_LBR[i]; } for i in 0..8 { // maybe it's just bubble sort? - for j in (0..i+1).rev() { + for j in (0..=i).rev() { if newfilt[j] <= newfilt[j + 1] { break; } - let tmp = newfilt[j]; - newfilt[j] = newfilt[j + 1]; - newfilt[j + 1] = tmp; + newfilt.swap(j, j + 1); } } @@ -314,7 +313,7 @@ impl SiproDecoder { self.fix_vec = [0.0; 80]; let pitch_frac = SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]].min(1.0); for i in 0..10 { - let mut scale = self.pulse_data[i * 2 + 1] as f32; + let mut scale = f32::from(self.pulse_data[i * 2 + 1]); let off = self.pulse_data[i * 2 + 0] as usize; for j in (off..80).step_by(self.prev_pitch) { self.fix_vec[j] += scale; @@ -363,6 +362,7 @@ impl SiproDecoder { } self.unpack_pulses_common(); } + #[allow(clippy::cast_lossless)] fn unpack_pulses_common(&mut self) { for i in 0..48 { self.fix_vec[i] = 0.0; @@ -391,9 +391,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); @@ -425,7 +425,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; @@ -586,13 +586,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]; - for j in (2..i+1).rev() { - poly[j] += -2.0 * (lsp[2 * i] as f64) * poly[j - 1] + poly[j - 2]; + poly[i + 1] = -2.0 * f64::from(lsp[2 * i]) * poly[i] + 2.0 * poly[i - 1]; + for j in (2..=i).rev() { + 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]); } } @@ -614,8 +614,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]); @@ -662,7 +662,7 @@ 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) @@ -684,7 +684,7 @@ impl NADecoder for SiproDecoder { 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,9 +731,17 @@ impl NADecoder for SiproDecoder { frm.set_keyframe(true); Ok(frm.into_ref()) } + fn flush(&mut self) { + } +} + +impl NAOptionHandler for SiproDecoder { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } } -pub fn get_decoder() -> Box { +pub fn get_decoder() -> Box { Box::new(SiproDecoder::new()) } @@ -741,18 +749,18 @@ pub fn get_decoder() -> Box { 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 nihav_codec_support::test::dec_video::test_decode_audio; + use crate::generic_register_all_decoders; + use nihav_realmedia::realmedia_register_all_demuxers; #[test] fn test_sipro() { let mut dmx_reg = RegisteredDemuxers::new(); realmedia_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - generic_register_all_codecs(&mut dec_reg); + generic_register_all_decoders(&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); } }