diff options
Diffstat (limited to 'lvc/codec/src/decode.rs')
-rw-r--r-- | lvc/codec/src/decode.rs | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/lvc/codec/src/decode.rs b/lvc/codec/src/decode.rs index 4830156..616b7af 100644 --- a/lvc/codec/src/decode.rs +++ b/lvc/codec/src/decode.rs @@ -1,38 +1,54 @@ -use crate::{debug::draw_debug, huff::read_huff, split::split, Block, Frame, Pixel, View, P2}; -use rayon::join; +use crate::{ + debug::draw_debug, huff::read_huff, impls::join, split::split, Block, Frame, View, P2, +}; use std::io::{BufReader, BufWriter, Read, Result, Write}; pub fn decode(size: P2, debug: bool, input: impl Read, output: impl Write) -> Result<()> { let mut input = BufReader::new(input); let mut output = BufWriter::new(output); + let mut d = Decoder::new(size); + let mut f = Frame::new(size); + loop { + d.decode_frame(&mut input, &mut f, debug)?; + Frame::write(&mut output, &f)?; + } +} - let mut frame = Frame::new(size); - let mut last_frame = Frame::new(size); - let mut debug_frame = if debug { Some(Frame::new(size)) } else { None }; +pub struct Decoder { + last_frame: Frame, + size: P2, +} - let huff = true; - loop { +impl Decoder { + pub fn new(size: P2) -> Self { + Self { + size, + last_frame: Frame::new(size), + } + } + pub fn decode_frame( + &mut self, + mut input: impl Read, + output: &mut Frame, + debug: bool, + ) -> Result<()> { + let huff = true; let b = if huff { let mut buf = vec![]; read_huff(&mut input, &mut buf)?; + eprintln!("{}", buf.len()); let mut buf = std::io::Cursor::new(&mut buf); - Block::read(&mut buf, View::all(size))? + Block::read(&mut buf, View::all(self.size))? } else { - Block::read(&mut input, View::all(size))? + Block::read(&mut input, View::all(self.size))? }; - decode_block(&last_frame, &mut frame, View::all(size), &b); - - if let Some(debug_frame) = &mut debug_frame { - debug_frame.pixels.copy_from_slice(&frame.pixels); - draw_debug(debug_frame, View::all(size), &b); - Frame::write(&mut output, &debug_frame)?; - } else { - Frame::write(&mut output, &frame)?; + decode_block(&self.last_frame, output, View::all(self.size), &b); + self.last_frame.pixels.copy_from_slice(&output.pixels); // TODO use mem::swap + if debug { + draw_debug(output, View::all(self.size), &b); } - - last_frame.pixels.copy_from_slice(&frame.pixels); // TODO use mem::swap - frame.pixels.iter_mut().for_each(|e| *e = Pixel::BLACK); + Ok(()) } } |