#![feature(box_patterns)] use anyhow::Context; use clap::Parser; use evc::{ block::Block, codec::decode::{decode_block, DecodeConfig}, debug::draw_debug, format::{header::Header, ser::Source}, frame::Frame, }; use log::info; use std::io::{BufReader, BufWriter}; #[derive(Parser)] #[clap(about, version)] pub struct DecodeArgs { #[arg(long)] debug: bool, #[arg(short, long, default_value = "8")] jobs: usize, } fn main() -> anyhow::Result<()> { env_logger::init_from_env("LOG"); let args = DecodeArgs::parse(); let mut input = BufReader::new(std::io::stdin()); let mut output = BufWriter::new(std::io::stdout()); let header = input.get::
().context("reading header")?; info!("{header:?}"); let size = header.resolution; let config = DecodeConfig { max_threads: args.jobs, }; let mut prev = Frame::new(size); for i in 0.. { info!("decode frame {i}"); let block = Block::read(&mut input, size).context("reading encoded frame")?; let mut frame = Frame::new(size); decode_block(&block, frame.view_mut(), prev.view(), &config); if args.debug { let mut f2 = frame.clone(); draw_debug(&block, f2.view_mut()); f2.write(&mut output).context("writing raw frame")?; } else { frame.write(&mut output).context("writing raw frame")?; } prev = frame; } drop(input); Ok(()) }