use anyhow::Context; use clap::Parser; use evc::{ codec::{ decode::decode_block, encode::{encode_block, EncodeConfig, EncodeMode}, }, format::{header::Header, ser::Sink}, frame::Frame, helpers::vector::Vec2, }; use log::info; use std::io::{BufReader, BufWriter}; #[derive(Parser)] #[clap(about, version)] pub struct EncodeArgs { #[arg(short = 'W', long)] width: usize, #[arg(short = 'H', long)] height: usize, #[arg(short, long, default_value = "advanced")] mode: EncodeMode, #[arg(short, long, default_value = "8")] jobs: usize, #[arg(short = 't', long, default_value = "1.5")] ref_thres: f64, #[arg(short = 'T', long)] no_translation: bool, } fn main() -> anyhow::Result<()> { env_logger::init_from_env("LOG"); let args = EncodeArgs::parse(); let mut input = BufReader::new(std::io::stdin()); let mut output = BufWriter::new(std::io::stdout()); let config = EncodeConfig { mode: evc::codec::encode::EncodeMode::Advanced, ref_thres: 500.0, max_diff_area: 10_000, min_block_size: 8, max_threads: args.jobs, }; let size = Vec2 { x: args.width as isize, y: args.height as isize, }; output .put(Header { resolution: size, frame_count: 0, }) .context("writing header")?; let mut prev_frame = Frame::new(size); for i in 0.. { info!("encode frame {i}"); let mut frame = Frame::read(&mut input, size) .context("reading raw frame") .unwrap(); let v1 = frame.view(); let v2 = prev_frame.view(); let root = encode_block(v1, v2, &config); root.write(&mut output).context("writing encoded frame")?; decode_block(&root, frame.view_mut(), prev_frame.view()); prev_frame = frame; } Ok(()) }