use clap::Parser; use evc::{ block::{Block, BlockInner}, frame::Frame, ser::Sink, view::View, }; use std::io::{self, BufReader, BufWriter}; #[derive(Parser)] #[clap(about, version)] pub struct EncodeArgs { #[arg(short = 'W', long)] width: usize, #[arg(short = 'H', long)] height: usize, } fn main() -> io::Result<()> { let args = EncodeArgs::parse(); let mut input = BufReader::new(std::io::stdin()); let mut output = BufWriter::new(std::io::stdout()); let size = (args.width, args.height); let mut prev_frame = Frame::new(size); for i in 0.. { println!("frame {i}"); let frame = Frame::read(&mut input, size)?; let v1 = frame.view((0, 0), size); let v2 = prev_frame.view((0, 0), size); let root = encode_block(v1, v2); root.write(&mut output)?; prev_frame = frame; } Ok(()) } fn encode_block(view: View, prev: View) -> Block { let diff = View::diff(&view, &prev); let inner = if diff < 10_000.0 { BlockInner::Reference { translation: (0, 0), } } else { if view.size.0 < 32 { BlockInner::Literal(view.pixels()) } else { let [a, b] = view.split(); let [ap, bp] = prev.split(); BlockInner::Split(Box::new([encode_block(a, ap), encode_block(b, bp)])) } }; Block { size: view.size, inner, } }