use clap::Parser; use evc::{ block::{Block, BlockInner}, frame::Frame, header::Header, 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); output.put(Header { resolution: size, frame_count: 0, })?; 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<&Frame>, prev: View<&Frame>) -> Block { let diff = View::diff(&view, &prev) / view.area() as f64; eprintln!("{:?} {diff}", view.size); let inner = if diff < 0.5 { 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, } }