From: Kostya Shishkov Date: Sun, 17 Aug 2025 16:33:26 +0000 (+0200) Subject: nihav_duck: switch to ByteIO X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=b34f222d7f4f0d12144c16184758a8fcaf8caba3;p=nihav.git nihav_duck: switch to ByteIO --- diff --git a/nihav-duck/src/codecs/dkadpcm.rs b/nihav-duck/src/codecs/dkadpcm.rs index 5de91d5..695b8ff 100644 --- a/nihav-duck/src/codecs/dkadpcm.rs +++ b/nihav-duck/src/codecs/dkadpcm.rs @@ -58,8 +58,7 @@ impl NADecoder for DuckADPCMDecoder { let dst = adata.get_data_mut().unwrap(); for blk in pktbuf.chunks_exact(self.block_len) { - let mut mr = MemoryReader::new_read(blk); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(blk); if self.is_dk3 { let _typeid = br.read_byte()?; let _version = br.read_byte()?; diff --git a/nihav-duck/src/codecs/truemotion1.rs b/nihav-duck/src/codecs/truemotion1.rs index 1eb880f..a5fec85 100644 --- a/nihav-duck/src/codecs/truemotion1.rs +++ b/nihav-duck/src/codecs/truemotion1.rs @@ -519,8 +519,7 @@ impl NADecoder for TM1Decoder { for i in 1..hdr_size { hdr[i - 1] = src[i] ^ src[i + 1]; } - let mut mr = MemoryReader::new_read(&hdr[0..hdr_size-1]); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(&hdr[0..hdr_size-1]); let tm1type = br.read_byte()? as usize; let delta_set = br.read_byte()? as usize; diff --git a/nihav-duck/src/codecs/truemotion1enc.rs b/nihav-duck/src/codecs/truemotion1enc.rs index ec97b0d..2ebd567 100644 --- a/nihav-duck/src/codecs/truemotion1enc.rs +++ b/nihav-duck/src/codecs/truemotion1enc.rs @@ -639,8 +639,7 @@ impl NAEncoder for TM1Encoder { } let mut dbuf = Vec::with_capacity(4); - let mut gw = GrowableMemoryWriter::new_write(&mut dbuf); - let mut bw = ByteWriter::new(&mut gw); + let mut bw = GrowableMemoryWriter::new_write(&mut dbuf); self.tm1type = match (self.is16, self.block_mode) { (true, BlockMode::FourByFour) => 2, diff --git a/nihav-duck/src/codecs/truemotion2.rs b/nihav-duck/src/codecs/truemotion2.rs index 281b7b7..1bdb0dd 100644 --- a/nihav-duck/src/codecs/truemotion2.rs +++ b/nihav-duck/src/codecs/truemotion2.rs @@ -38,7 +38,7 @@ trait ReadLenEsc { const TM2_ESCAPE: usize = 0x80000000; -impl<'a> ReadLenEsc for ByteReader<'a> { +impl ReadLenEsc for T { fn read_len_esc(&mut self) -> DecoderResult { let len = self.read_u32le()? as usize; if len == TM2_ESCAPE { @@ -102,7 +102,7 @@ impl Default for TM2Stream { } impl TM2Stream { - fn read_header(&mut self, src: &[u8], br: &mut ByteReader) -> DecoderResult<()> { + fn read_header(&mut self, src: &[u8], br: &mut dyn ByteIO) -> DecoderResult<()> { self.tokens.clear(); self.pos = 0; @@ -546,8 +546,7 @@ impl NADecoder for TM2Decoder { fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult { let src = pkt.get_buffer(); validate!(src.len() >= 40 + (TM2StreamType::Num as usize) * 4 + 4); - let mut mr = MemoryReader::new_read(&src); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(&src); let magic = br.read_u32be()?; validate!(magic == 0x100 || magic == 0x101); diff --git a/nihav-duck/src/codecs/truemotion2x.rs b/nihav-duck/src/codecs/truemotion2x.rs index 3e57b55..be776ef 100644 --- a/nihav-duck/src/codecs/truemotion2x.rs +++ b/nihav-duck/src/codecs/truemotion2x.rs @@ -39,13 +39,13 @@ struct Deltas { } impl Deltas { - fn reset(&mut self, br: &mut ByteReader) -> DecoderResult<()> { + fn reset(&mut self, br: &mut dyn ByteIO) -> DecoderResult<()> { let b = br.read_byte()? as usize; self.vq_idx = b; self.vq_pos = 0; Ok(()) } - fn get_val(&mut self, br: &mut ByteReader) -> DecoderResult { + fn get_val(&mut self, br: &mut dyn ByteIO) -> DecoderResult { if self.vq_idx > self.codebook.len() { return Err(DecoderError::ShortData); } let ret = self.codebook[self.vq_idx][self.vq_pos]; self.vq_pos += 1; @@ -66,7 +66,7 @@ impl Deltas { -1 - hval } } - fn get_int(&mut self, br: &mut ByteReader) -> DecoderResult { + fn get_int(&mut self, br: &mut dyn ByteIO) -> DecoderResult { let b = self.get_val(br)?; if b != self.vq_esc - 1 { return Ok(Self::remap(u16::from(b))); @@ -91,11 +91,11 @@ impl Deltas { } Ok(Self::remap(val)) } - fn get_dy(&mut self, br: &mut ByteReader) -> DecoderResult { + fn get_dy(&mut self, br: &mut dyn ByteIO) -> DecoderResult { let b = self.get_val(br)?; Ok(self.tabs[1][b as usize]) } - fn get_dc(&mut self, br: &mut ByteReader) -> DecoderResult { + fn get_dc(&mut self, br: &mut dyn ByteIO) -> DecoderResult { let b = self.get_val(br)?; Ok(self.tabs[0][b as usize]) } @@ -202,8 +202,7 @@ impl TM2XDecoder { fn parse_init(&mut self, version: u8) -> DecoderResult<()> { self.version = version; - let mut mr = MemoryReader::new_read(&self.dec_buf); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(&self.dec_buf); if version > 4 { let _smth = br.read_u32be()?; } @@ -231,8 +230,7 @@ impl TM2XDecoder { Ok(()) } fn parse_tabs(&mut self) -> DecoderResult<()> { - let mut mr = MemoryReader::new_read(&self.dec_buf); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(&self.dec_buf); let idx = br.read_byte()? as usize; validate!(idx < self.deltas.tabs.len()); @@ -245,8 +243,7 @@ impl TM2XDecoder { Ok(()) } fn parse_cb_desc(&mut self, version: u8) -> DecoderResult<()> { - let mut mr = MemoryReader::new_read(&self.dec_buf); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(&self.dec_buf); if version == 0x0A { self.deltas.vq_esc = br.read_byte()?; @@ -278,8 +275,7 @@ impl TM2XDecoder { #[allow(clippy::cognitive_complexity)] #[allow(clippy::identity_op)] fn decode_frame(&mut self, src: &[u8]) -> DecoderResult<()> { - let mut mr = MemoryReader::new_read(src); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(src); self.deltas.reset(&mut br)?; let bw = self.width / 8; @@ -578,8 +574,7 @@ impl NADecoder for TM2XDecoder { fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult { let src = pkt.get_buffer(); validate!(src.len() > 8); - let mut mr = MemoryReader::new_read(&src); - let mut br = ByteReader::new(&mut mr); + let mut br = MemoryReader::new_read(&src); let mut dec = Decryptor::default(); let mut initialised = false; diff --git a/nihav-duck/src/codecs/truemotionrtenc.rs b/nihav-duck/src/codecs/truemotionrtenc.rs index f2cfd5d..da02ba8 100644 --- a/nihav-duck/src/codecs/truemotionrtenc.rs +++ b/nihav-duck/src/codecs/truemotionrtenc.rs @@ -213,8 +213,7 @@ impl NAEncoder for TMRTEncoder { let buf = frm.get_buffer(); if let Some(ref vbuf) = buf.get_vbuf() { let mut dbuf = Vec::with_capacity(4); - let mut gw = GrowableMemoryWriter::new_write(&mut dbuf); - let mut bw = ByteWriter::new(&mut gw); + let mut bw = GrowableMemoryWriter::new_write(&mut dbuf); bw.write_byte(0)?; // header size bw.write_byte(17)?; diff --git a/nihav-duck/src/codecs/vp6enc/coder.rs b/nihav-duck/src/codecs/vp6enc/coder.rs index 1fc6659..b1b0266 100644 --- a/nihav-duck/src/codecs/vp6enc/coder.rs +++ b/nihav-duck/src/codecs/vp6enc/coder.rs @@ -120,7 +120,7 @@ pub trait EncoderTrait { fn write_zero_run(&mut self, val: usize, probs: &[u8; 14]) -> EncoderResult<()>; } -impl<'a, 'b> EncoderTrait for BoolEncoder<'a, 'b> { +impl<'a> EncoderTrait for BoolEncoder<'a> { fn write_cat(&mut self, cat: i8, tree: &[TokenSeq], tok_probs: &[u8], val_probs: &[u8; 11]) -> EncoderResult<()> { for entry in tree.iter() { if entry.val == cat { diff --git a/nihav-duck/src/codecs/vp6enc/huff.rs b/nihav-duck/src/codecs/vp6enc/huff.rs index 43b6d65..7dcf387 100644 --- a/nihav-duck/src/codecs/vp6enc/huff.rs +++ b/nihav-duck/src/codecs/vp6enc/huff.rs @@ -18,14 +18,14 @@ impl HuffState { pub const MAX_EOB_RUN: usize = 63 + 10; -pub struct HuffEncoder<'a, 'b> { - bw: &'a mut ByteWriter<'b>, +pub struct HuffEncoder<'a> { + bw: &'a mut dyn ByteIO, bitbuf: u32, bits: u8, } -impl<'a, 'b> HuffEncoder<'a, 'b> { - pub fn new(bw: &'a mut ByteWriter<'b>) -> Self { +impl<'a> HuffEncoder<'a> { + pub fn new(bw: &'a mut dyn ByteIO) -> Self { Self { bitbuf: 0, bits: 0, diff --git a/nihav-duck/src/codecs/vp6enc/mod.rs b/nihav-duck/src/codecs/vp6enc/mod.rs index 4c18d54..6c5cfdc 100644 --- a/nihav-duck/src/codecs/vp6enc/mod.rs +++ b/nihav-duck/src/codecs/vp6enc/mod.rs @@ -22,9 +22,9 @@ mod rdo; const VERSION_VP61: u8 = VERSION_VP60 + 1; -enum VP6Writer<'a, 'b> { - BoolCoder(BoolEncoder<'a, 'b>), - Huffman(HuffEncoder<'a, 'b>), +enum VP6Writer<'a> { + BoolCoder(BoolEncoder<'a>), + Huffman(HuffEncoder<'a>), } #[derive(Default)] @@ -407,7 +407,7 @@ impl VP6Encoder { } } } - fn encode_intra(&mut self, bw: &mut ByteWriter, quant: usize) -> EncoderResult { + fn encode_intra(&mut self, bw: &mut dyn ByteIO, quant: usize) -> EncoderResult { self.models.reset(false); self.models.reset_mbtype_models(); self.stats.reset(); @@ -462,7 +462,7 @@ impl VP6Encoder { self.encode_coeffs(writer)?; Ok(true) } - fn encode_inter(&mut self, bw: &mut ByteWriter, quant: usize) -> EncoderResult { + fn encode_inter(&mut self, bw: &mut dyn ByteIO, quant: usize) -> EncoderResult { self.stats.reset(); let multistream = self.huffman || self.version != VERSION_VP60; @@ -484,7 +484,7 @@ impl VP6Encoder { Ok(golden_frame) } - fn write_inter_frame(&mut self, bw: &mut ByteWriter, quant: usize, multistream: bool, loop_filter: bool, golden_frame: bool) -> EncoderResult<()> { + fn write_inter_frame(&mut self, bw: &mut dyn ByteIO, quant: usize, multistream: bool, loop_filter: bool, golden_frame: bool) -> EncoderResult<()> { self.estimate_blocks(false); self.stats.generate(&mut self.models, false); @@ -566,7 +566,7 @@ impl VP6Encoder { Ok(()) } - fn encode_inter_fast(&mut self, bw: &mut ByteWriter, quant: usize) -> EncoderResult { + fn encode_inter_fast(&mut self, bw: &mut dyn ByteIO, quant: usize) -> EncoderResult { self.stats.reset(); let multistream = self.huffman || self.version != VERSION_VP60; @@ -721,8 +721,7 @@ impl NAEncoder for VP6Encoder { let buf = frm.get_buffer(); if let Some(ref vbuf) = buf.get_vbuf() { let mut dbuf = Vec::with_capacity(4); - let mut gw = GrowableMemoryWriter::new_write(&mut dbuf); - let mut bw = ByteWriter::new(&mut gw); + let mut bw = GrowableMemoryWriter::new_write(&mut dbuf); // todo integrate with rate control let is_intra = (self.frmcount == 0) || self.decide_encoding(); diff --git a/nihav-duck/src/codecs/vp7enc/coder.rs b/nihav-duck/src/codecs/vp7enc/coder.rs index f8664b5..a2cd433 100644 --- a/nihav-duck/src/codecs/vp7enc/coder.rs +++ b/nihav-duck/src/codecs/vp7enc/coder.rs @@ -112,7 +112,7 @@ pub trait VP7BoolEncoder { fn encode_mb_type(&mut self, is_intra: bool, mb_type: &MBType, models: &VP7Models) -> EncoderResult<()>; } -impl<'a, 'b> VP7BoolEncoder for BoolEncoder<'a, 'b> { +impl<'a> VP7BoolEncoder for BoolEncoder<'a> { fn put_byte(&mut self, val: u8) -> EncoderResult<()> { self.put_bits(u32::from(val), 8) } diff --git a/nihav-duck/src/codecs/vp7enc/mod.rs b/nihav-duck/src/codecs/vp7enc/mod.rs index e3f6bec..f5257e4 100644 --- a/nihav-duck/src/codecs/vp7enc/mod.rs +++ b/nihav-duck/src/codecs/vp7enc/mod.rs @@ -102,8 +102,7 @@ impl VP7Encoder { self.fenc.load_frame(vbuf); let mut dbuf = Vec::with_capacity(4); - let mut gw = GrowableMemoryWriter::new_write(&mut dbuf); - let mut bw = ByteWriter::new(&mut gw); + let mut bw = GrowableMemoryWriter::new_write(&mut dbuf); let is_intra = self.frmcount == 0; let golden_frame = is_intra; diff --git a/nihav-duck/src/codecs/vpenc/coder.rs b/nihav-duck/src/codecs/vpenc/coder.rs index d6715fa..1e1a348 100644 --- a/nihav-duck/src/codecs/vpenc/coder.rs +++ b/nihav-duck/src/codecs/vpenc/coder.rs @@ -33,8 +33,8 @@ macro_rules! bit_seq { }; } -pub struct BoolEncoder<'a, 'b> { - bw: &'a mut ByteWriter<'b>, +pub struct BoolEncoder<'a> { + bw: &'a mut dyn ByteIO, val: u32, range: u32, bits: u8, @@ -42,8 +42,8 @@ pub struct BoolEncoder<'a, 'b> { run: usize, } -impl<'a, 'b> BoolEncoder<'a, 'b> { - pub fn new(bw: &'a mut ByteWriter<'b>) -> Self { +impl<'a> BoolEncoder<'a> { + pub fn new(bw: &'a mut dyn ByteIO) -> Self { Self { bw, val: 0, diff --git a/nihav-duck/src/demuxers/ivf.rs b/nihav-duck/src/demuxers/ivf.rs index 1ed7bfe..9824612 100644 --- a/nihav-duck/src/demuxers/ivf.rs +++ b/nihav-duck/src/demuxers/ivf.rs @@ -1,13 +1,13 @@ use nihav_core::demuxers::*; struct IVFDemuxer<'a> { - src: &'a mut ByteReader<'a>, + src: &'a mut dyn ByteIO, nframes: u32, frameno: u32, } impl<'a> IVFDemuxer<'a> { - fn new(src: &'a mut ByteReader<'a>) -> Self { + fn new(src: &'a mut dyn ByteIO) -> Self { IVFDemuxer { src, nframes: 0, @@ -83,7 +83,7 @@ impl<'a> NAOptionHandler for IVFDemuxer<'a> { pub struct IVFDemuxerCreator { } impl DemuxerCreator for IVFDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut dyn ByteIO) -> Box + 'a> { Box::new(IVFDemuxer::new(br)) } fn get_name(&self) -> &'static str { "dkivf" } @@ -98,8 +98,7 @@ mod test { fn test_ivf_demux() { // sample is from the official VP8 test bitstream set let mut file = File::open("assets/Duck/VP8/vp80-00-comprehensive-001.ivf").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); + let mut br = FileReader::new_read(&mut file); let mut dmx = IVFDemuxer::new(&mut br); let mut sm = StreamManager::new(); let mut si = SeekIndex::new();