X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-ms%2Fsrc%2Fcodecs%2Fmsvideo1enc.rs;h=9ebc89690bc7adcc089877f89787d5f2fca68b7e;hb=6f2630992fe340ad1a122ec10c649f756e478185;hp=d2e5c34278f9f986e01e9f2c5cd5507f24f78220;hpb=93d1e3738a9278d837be5fd4ed14bf021bd5740b;p=nihav.git diff --git a/nihav-ms/src/codecs/msvideo1enc.rs b/nihav-ms/src/codecs/msvideo1enc.rs index d2e5c34..9ebc896 100644 --- a/nihav-ms/src/codecs/msvideo1enc.rs +++ b/nihav-ms/src/codecs/msvideo1enc.rs @@ -10,7 +10,7 @@ impl Pixel16 { ((self.0 >> 10) & 0x1F, (self.0 >> 5) & 0x1F, self.0 & 0x1F) } fn pack(r: u16, g: u16, b: u16) -> Self { - Pixel16{ 0: (r << 10) | (g << 5) | b } + Pixel16((r << 10) | (g << 5) | b) } fn invalid() -> Self { Self(0x8000) } fn is_invalid(self) -> bool { self == Self::invalid() } @@ -73,7 +73,7 @@ impl VQElement for Pixel16 { let rd = u32::from(r0) - u32::from(r1); let gd = u32::from(g0) - u32::from(g1); let bd = u32::from(b0) - u32::from(b1); - if rd > gd && rd > bd { + if rd > gd && rd >= bd { 0 } else if bd > rd && bd > gd { 2 @@ -146,7 +146,7 @@ impl BlockState { self.clr2[0] = clr0; self.clr2[1] = if !clr1.is_invalid() { clr1 } else { clr0 }; if clr0 == clr1 { - self.fill_val = Pixel16 { 0: buf[0].0 & !0x400 }; + self.fill_val = Pixel16(buf[0].0 & !0x400); filled = true; } two_clr = true; @@ -157,7 +157,7 @@ impl BlockState { for pix in buf.iter() { avg.add(*pix, 1); } - self.fill_val = Pixel16 { 0: avg.get_centroid().0 & !0x400 }; + self.fill_val = Pixel16(avg.get_centroid().0 & !0x400); for pix in buf.iter() { self.fill_dist += pix.dist(self.fill_val); } @@ -210,7 +210,7 @@ impl BlockState { return; } - self.clr8 = [[Pixel16 { 0: 0}; 2]; 4]; + self.clr8 = [[Pixel16(0); 2]; 4]; self.clr8_flags = 0; self.clr8_dist = 0; let mut mask = 1; @@ -315,7 +315,7 @@ impl MSVideo1Encoder { fn get_block(src: &[u16], sstride: usize, buf: &mut [Pixel16; 16]) { for (line, dst) in src.chunks(sstride).zip(buf.chunks_mut(4)) { for i in 0..4 { - dst[i] = Pixel16 { 0: line[i] }; + dst[i] = Pixel16(line[i]); } } } @@ -446,9 +446,9 @@ impl NAEncoder for MSVideo1Encoder { fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult { match encinfo.format { NACodecTypeInfo::None => { - let mut ofmt = EncodeParameters::default(); - ofmt.format = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, true, RGB555_FORMAT)); - Ok(ofmt) + Ok(EncodeParameters { + format: NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, true, RGB555_FORMAT)), + ..Default::default() }) }, NACodecTypeInfo::Audio(_) => Err(EncoderError::FormatError), NACodecTypeInfo::Video(vinfo) => { @@ -582,6 +582,7 @@ mod test { let mut enc_reg = RegisteredEncoders::new(); ms_register_all_encoders(&mut enc_reg); + // sample: https://samples.mplayerhq.hu/V-codecs/UCOD/TalkingHead_352x288.avi let dec_config = DecoderTestParams { demuxer: "avi", in_name: "assets/Misc/TalkingHead_352x288.avi", @@ -610,8 +611,8 @@ 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, - &[0x4339421d, 0x6393f1b6, 0x653d6cd2, 0x3a184382]); + //test_encoding_to_file(&dec_config, &enc_config, enc_params, &[]); + test_encoding_md5(&dec_config, &enc_config, enc_params, &[], + &[0x6921e67e, 0x4f2ada95, 0x009ffc62, 0xd4bfab6a]); } }