}
}
+#[cfg(feature="decoder_ms_adpcm")]
struct MSADPCMDecoder {
ainfo: NAAudioInfo,
chmap: NAChannelMap,
block_samps: usize,
}
+#[cfg(feature="decoder_ms_adpcm")]
impl MSADPCMDecoder {
fn new() -> Self {
Self {
}
}
+#[cfg(feature="decoder_ms_adpcm")]
impl NADecoder for MSADPCMDecoder {
#[allow(clippy::int_plus_one)]
fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
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);
}
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;
}
}
+#[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<NAValue> { None }
}
+#[cfg(feature="decoder_ms_adpcm")]
pub fn get_decoder() -> Box<dyn NADecoder + Send> {
Box::new(MSADPCMDecoder::new())
}
#[derive(Default)]
+#[cfg(feature="encoder_ms_adpcm")]
struct MSADPCMEncoder {
stream: Option<NAStreamRef>,
samples: Vec<i16>,
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<NAPacket> {
}
}
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))
}
}
}
+#[cfg(feature="encoder_ms_adpcm")]
impl NAEncoder for MSADPCMEncoder {
fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult<EncodeParameters> {
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) => {
}
}
}
+ fn get_capabilities(&self) -> u64 { ENC_CAPS_CBR }
fn init(&mut self, stream_id: u32, encinfo: EncodeParameters) -> EncoderResult<NAStreamRef> {
match encinfo.format {
NACodecTypeInfo::None => Err(EncoderError::FormatError),
}
}
+#[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<NAValue> { None }
}
+#[cfg(feature="encoder_ms_adpcm")]
pub fn get_encoder() -> Box<dyn NAEncoder + Send> {
Box::new(MSADPCMEncoder::new())
}
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]
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",
tb_den: 0,
flags: 0,
};
- test_encoding_md5(&dec_config, &enc_config, enc_params,
- &[0xe1591a1e, 0x816d0239, 0x4cc42291, 0x4e6b69cb]);
+ test_encoding_md5(&dec_config, &enc_config, enc_params, &[],
+ &[0x82259f45, 0xba7b984a, 0xc03c94e5, 0x00b4312b]);
}
}