X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fcodecs%2Fzmbvenc.rs;h=0d5c1afa8388e9f66a730290fb008f3cf85cae4d;hb=07972bf3d6de58d3e23e05101cda79482e76ac4c;hp=23e8aadd893bfd45eb3255b313229d6ba8ea186e;hpb=f17870054cf46115cd1eb95176b1767bd874d95c;p=nihav.git diff --git a/nihav-commonfmt/src/codecs/zmbvenc.rs b/nihav-commonfmt/src/codecs/zmbvenc.rs index 23e8aad..0d5c1af 100644 --- a/nihav-commonfmt/src/codecs/zmbvenc.rs +++ b/nihav-commonfmt/src/codecs/zmbvenc.rs @@ -35,6 +35,7 @@ struct ZMBVEncoder { width: usize, height: usize, range: usize, + sent_pal: bool, } fn buf_type_to_bpp(buf: &NABufferType) -> u8 { @@ -134,6 +135,7 @@ impl ZMBVEncoder { width: 0, height: 0, range: 128, + sent_pal: false, } } fn encode_intra(&mut self, bw: &mut ByteWriter, buf: NABufferType) -> EncoderResult<()> { @@ -258,6 +260,8 @@ impl ZMBVEncoder { self.pal = npal; bw.write_byte(2)?; + + self.sent_pal = false; } else { bw.write_byte(0)?; } @@ -361,7 +365,7 @@ impl ZMBVEncoder { bw.write_buf(&self.zbuf)?; } - + Ok(()) } } @@ -400,7 +404,7 @@ impl NAEncoder for ZMBVEncoder { 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); @@ -429,6 +433,21 @@ impl NAEncoder for ZMBVEncoder { 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;