diff options
author | metamuffin <metamuffin@disroot.org> | 2022-12-06 15:52:08 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-12-06 15:52:08 +0100 |
commit | 6a3aaca8727d3f0292d62dbcd54e3bf87df74c0c (patch) | |
tree | d9bc5fe941c49de0885795288e2ef45f88d0a40c /evc/src/bin/encode.rs | |
parent | a5b09a2fc7a2e1ddc5776993373052cd3eda9b51 (diff) | |
download | video-codec-experiments-6a3aaca8727d3f0292d62dbcd54e3bf87df74c0c.tar video-codec-experiments-6a3aaca8727d3f0292d62dbcd54e3bf87df74c0c.tar.bz2 video-codec-experiments-6a3aaca8727d3f0292d62dbcd54e3bf87df74c0c.tar.zst |
split files
Diffstat (limited to 'evc/src/bin/encode.rs')
-rw-r--r-- | evc/src/bin/encode.rs | 40 |
1 files changed, 6 insertions, 34 deletions
diff --git a/evc/src/bin/encode.rs b/evc/src/bin/encode.rs index 3e34a3c..50435e5 100644 --- a/evc/src/bin/encode.rs +++ b/evc/src/bin/encode.rs @@ -1,11 +1,10 @@ use anyhow::Context; use clap::Parser; use evc::{ - block::{Block, BlockInner}, + codec::{decode::decode_block, encode::encode_block}, frame::Frame, header::Header, ser::Sink, - view::View, }; use std::io::{BufReader, BufWriter}; @@ -35,47 +34,20 @@ fn main() -> anyhow::Result<()> { let mut prev_frame = Frame::new(size); for i in 0.. { eprintln!("encode frame {i}"); - let frame = Frame::read(&mut input, size) + let mut frame = Frame::read(&mut input, size) .context("reading raw frame") .unwrap(); - let v1 = frame.view((0, 0), size); - let v2 = prev_frame.view((0, 0), size); + let v1 = frame.view(); + let v2 = prev_frame.view(); let root = encode_block(v1, v2); root.write(&mut output).context("writing encoded frame")?; + decode_block(&root, frame.view_mut(), prev_frame.view()); + prev_frame = frame; } Ok(()) } - -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.9 { - BlockInner::Reference { - translation: (0, 0), - } - } else { - if view.size.0 < 32 { - BlockInner::Literal(view.pixels()) - } else { - let [av, bv] = view.split(); - let [ap, bp] = prev.split(); - let a = encode_block(av, ap); - let b = encode_block(bv, bp); - if a.is_literal() && b.is_literal() { - BlockInner::Literal(view.pixels()) - } else { - BlockInner::Split(Box::new([a, b])) - } - } - }; - - Block { - size: view.size, - inner, - } -} |