aboutsummaryrefslogtreecommitdiff
path: root/lvc/src/encode.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-03-07 17:15:49 +0100
committermetamuffin <metamuffin@disroot.org>2023-03-07 17:15:49 +0100
commit414990bb53f5c9e2028d42db46fa641fa606cd86 (patch)
tree67424a3b7aec5e0219ecffec0fa7b0849858c8d2 /lvc/src/encode.rs
parent2167abcf72d978b4ac2f08fa7cbbddaada01f165 (diff)
downloadvideo-codec-experiments-414990bb53f5c9e2028d42db46fa641fa606cd86.tar
video-codec-experiments-414990bb53f5c9e2028d42db46fa641fa606cd86.tar.bz2
video-codec-experiments-414990bb53f5c9e2028d42db46fa641fa606cd86.tar.zst
works
Diffstat (limited to 'lvc/src/encode.rs')
-rw-r--r--lvc/src/encode.rs86
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()
+}