From 1b3835a38ed38d377ce337836a4b32ee89ca0289 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 8 Dec 2022 20:13:27 +0100 Subject: rename modes --- evc/src/codec/encode/simple.rs | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 evc/src/codec/encode/simple.rs (limited to 'evc/src/codec/encode/simple.rs') diff --git a/evc/src/codec/encode/simple.rs b/evc/src/codec/encode/simple.rs new file mode 100644 index 0000000..8ae1abb --- /dev/null +++ b/evc/src/codec/encode/simple.rs @@ -0,0 +1,64 @@ +use crate::{block::Block, frame::Frame, helpers::vector::Vec2, view::View}; + +use super::EncodeConfig; + +pub fn exhaustive( + view: &View<&Frame>, + prev: &View<&Frame>, + _config: &EncodeConfig, + _max_diff: f64, +) -> (f64, Block) { + let mut diff = f64::INFINITY; + let mut translation = Vec2::::ZERO; + const OFFSETS: &[isize] = &[-64, -32, -16, -8, -4, -2, -1, 0, 1, 2, 4, 8, 16, 32, 64]; + for x in OFFSETS { + for y in OFFSETS { + let t = Vec2 { x: *x, y: *y }; + let d = View::diff(&view, &prev.offset(t)); + if d < diff { + translation = t; + diff = d; + } + } + } + (diff, Block::Reference { translation }) +} + +pub fn fast( + view: &View<&Frame>, + prev: &View<&Frame>, + _config: &EncodeConfig, + max_diff: f64, +) -> (f64, Block) { + let mut offset = Vec2::::ZERO; + let mut diff = View::diff(&view, &prev); + if diff < max_diff { + (diff, Block::REFZERO) + } else { + loop { + let (mut d, mut o) = (diff, offset); + let mut probe = |test_o: Vec2| { + let test_d = View::diff(&prev.clone().offset(test_o), &view); + if test_d < d { + d = test_d; + o = test_o; + } + }; + + probe(offset + Vec2 { x: 2, y: 0 }); + probe(offset + Vec2 { x: -2, y: 0 }); + probe(offset + Vec2 { x: 0, y: 2 }); + probe(offset + Vec2 { x: 0, y: -2 }); + probe(offset + Vec2 { x: 1, y: 0 }); + probe(offset + Vec2 { x: -1, y: 0 }); + probe(offset + Vec2 { x: 0, y: 1 }); + probe(offset + Vec2 { x: 0, y: -1 }); + + if d >= diff { + break (diff, Block::Reference { translation: o }); + } + diff = d; + offset = o; + } + } +} -- cgit v1.2.3-70-g09d2