From 306f96164784a8cbf405e72fa4364d6523366e95 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 5 May 2025 15:09:54 +0200 Subject: old dir --- old/evc/src/bin/decode.rs | 63 ++++++++++++++++++++++++++ old/evc/src/bin/encode.rs | 111 ++++++++++++++++++++++++++++++++++++++++++++++ old/evc/src/bin/info.rs | 10 +++++ 3 files changed, 184 insertions(+) create mode 100644 old/evc/src/bin/decode.rs create mode 100644 old/evc/src/bin/encode.rs create mode 100644 old/evc/src/bin/info.rs (limited to 'old/evc/src/bin') diff --git a/old/evc/src/bin/decode.rs b/old/evc/src/bin/decode.rs new file mode 100644 index 0000000..fbf5624 --- /dev/null +++ b/old/evc/src/bin/decode.rs @@ -0,0 +1,63 @@ +#![feature(box_patterns)] +use anyhow::Context; +use clap::Parser; +use indicatif::ProgressBar; +use libreschmux::{ + block::Block, + codec::decode::{decode_block, DecodeConfig}, + debug::draw_debug, + format::{header::Header, ser::Source}, + frame::Frame, +}; +use log::{info, warn}; +use std::io::{BufReader, BufWriter}; + +#[derive(Parser)] +#[clap(about, version)] +pub struct DecodeArgs { + #[arg(long)] + debug: bool, +} + +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:?}"); + if header.resolution.x * header.resolution.y > 100_000_000 { + warn!("resolution is quite big. video is likely corrupt."); + } + let size = header.resolution; + + let config = DecodeConfig {}; + + let progress_bar = ProgressBar::new(header.frame_count as u64); + + let mut prev = Frame::new(size); + for i in 0..header.frame_count { + 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); + + progress_bar.inc(1); + + 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(()) +} diff --git a/old/evc/src/bin/encode.rs b/old/evc/src/bin/encode.rs new file mode 100644 index 0000000..43f2c57 --- /dev/null +++ b/old/evc/src/bin/encode.rs @@ -0,0 +1,111 @@ +use anyhow::Context; +use clap::Parser; +use indicatif::ProgressBar; +use libreschmux::{ + codec::{ + decode::{decode_block, DecodeConfig}, + 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)] + mode: EncodeMode, + + #[arg(long)] + no_linear_transform: bool, + #[arg(long)] + no_value_scale: bool, + #[arg(long)] + no_translate: bool, + + #[arg[short = 'L', long]] + length: Option, + + #[arg(short, long, default_value = "8")] + min_block_size: isize, + + #[arg(short = 't', long, default_value = "200")] + ref_thres: f64, +} + +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: args.mode, + ref_thres: args.ref_thres, + weight_factor: 50.0, + max_diff_area: 10_000, + min_block_size: args.min_block_size, + do_translate: !args.no_translate, + do_linear_transform: !args.no_linear_transform, + do_value_scale: !args.no_value_scale, + }; + + let size = Vec2 { + x: args.width as isize, + y: args.height as isize, + }; + output + .put(Header { + resolution: size, + frame_count: args.length.unwrap_or(usize::MAX), + }) + .context("writing header")?; + + let progress_bar = args.length.map(|len| ProgressBar::new(len as u64)); + 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")?; + + let v1 = frame.view(); + let v2 = prev_frame.view(); + + let (error, root) = encode_block(v1, v2, &config); + + // compress_block( + // &mut root, + // Vec2 { + // x: size.x as usize, + // y: size.y as usize, + // }, + // ); + + root.write(&mut output, size) + .context("writing encoded frame")?; + + info!( + "cumulative error: {error} ({} per pixel)", + error / frame.view().area() as f64 + ); + + if let Some(progress_bar) = &progress_bar { + progress_bar.inc(1); + } + + decode_block(&root, frame.view_mut(), prev_frame.view(), &DecodeConfig {}); + + prev_frame = frame; + } + + Ok(()) +} diff --git a/old/evc/src/bin/info.rs b/old/evc/src/bin/info.rs new file mode 100644 index 0000000..ebd8442 --- /dev/null +++ b/old/evc/src/bin/info.rs @@ -0,0 +1,10 @@ +use anyhow::Context; +use libreschmux::format::{header::Header, ser::Source}; +use std::io::BufReader; + +fn main() { + env_logger::init_from_env("LOG"); + let mut input = BufReader::new(std::io::stdin()); + let header = input.get::
().context("reading header").unwrap(); + eprintln!("{header:#?}") +} -- cgit v1.2.3-70-g09d2