aboutsummaryrefslogtreecommitdiff
path: root/evc/src/helpers/pixel.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-08 09:13:17 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-08 09:13:17 +0100
commit6001cdeff335e12583a398acbb5a8a42c01bc077 (patch)
tree4c1c515cbf33e727f5db317880aadd425a1e0b96 /evc/src/helpers/pixel.rs
parent8b7792d6aa27578221fee7cc8be1ceb202602a5a (diff)
downloadvideo-codec-experiments-6001cdeff335e12583a398acbb5a8a42c01bc077.tar
video-codec-experiments-6001cdeff335e12583a398acbb5a8a42c01bc077.tar.bz2
video-codec-experiments-6001cdeff335e12583a398acbb5a8a42c01bc077.tar.zst
fast mode
Diffstat (limited to 'evc/src/helpers/pixel.rs')
-rw-r--r--evc/src/helpers/pixel.rs22
1 files changed, 15 insertions, 7 deletions
diff --git a/evc/src/helpers/pixel.rs b/evc/src/helpers/pixel.rs
index 964040d..816d7dc 100644
--- a/evc/src/helpers/pixel.rs
+++ b/evc/src/helpers/pixel.rs
@@ -27,17 +27,16 @@ impl Pixel {
a.r.abs_diff(b.r) as usize,
a.r.abs_diff(b.r) as usize,
);
+ // fast_sqrt(rd * rd + gd * gd + bd * bd)
SQRT[rd + gd + bd]
}
-
+
#[inline]
pub fn average(a: Pixel, b: Pixel) -> Pixel {
- //? this functions is broken
- // TODO dont loose accuracy
Pixel {
- r: (a.r >> 1) + (b.r >> 1),
- g: (a.g >> 1) + (b.g >> 1),
- b: (a.b >> 1) + (b.b >> 1),
+ r: ((a.r as u16 + b.r as u16) >> 1) as u8,
+ g: ((a.g as u16 + b.g as u16) >> 1) as u8,
+ b: ((a.b as u16 + b.b as u16) >> 1) as u8,
}
}
@@ -51,7 +50,7 @@ impl Pixel {
}
}
-const SQRT: [usize; 256 * 3] = gen_sqrt_lookup();
+pub const SQRT: [usize; 256 * 3] = gen_sqrt_lookup();
const fn gen_sqrt_lookup<const N: usize>() -> [usize; N] {
let mut arr = [0; N];
@@ -70,3 +69,12 @@ const fn sqrt(x: f32) -> f32 {
let a = (a + x / a) * 0.5;
a
}
+
+pub fn fast_sqrt(x: usize) -> usize {
+ let a = 1;
+ let a = (a + x / (a + 1)) / 2;
+ let a = (a + x / (a + 1)) / 2;
+ // let a = (a + x / (a + 1)) / 2;
+ // let a = (a + x / (a + 1)) / 2;
+ a
+}