diff options
Diffstat (limited to 'lvc/src/encode.rs')
-rw-r--r-- | lvc/src/encode.rs | 86 |
1 files changed, 44 insertions, 42 deletions
diff --git a/lvc/src/encode.rs b/lvc/src/encode.rs index 7737626..d85ac30 100644 --- a/lvc/src/encode.rs +++ b/lvc/src/encode.rs @@ -1,49 +1,51 @@ use crate::diff::diff; -use crate::{Frame, Ref, View, P2}; +use crate::split::split; +use crate::{Block, Frame, Ref, View}; -pub fn encode(last_frame: &Frame, frame: &Frame, view: View) { - let rp = Ref::default(); +pub fn encode(last_frame: &Frame, frame: &Frame, view: View) -> Block { + if view.size().area() > 1024 { + let [av, bv] = split(view); + return Block::Split([ + Box::new(encode(last_frame, frame, av)), + Box::new(encode(last_frame, frame, bv)), + ]); + } - let d = diff([last_frame, frame], view, rp); -} + let mut rp = Ref::default(); + let mut d = diff([last_frame, frame], view, rp); + + for _ in 0..500 { + let (nd, nrp) = optimize_ref(last_frame, frame, view, rp); + if nd < d { + rp = nrp; + d = nd; + } else { + break; + } + } -pub fn split(view: View) -> [View; 2] { - let s = view.size(); - if s.x > s.y { - let mid_x = (view.a.x + view.b.x) / 2; - [ - View { - a: view.a, - b: P2 { - x: mid_x, - y: view.b.y, - }, - }, - View { - a: P2 { - x: mid_x, - y: view.a.y, - }, - b: view.b, - }, - ] + if d < 10000 { + return Block::Ref(rp); } else { - let mid_y = (view.a.y + view.b.y) / 2; - [ - View { - a: view.a, - b: P2 { - x: view.b.x, - y: mid_y, - }, - }, - View { - a: P2 { - x: view.a.x, - y: mid_y, - }, - b: view.b, - }, - ] + Block::Lit(frame.export(view)) } } + +pub fn optimize_ref(last_frame: &Frame, frame: &Frame, view: View, rp: Ref) -> (u32, Ref) { + [ + rp.apply(|r| r.pos_off.x += 1), + rp.apply(|r| r.pos_off.x -= 1), + rp.apply(|r| r.pos_off.y += 1), + rp.apply(|r| r.pos_off.y -= 1), + rp.apply(|r| r.color_off.r += 10), + rp.apply(|r| r.color_off.r -= 10), + rp.apply(|r| r.color_off.g += 10), + rp.apply(|r| r.color_off.g -= 10), + rp.apply(|r| r.color_off.b += 10), + rp.apply(|r| r.color_off.b -= 10), + ] + .map(|p| (diff([last_frame, frame], view, p), p)) + .into_iter() + .min_by_key(|x| x.0) + .unwrap() +} |