aboutsummaryrefslogtreecommitdiff
path: root/evc/src/bin/encode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'evc/src/bin/encode.rs')
-rw-r--r--evc/src/bin/encode.rs40
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,
- }
-}