X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-ms%2Fsrc%2Fcodecs%2Fmsadpcm.rs;h=179b097515f95ffa27a05edc78647928fb6f8725;hb=2757a0289c980aeba002609c777815b51ace8e56;hp=a69db74acb683d0562a5dcdba7497d88bebaa044;hpb=0be53e583e2433d7a1702caa24f3864a08f31dd1;p=nihav.git diff --git a/nihav-ms/src/codecs/msadpcm.rs b/nihav-ms/src/codecs/msadpcm.rs index a69db74..179b097 100644 --- a/nihav-ms/src/codecs/msadpcm.rs +++ b/nihav-ms/src/codecs/msadpcm.rs @@ -37,6 +37,7 @@ impl Predictor { } } +#[cfg(feature="decoder_ms_adpcm")] struct MSADPCMDecoder { ainfo: NAAudioInfo, chmap: NAChannelMap, @@ -45,6 +46,7 @@ struct MSADPCMDecoder { block_samps: usize, } +#[cfg(feature="decoder_ms_adpcm")] impl MSADPCMDecoder { fn new() -> Self { Self { @@ -57,7 +59,9 @@ impl MSADPCMDecoder { } } +#[cfg(feature="decoder_ms_adpcm")] impl NADecoder for MSADPCMDecoder { + #[allow(clippy::int_plus_one)] fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { self.block_len = ainfo.get_block_len(); @@ -67,7 +71,7 @@ impl NADecoder for MSADPCMDecoder { self.block_samps = (self.block_len / channels - 7) * 2 + 2; self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), channels as u8, SND_S16P_FORMAT, self.block_samps); self.chmap = NAChannelMap::from_str(if channels == 1 { "C" } else { "L,R" }).unwrap(); - self.adapt_coeffs.truncate(0); + self.adapt_coeffs.clear(); if let Some(ref buf) = info.get_extradata() { validate!(buf.len() >= 6); validate!((buf.len() & 3) == 0); @@ -96,7 +100,7 @@ impl NADecoder for MSADPCMDecoder { if let NACodecTypeInfo::Audio(_) = info.get_properties() { let pktbuf = pkt.get_buffer(); let channels = self.chmap.num_channels(); - validate!(pktbuf.len() > 0 && (pktbuf.len() % self.block_len) == 0); + validate!(!pktbuf.is_empty() && (pktbuf.len() % self.block_len) == 0); let nblocks = pktbuf.len() / self.block_len; let nsamples = nblocks * self.block_samps; let abuf = alloc_audio_buffer(self.ainfo, nsamples, self.chmap.clone())?; @@ -161,17 +165,20 @@ impl NADecoder for MSADPCMDecoder { } } +#[cfg(feature="decoder_ms_adpcm")] impl NAOptionHandler for MSADPCMDecoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="decoder_ms_adpcm")] pub fn get_decoder() -> Box { Box::new(MSADPCMDecoder::new()) } #[derive(Default)] +#[cfg(feature="encoder_ms_adpcm")] struct MSADPCMEncoder { stream: Option, samples: Vec, @@ -181,12 +188,14 @@ struct MSADPCMEncoder { srate: u32, } +#[cfg(feature="encoder_ms_adpcm")] const DEFAULT_BLOCK_LEN: usize = 256; +#[cfg(feature="encoder_ms_adpcm")] impl MSADPCMEncoder { fn new() -> Self { Self::default() } fn encode_packet(&mut self) -> EncoderResult { - if self.samples.len() == 0 { + if self.samples.is_empty() { return Err(EncoderError::TryAgain); } let len = (self.samples.len() / self.channels).min(self.block_len); @@ -296,15 +305,16 @@ impl MSADPCMEncoder { } } +#[cfg(feature="encoder_ms_adpcm")] impl NAEncoder for MSADPCMEncoder { fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult { match encinfo.format { NACodecTypeInfo::None => { - let mut ofmt = EncodeParameters::default(); - ofmt.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 1, SND_S16_FORMAT, DEFAULT_BLOCK_LEN)); - return Ok(ofmt); + Ok(EncodeParameters { + format: NACodecTypeInfo::Audio(NAAudioInfo::new(0, 1, SND_S16_FORMAT, DEFAULT_BLOCK_LEN)), + ..Default::default() }) }, - NACodecTypeInfo::Video(_) => return Err(EncoderError::FormatError), + NACodecTypeInfo::Video(_) => Err(EncoderError::FormatError), NACodecTypeInfo::Audio(ainfo) => { let mut outinfo = ainfo; outinfo.channels = outinfo.channels.min(2); @@ -322,10 +332,11 @@ impl NAEncoder for MSADPCMEncoder { } let mut ofmt = *encinfo; ofmt.format = NACodecTypeInfo::Audio(outinfo); - return Ok(ofmt); + Ok(ofmt) } - }; + } } + fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR } fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult { match encinfo.format { NACodecTypeInfo::None => Err(EncoderError::FormatError), @@ -346,7 +357,7 @@ impl NAEncoder for MSADPCMEncoder { let soniton = NASoniton::new(4, 0); let out_ainfo = NAAudioInfo::new(ainfo.sample_rate, ainfo.channels, soniton, Self::calc_block_size(self.block_len, self.channels)); let info = NACodecInfo::new("ms-adpcm", NACodecTypeInfo::Audio(out_ainfo), None); - let mut stream = NAStream::new(StreamType::Audio, stream_id, info.clone(), self.block_len as u32, ainfo.sample_rate); + let mut stream = NAStream::new(StreamType::Audio, stream_id, info, self.block_len as u32, ainfo.sample_rate, 0); stream.set_num(stream_id as usize); let stream = stream.into_ref(); @@ -393,12 +404,14 @@ impl NAEncoder for MSADPCMEncoder { } } +#[cfg(feature="encoder_ms_adpcm")] impl NAOptionHandler for MSADPCMEncoder { fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } fn set_options(&mut self, _options: &[NAOption]) { } fn query_option_value(&self, _name: &str) -> Option { None } } +#[cfg(feature="encoder_ms_adpcm")] pub fn get_encoder() -> Box { Box::new(MSADPCMEncoder::new()) } @@ -418,7 +431,7 @@ mod test { let mut dmx_reg = RegisteredDemuxers::new(); generic_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - ms_register_all_codecs(&mut dec_reg); + ms_register_all_decoders(&mut dec_reg); test_decoding("avi", "ms-adpcm", "assets/MS/dance.avi", None, &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0xf5e3fc84, 0xbcabc11c, 0x33c6874e, 0xe05ecd14])); @@ -429,13 +442,14 @@ mod test { let mut dmx_reg = RegisteredDemuxers::new(); generic_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - generic_register_all_codecs(&mut dec_reg); - ms_register_all_codecs(&mut dec_reg); + generic_register_all_decoders(&mut dec_reg); + ms_register_all_decoders(&mut dec_reg); let mut mux_reg = RegisteredMuxers::new(); generic_register_all_muxers(&mut mux_reg); let mut enc_reg = RegisteredEncoders::new(); ms_register_all_encoders(&mut enc_reg); + // sample: https://samples.mplayerhq.hu/V-codecs/RT21/320x240/laser05.avi let dec_config = DecoderTestParams { demuxer: "avi", in_name: "assets/Indeo/laser05.avi", @@ -463,6 +477,7 @@ mod test { tb_den: 0, flags: 0, }; - test_encoding_to_file(&dec_config, &enc_config, enc_params); + test_encoding_md5(&dec_config, &enc_config, enc_params, &[], + &[0x82259f45, 0xba7b984a, 0xc03c94e5, 0x00b4312b]); } }