msvideo1enc: get rid of small repeated allocation
[nihav.git] / nihav-ms / src / codecs / msvideo1enc.rs
index 6dd5a6052247c22075e71b238329044bc929cc37..8a6281d6217718985cb00bbe8ba41586abce1a6e 100644 (file)
@@ -6,7 +6,7 @@ use nihav_codec_support::vq::*;
 struct Pixel16(u16);
 
 impl Pixel16 {
-    fn unpack(&self) -> (u8, u8, u8) {
+    fn unpack(self) -> (u8, u8, u8) {
         (((self.0 >> 10) & 0x1F) as u8, ((self.0 >> 5) & 0x1F) as u8, (self.0 & 0x1F) as u8)
     }
     fn pack(r: u8, g: u8, b: u8) -> Self {
@@ -50,7 +50,8 @@ impl VQElement for Pixel16 {
         for i in 0..31 {
             offs[i + 1] = offs[i] + counts[i];
         }
-        let mut dst = vec![Pixel16(0); arr.len()];
+        let mut dst = [Pixel16(0); 16];
+        assert!(dst.len() >= arr.len());
         for pix in arr.iter() {
             let (r, g, b) = pix.unpack();
             let idx = match component {
@@ -61,7 +62,8 @@ impl VQElement for Pixel16 {
             dst[offs[idx]] = *pix;
             offs[idx] += 1;
         }
-        arr.copy_from_slice(dst.as_slice());
+        let len = arr.len();
+        arr.copy_from_slice(&dst[..len]);
     }
     fn max_dist_component(min: &Self, max: &Self) -> usize {
         let (r0, g0, b0) = max.unpack();
@@ -409,7 +411,7 @@ impl NAEncoder for MSVideo1Encoder {
                 ofmt.format = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, true, RGB555_FORMAT));
                 Ok(ofmt)
             },
-            NACodecTypeInfo::Audio(_) => return Err(EncoderError::FormatError),
+            NACodecTypeInfo::Audio(_) => Err(EncoderError::FormatError),
             NACodecTypeInfo::Video(vinfo) => {
                 let outinfo = NAVideoInfo::new((vinfo.width + 3) & !3, (vinfo.height + 3) & !3, true, RGB555_FORMAT);
                 let mut ofmt = *encinfo;
@@ -431,17 +433,17 @@ impl NAEncoder for MSVideo1Encoder {
                 }
 
                 let out_info = NAVideoInfo::new(vinfo.width, vinfo.height, true, RGB555_FORMAT);
-                let info = NACodecInfo::new("msvideo1", NACodecTypeInfo::Video(out_info.clone()), None);
-                let mut stream = NAStream::new(StreamType::Video, stream_id, info, encinfo.tb_num, encinfo.tb_den);
+                let info = NACodecInfo::new("msvideo1", NACodecTypeInfo::Video(out_info), None);
+                let mut stream = NAStream::new(StreamType::Video, stream_id, info, encinfo.tb_num, encinfo.tb_den, 0);
                 stream.set_num(stream_id as usize);
                 let stream = stream.into_ref();
-                if let Err(_) = self.pool.prealloc_video(out_info, 2) {
+                if self.pool.prealloc_video(out_info, 2).is_err() {
                     return Err(EncoderError::AllocError);
                 }
 
                 self.stream = Some(stream.clone());
                 self.quality = encinfo.quality;
-                
+
                 Ok(stream)
             },
         }
@@ -534,8 +536,8 @@ 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();
@@ -545,7 +547,7 @@ mod test {
                 demuxer:        "avi",
                 in_name:        "assets/Misc/TalkingHead_352x288.avi",
                 stream_type:    StreamType::Video,
-                limit:          Some(32),
+                limit:          Some(3),
                 dmx_reg, dec_reg,
             };
         let enc_config = EncoderTestParams {
@@ -559,6 +561,7 @@ mod test {
                 height:  0,
                 format:  RGB555_FORMAT,
                 flipped: true,
+                bits:    16,
             };
         let enc_params = EncodeParameters {
                 format:  NACodecTypeInfo::Video(dst_vinfo),
@@ -568,6 +571,8 @@ mod test {
                 tb_den:  0,
                 flags:   0,
             };
-        test_encoding_to_file(&dec_config, &enc_config, enc_params);
+        //test_encoding_to_file(&dec_config, &enc_config, enc_params);
+        test_encoding_md5(&dec_config, &enc_config, enc_params,
+                          &[0x0fc27a11, 0x04337f5d, 0xb8037362, 0xc4f69d8b]);
     }
 }