diff options
Diffstat (limited to 'evc/src/codec/encode.rs')
-rw-r--r-- | evc/src/codec/encode.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/evc/src/codec/encode.rs b/evc/src/codec/encode.rs new file mode 100644 index 0000000..cf407fa --- /dev/null +++ b/evc/src/codec/encode.rs @@ -0,0 +1,34 @@ +use crate::{ + block::{Block, BlockInner}, + frame::Frame, + view::View, +}; + +pub 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, + } +} |