]> git.nihav.org Git - nihav.git/blobdiff - nihav-ms/src/codecs/imaadpcmenc.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-ms / src / codecs / imaadpcmenc.rs
index a64f58f0dbac96282d6208516bcf3f53837552de..eee51b8993a5368c4ec73a00af21069f0dd252fa 100644 (file)
@@ -96,7 +96,6 @@ impl IMAADPCMEncoder {
                     nw.write(nib)?;
                 }
             }
-            drop(nw);
         } else {
             self.nodes.reserve(self.block_len);
             self.nibs.resize(self.channels, Vec::new());
@@ -107,12 +106,12 @@ impl IMAADPCMEncoder {
             let mut state = [TrellisNode::default(); 16];
             for ch in 0..self.channels {
                 self.nodes.clear();
-                for i in 0..16 {
+                for (i, state) in state.iter_mut().enumerate() {
                     let step = (((self.first[ch].step + i) as isize) - 8).max(0).min(IMA_MAX_STEP as isize) as usize;
-                    state[i].state.predictor = self.first[ch].predictor;
-                    state[i].state.step = step;
-                    state[i].error = 0;
-                    state[i].nib = step as u8;
+                    state.state.predictor = self.first[ch].predictor;
+                    state.state.step = step;
+                    state.error = 0;
+                    state.nib = step as u8;
                 }
                 self.nodes.push(state);
                 let mut sidx = ch + step;
@@ -164,7 +163,6 @@ impl IMAADPCMEncoder {
                     nw.write(self.nibs[ch][i])?;
                 }
             }
-            drop(nw);
         }
 
         self.samples.drain(..self.block_len * self.channels);
@@ -189,9 +187,9 @@ impl NAEncoder for IMAADPCMEncoder {
     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) => {
@@ -203,6 +201,9 @@ impl NAEncoder for IMAADPCMEncoder {
                 if outinfo.block_len == 0 {
                     outinfo.block_len = DEFAULT_BLOCK_LEN;
                 }
+                if outinfo.block_len == 1 && encinfo.tb_den != outinfo.sample_rate {
+                    outinfo.block_len = ((u64::from(outinfo.sample_rate) * u64::from(encinfo.tb_num) / u64::from(encinfo.tb_den) + 3) & !3) as usize;
+                }
                 if outinfo.block_len < 2 {
                     outinfo.block_len = 2;
                 }
@@ -215,6 +216,7 @@ impl NAEncoder for IMAADPCMEncoder {
             }
         }
     }
+    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),
@@ -341,6 +343,7 @@ mod test {
         let mut enc_reg = RegisteredEncoders::new();
         ms_register_all_encoders(&mut enc_reg);
 
+        // sample: https://samples.mplayerhq.hu/V-codecs/VP4/ot171_vp40.avi
         let dec_config = DecoderTestParams {
                 demuxer:        "avi",
                 in_name:        "assets/Duck/ot171_vp40.avi",
@@ -371,7 +374,7 @@ mod test {
         let enc_options = &[
                 NAOption{name: "trellis", value: NAValue::Bool(trellis)},
             ];
-        test_encoding_to_file(&dec_config, &enc_config, enc_params, enc_options);
+//        test_encoding_to_file(&dec_config, &enc_config, enc_params, enc_options);
 
         test_encoding_md5(&dec_config, &enc_config, enc_params, enc_options,
                           hash);