X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-ms%2Fsrc%2Fcodecs%2Fmsadpcm.rs;h=f95a691f0d8d25a1f401e878860420b264a5c5e8;hb=8a350691199bba1c03aea0c12128f0b8b21ec6e2;hp=a63f4e5a4b9d5661885564d25e5d9ba3199e6f8c;hpb=379524159c95f1c3639976ccf35f9d47cd9732ac;p=nihav.git diff --git a/nihav-ms/src/codecs/msadpcm.rs b/nihav-ms/src/codecs/msadpcm.rs index a63f4e5..f95a691 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,6 +59,7 @@ 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<()> { @@ -121,11 +124,11 @@ impl NADecoder for MSADPCMDecoder { } for ch in 0..channels { let samp = br.read_u16le()? as i16; - pred[ch].sample2 = i32::from(samp); + pred[ch].sample1 = i32::from(samp); } for ch in 0..channels { let samp = br.read_u16le()? as i16; - pred[ch].sample1 = i32::from(samp); + pred[ch].sample2 = i32::from(samp); } for ch in 0..channels { dst[off[ch]] = pred[ch].sample2 as i16; @@ -162,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, @@ -182,8 +188,10 @@ 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 { @@ -259,7 +267,6 @@ impl MSADPCMEncoder { } } self.samples.drain(..len * self.channels); - drop(bw); let ts = NATimeInfo::new(None, None, Some(1), 1, self.srate); Ok(NAPacket::new(self.stream.clone().unwrap(), ts, true, dbuf)) } @@ -297,13 +304,14 @@ 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)); - Ok(ofmt) + Ok(EncodeParameters { + format: NACodecTypeInfo::Audio(NAAudioInfo::new(0, 1, SND_S16_FORMAT, DEFAULT_BLOCK_LEN)), + ..Default::default() }) }, NACodecTypeInfo::Video(_) => Err(EncoderError::FormatError), NACodecTypeInfo::Audio(ainfo) => { @@ -327,6 +335,7 @@ impl NAEncoder for MSADPCMEncoder { } } } + 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), @@ -394,12 +403,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()) } @@ -422,7 +433,7 @@ mod test { 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])); + ExpectedTestResult::MD5([0xb1d6f12c, 0x86d2821b, 0x395f6827, 0xb6be93bf])); } #[cfg(feature="encoder_ms_adpcm")] #[test] @@ -437,6 +448,7 @@ mod test { 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",