aboutsummaryrefslogtreecommitdiff
path: root/lvc/src/main.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-03-07 08:00:00 +0100
committermetamuffin <metamuffin@disroot.org>2023-03-07 08:00:00 +0100
commit2167abcf72d978b4ac2f08fa7cbbddaada01f165 (patch)
tree3f384b868333271ba8e47ed583bae0a6af62b3fb /lvc/src/main.rs
parent200f8064e1b1b96acc7d4a6f0f8321b2da5c2830 (diff)
downloadvideo-codec-experiments-2167abcf72d978b4ac2f08fa7cbbddaada01f165.tar
video-codec-experiments-2167abcf72d978b4ac2f08fa7cbbddaada01f165.tar.bz2
video-codec-experiments-2167abcf72d978b4ac2f08fa7cbbddaada01f165.tar.zst
a
Diffstat (limited to 'lvc/src/main.rs')
-rw-r--r--lvc/src/main.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/lvc/src/main.rs b/lvc/src/main.rs
new file mode 100644
index 0000000..523f22c
--- /dev/null
+++ b/lvc/src/main.rs
@@ -0,0 +1,72 @@
+use lvc::{diff::{diff, fast_diff}, Frame, Pixel, Ref, View, P2, PixelValue};
+use std::{
+ io::{stdin, stdout, BufReader, BufWriter, Read, Write},
+ time::Instant,
+};
+
+fn main() {
+ let size = P2 { x: 1920, y: 1080 };
+
+ // let frame1 = read_frame(size);
+ // let frame2 = read_frame(size);
+
+ // encode(&frame1, &frame2, View::all(size));
+
+ let mut last_frame = Frame {
+ pixels: vec![Pixel::default(); size.area()],
+ size,
+ };
+
+ let mut stdin = BufReader::new(stdin());
+ let mut stdout = BufWriter::new(stdout());
+
+ loop {
+ let frame = read_frame(&mut stdin, size);
+
+ let t1 = Instant::now();
+ let d = diff([&last_frame, &frame], View::all(size), Ref::default());
+ let t2 = Instant::now();
+ eprintln!("diff {:?} {d}", t2 - t1);
+
+ let t1 = Instant::now();
+ let d = fast_diff([&last_frame, &frame], View::all(size), Ref::default());
+ let t2 = Instant::now();
+ eprintln!("diff2 {:?} {d}", t2 - t1);
+
+ write_frame(&mut stdout, &frame);
+ last_frame = frame;
+ }
+}
+
+fn read_frame(inp: &mut impl Read, size: P2) -> Frame {
+ let mut f = Frame {
+ size,
+ pixels: vec![Pixel::default(); size.area()],
+ };
+
+ for y in 0..size.y {
+ for x in 0..size.x {
+ let mut cc = [0u8; 3];
+ inp.read_exact(&mut cc).unwrap();
+ f[P2 { x, y }] = Pixel {
+ r: cc[0] as PixelValue,
+ g: cc[1] as PixelValue,
+ b: cc[2] as PixelValue,
+ };
+ }
+ }
+ f
+}
+
+fn write_frame(out: &mut impl Write, frame: &Frame) {
+ for y in 0..frame.size.y {
+ for x in 0..frame.size.x {
+ let p = frame[P2 { x, y }];
+ let mut cc = [0u8; 3];
+ cc[0] = p.r as u8;
+ cc[1] = p.g as u8;
+ cc[2] = p.b as u8;
+ out.write_all(&mut cc).unwrap();
+ }
+ }
+}