diff options
author | metamuffin <metamuffin@disroot.org> | 2022-12-08 20:13:27 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-12-08 20:13:27 +0100 |
commit | 1b3835a38ed38d377ce337836a4b32ee89ca0289 (patch) | |
tree | 6e07407031984b989c35c581a10e857ef1f66b07 /evc/src/codec/encode/simple.rs | |
parent | a92c9958a539eccd545b4947202a1c9b39953851 (diff) | |
download | video-codec-experiments-1b3835a38ed38d377ce337836a4b32ee89ca0289.tar video-codec-experiments-1b3835a38ed38d377ce337836a4b32ee89ca0289.tar.bz2 video-codec-experiments-1b3835a38ed38d377ce337836a4b32ee89ca0289.tar.zst |
rename modes
Diffstat (limited to 'evc/src/codec/encode/simple.rs')
-rw-r--r-- | evc/src/codec/encode/simple.rs | 64 |
1 files changed, 64 insertions, 0 deletions
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::<isize>::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::<isize>::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<isize>| { + 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; + } + } +} |