From bafb1df8b7764a0a62f1c656eb52fbe7bfd8b8ac Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 6 Dec 2022 07:47:51 +0100 Subject: decoder --- evc/src/bin/decode.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ evc/src/bin/encode.rs | 13 +++++++---- 2 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 evc/src/bin/decode.rs (limited to 'evc/src/bin') diff --git a/evc/src/bin/decode.rs b/evc/src/bin/decode.rs new file mode 100644 index 0000000..293181a --- /dev/null +++ b/evc/src/bin/decode.rs @@ -0,0 +1,60 @@ +#![feature(box_patterns)] +use std::io::{self, BufReader, BufWriter}; + +use clap::Parser; +use evc::{ + block::{Block, BlockInner}, + frame::Frame, + header::Header, + ser::Source, + view::View, +}; + +#[derive(Parser)] +#[clap(about, version)] +pub struct DecodeArgs {} + +fn main() -> io::Result<()> { + let _args = DecodeArgs::parse(); + + let mut input = BufReader::new(std::io::stdin()); + let mut output = BufWriter::new(std::io::stdout()); + + let header = input.get::
()?; + eprintln!("{header:?}"); + let size = header.resolution; + + let mut prev = Frame::new(size); + loop { + let block = Block::read(&mut input, size)?; + let mut frame = Frame::new(size); + + blit_block( + &block, + frame.view_mut((0, 0), size), + prev.view((0, 0), size), + ); + + frame.write(&mut output)?; + prev = frame; + } +} + +fn blit_block(block: &Block, mut target: View<&mut Frame>, prev: View<&Frame>) { + match &block.inner { + BlockInner::Literal(pixels) => { + for x in 0..block.size.0 { + for y in 0..block.size.1 { + target[(x, y)] = pixels[x + y * block.size.0] + } + } + } + BlockInner::Split(box [a, b]) => { + let [at, bt] = target.split_mut_unsafe(); + let [ap, bp] = prev.split(); + blit_block(a, at, ap); + blit_block(b, bt, bp); + } + BlockInner::Reference { translation: _ } => target.copy_from(&prev), + } +} diff --git a/evc/src/bin/encode.rs b/evc/src/bin/encode.rs index 04b7c42..c426aba 100644 --- a/evc/src/bin/encode.rs +++ b/evc/src/bin/encode.rs @@ -2,6 +2,7 @@ use clap::Parser; use evc::{ block::{Block, BlockInner}, frame::Frame, + header::Header, ser::Sink, view::View, }; @@ -23,6 +24,10 @@ fn main() -> io::Result<()> { 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.. { @@ -41,10 +46,10 @@ fn main() -> io::Result<()> { Ok(()) } -fn encode_block(view: View, prev: View) -> Block { - let diff = View::diff(&view, &prev); - - let inner = if diff < 10_000.0 { +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), } -- cgit v1.2.3-70-g09d2