diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-05 15:09:54 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-05 15:09:54 +0200 |
commit | 306f96164784a8cbf405e72fa4364d6523366e95 (patch) | |
tree | 51717fc139871baa438aad806f4923669ae0896c /old/evc/src/bin/decode.rs | |
parent | 9cc089e2d6e841879e430b01d2f3d92c8820523e (diff) | |
download | video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar.bz2 video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar.zst |
old dir
Diffstat (limited to 'old/evc/src/bin/decode.rs')
-rw-r--r-- | old/evc/src/bin/decode.rs | 63 |
1 files changed, 63 insertions, 0 deletions
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::<Header>().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(()) +} |