width: usize,
height: usize,
range: usize,
+ sent_pal: bool,
}
fn buf_type_to_bpp(buf: &NABufferType) -> u8 {
width: 0,
height: 0,
range: 128,
+ sent_pal: false,
}
}
fn encode_intra(&mut self, bw: &mut ByteWriter, buf: NABufferType) -> EncoderResult<()> {
}
bw.write_buf(&self.frm1[..self.width * self.height * bm])?;
} else {
- self.tmp_buf.truncate(0);
+ self.tmp_buf.clear();
if bpp == 8 {
self.tmp_buf.extend_from_slice(&self.pal);
}
let mut db = Vec::new();
std::mem::swap(&mut db, &mut self.zbuf);
- db.truncate(0);
+ db.clear();
let mut wr = DeflateWriter::new(db);
self.compr.write_zlib_header(&mut wr);
self.compr.compress(&self.tmp_buf, &mut wr);
self.frm1.copy_from_slice(&self.frm2);
bw.write_byte(0)?;
- self.tmp_buf.truncate(0);
+ self.tmp_buf.clear();
let tile_w = (self.width + self.tile_w - 1) / self.tile_w;
let tile_h = (self.height + self.tile_h - 1) / self.tile_h;
let mv_size = (tile_w * tile_h * 2 + 3) & !3;
let mut db = Vec::new();
std::mem::swap(&mut db, &mut self.zbuf);
- db.truncate(0);
+ db.clear();
let mut wr = DeflateWriter::new(db);
self.compr.compress(&self.tmp_buf, &mut wr);
self.compr.compress_flush(&mut wr);
return Err(EncoderError::FormatError);
}
- self.tmp_buf.truncate(0);
+ self.tmp_buf.clear();
if let (NABufferType::Video(ref vbuf), true) = (&buf, bpp == 8) {
let mut npal = [0; 768];
let off = vbuf.get_offset(1);
self.pal = npal;
bw.write_byte(2)?;
+
+ self.sent_pal = false;
} else {
bw.write_byte(0)?;
}
let mut db = Vec::new();
std::mem::swap(&mut db, &mut self.zbuf);
- db.truncate(0);
+ db.clear();
let mut wr = DeflateWriter::new(db);
self.compr.compress(&self.tmp_buf, &mut wr);
self.compr.compress_flush(&mut wr);
bw.write_buf(&self.zbuf)?;
}
-
+
Ok(())
}
}
fn negotiate_format(&self, encinfo: &EncodeParameters) -> EncoderResult<EncodeParameters> {
match encinfo.format {
NACodecTypeInfo::None => {
- let mut ofmt = EncodeParameters::default();
- ofmt.format = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, true, YUV420_FORMAT));
- Ok(ofmt)
+ Ok(EncodeParameters {
+ format: NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, true, YUV420_FORMAT)),
+ ..Default::default()
+ })
},
NACodecTypeInfo::Audio(_) => Err(EncoderError::FormatError),
NACodecTypeInfo::Video(vinfo) => {
NACodecTypeInfo::Video(vinfo) => {
self.width = vinfo.width;
self.height = vinfo.height;
-
+
let out_info = NAVideoInfo::new(vinfo.width, vinfo.height, false, vinfo.format);
let info = NACodecInfo::new("zmbv", NACodecTypeInfo::Video(out_info), None);
let mut stream = NAStream::new(StreamType::Video, stream_id, info, encinfo.tb_num, encinfo.tb_den, 0);
false
};
self.pkt = Some(NAPacket::new(self.stream.clone().unwrap(), frm.ts, is_intra, dbuf));
+ if self.bpp == 8 && !self.sent_pal {
+ if let NABufferType::Video(ref buf) = frm.get_buffer() {
+ let paloff = buf.get_offset(1);
+ let data = buf.get_data();
+ let mut pal = [0; 1024];
+ let srcpal = &data[paloff..][..768];
+ for (dclr, sclr) in pal.chunks_exact_mut(4).zip(srcpal.chunks_exact(3)) {
+ dclr[..3].copy_from_slice(sclr);
+ }
+ if let Some(ref mut pkt) = &mut self.pkt {
+ pkt.side_data.push(NASideData::Palette(true, Arc::new(pal)));
+ }
+ }
+ self.sent_pal = true;
+ }
self.frmcount += 1;
if self.frmcount == self.key_int {
self.frmcount = 0;
use nihav_codec_support::test::enc_video::*;
use super::{RGB555_FORMAT, RGB24_0_FORMAT};
+ // samples are from https://samples.mplayerhq.hu/V-codecs/ZMBV/
#[test]
fn test_zmbv_encoder_8bit() {
let mut dmx_reg = RegisteredDemuxers::new();
tb_den: 0,
flags: 0,
};
- //test_encoding_to_file(&dec_config, &enc_config, enc_params);
- test_encoding_md5(&dec_config, &enc_config, enc_params,
- &[0x50df10e2, 0x606f3268, 0xdd4bc2ff, 0x844e7d87]);
+ let enc_options = &[
+ NAOption { name: "range", value: NAValue::Int(16) },
+ ];
+ //test_encoding_to_file(&dec_config, &enc_config, enc_params, enc_options);
+ test_encoding_md5(&dec_config, &enc_config, enc_params, enc_options,
+ &[0x08615111, 0x6f644a35, 0xa4e28f32, 0x35d2e66c]);
}
#[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,
- &[0x0b4cb528, 0x66c91f6c, 0x1c2187a5, 0x2723a08d]);
+ let enc_options = &[
+ NAOption { name: "range", value: NAValue::Int(16) },
+ ];
+ //test_encoding_to_file(&dec_config, &enc_config, enc_params, enc_options);
+ test_encoding_md5(&dec_config, &enc_config, enc_params, enc_options,
+ &[0x1cff4116, 0x5926d91b, 0x60aac53f, 0x8a22bc7b]);
}
#[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,
- &[0x1a522743, 0x6c320a6e, 0xd08539e1, 0x03fc17ea]);
+ let enc_options = &[
+ NAOption { name: "range", value: NAValue::Int(16) },
+ ];
+ //test_encoding_to_file(&dec_config, &enc_config, enc_params, enc_options);
+ test_encoding_md5(&dec_config, &enc_config, enc_params, enc_options,
+ &[0xb48aa633, 0x673539fe, 0xa312d45a, 0x76eee134]);
}
#[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,
- &[0x3880e045, 0xe6c88dc7, 0x21066058, 0xc789f1e9]);
+ let enc_options = &[
+ NAOption { name: "range", value: NAValue::Int(16) },
+ ];
+ //test_encoding_to_file(&dec_config, &enc_config, enc_params, enc_options);
+ test_encoding_md5(&dec_config, &enc_config, enc_params, enc_options,
+ &[0x0836152c, 0xfcd7e1fc, 0xf1e2f619, 0x874d3dbc]);
}
}