aboutsummaryrefslogtreecommitdiff
path: root/lvc/src/bin/main.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-03-09 09:07:34 +0100
committermetamuffin <metamuffin@disroot.org>2023-03-09 09:07:34 +0100
commitecb81ba6448d6e33a9e7ecd3cd5d41513713f814 (patch)
tree05e80cd4c995958815a2e4b1b4421e759b9a6e7f /lvc/src/bin/main.rs
parent2d61333ed37b2d9fd940291ee8b1f5dc68c65591 (diff)
downloadvideo-codec-experiments-ecb81ba6448d6e33a9e7ecd3cd5d41513713f814.tar
video-codec-experiments-ecb81ba6448d6e33a9e7ecd3cd5d41513713f814.tar.bz2
video-codec-experiments-ecb81ba6448d6e33a9e7ecd3cd5d41513713f814.tar.zst
fixing huff 1/2
Diffstat (limited to 'lvc/src/bin/main.rs')
-rw-r--r--lvc/src/bin/main.rs118
1 files changed, 64 insertions, 54 deletions
diff --git a/lvc/src/bin/main.rs b/lvc/src/bin/main.rs
index e579f72..7c0d965 100644
--- a/lvc/src/bin/main.rs
+++ b/lvc/src/bin/main.rs
@@ -3,7 +3,7 @@ use lvc::{
debug::draw_debug,
decode::decode,
encode::{encode, EncodeConfig},
- huff::{read_huffman, write_huffman},
+ huff::{read_huff, write_huff},
Block, Frame, Pixel, PixelValue, View, P2,
};
use std::{
@@ -50,38 +50,6 @@ fn main() {
y: args.height as i32,
};
match args.action {
- Action::Decode { debug } => {
- 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 };
-
- let mut stdin = BufReader::new(stdin());
- let mut stdout = BufWriter::new(stdout());
-
- loop {
- let mut buf = vec![];
- read_huffman(&mut stdin, &mut buf).unwrap();
-
- eprintln!("{:?}", &buf[..20]);
- let b = {
- let mut buf = std::io::Cursor::new(&mut buf);
- Block::read(&mut buf, View::all(size)).unwrap()
- };
-
- decode(&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);
- write_frame(&mut stdout, &debug_frame);
- } else {
- write_frame(&mut stdout, &frame);
- }
-
- last_frame.pixels.copy_from_slice(&frame.pixels); // TODO use mem::swap
- frame.pixels.iter_mut().for_each(|e| *e = Pixel::BLACK);
- }
- }
Action::Encode {
max_block_size,
threshold,
@@ -92,12 +60,13 @@ fn main() {
max_block_size,
iters,
};
-
let mut last_frame = Frame::new(size);
let mut stdin = BufReader::new(stdin());
let mut stdout = BufWriter::new(stdout());
+ let huff = true;
+
for frame_number in 0.. {
let mut frame = read_frame(&mut stdin, size);
@@ -110,27 +79,68 @@ fn main() {
last_frame = frame;
let time_decode = t.elapsed();
- let mut buf = vec![];
- let mut bufw = std::io::Cursor::new(&mut buf);
- b.write(&mut bufw).unwrap();
- drop(bufw);
- let t = Instant::now();
- let bits_raw = buf.len() * 8;
- // eprintln!("{:?}", &buf[..20]);
- let bits_huff = write_huffman(&buf, &mut stdout).unwrap();
- let time_huff = t.elapsed();
- drop(buf);
+ if huff {
+ let mut buf = vec![];
+ let mut bufw = std::io::Cursor::new(&mut buf);
+ b.write(&mut bufw).unwrap();
+ drop(bufw);
+ let t = Instant::now();
+ let bits_raw = buf.len() * 8;
+ let bits_huff = write_huff(&buf, &mut stdout).unwrap();
+ let time_huff = t.elapsed();
+ drop(buf);
- eprintln!(
- "frame {frame_number}: {:?}",
- time_decode + time_huff + time_encode
- );
- eprintln!("\tencode {time_encode:?}");
- eprintln!("\tdecode {time_decode:?}");
- eprintln!(
- "\thuff {time_huff:?} ({}%)",
- ((bits_huff as f32 / bits_raw as f32) * 100.0).round()
- );
+ eprintln!(
+ "frame {frame_number}: {:?}",
+ time_decode + time_huff + time_encode
+ );
+ eprintln!(
+ "\tencode {time_encode:?} ({}%)",
+ ((bits_raw as f32 / (size.area() * 24) as f32) * 100.0).round()
+ );
+ eprintln!(
+ "\thuff {time_huff:?} ({}%)",
+ ((bits_huff as f32 / bits_raw as f32) * 100.0).round()
+ );
+ eprintln!("\tdecode {time_decode:?}");
+ } else {
+ b.write(&mut stdout).unwrap();
+ }
+ }
+ }
+ Action::Decode { debug } => {
+ 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 };
+
+ let mut stdin = BufReader::new(stdin());
+ let mut stdout = BufWriter::new(stdout());
+
+ let huff = true;
+
+ loop {
+
+ let b = if huff {
+ let mut buf = vec![];
+ read_huff(&mut stdin, &mut buf).unwrap();
+ let mut buf = std::io::Cursor::new(&mut buf);
+ Block::read(&mut buf, View::all(size)).unwrap()
+ } else {
+ Block::read(&mut stdin, View::all(size)).unwrap()
+ };
+
+ decode(&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);
+ write_frame(&mut stdout, &debug_frame);
+ } else {
+ write_frame(&mut stdout, &frame);
+ }
+
+ last_frame.pixels.copy_from_slice(&frame.pixels); // TODO use mem::swap
+ frame.pixels.iter_mut().for_each(|e| *e = Pixel::BLACK);
}
}
}