aboutsummaryrefslogtreecommitdiff
path: root/evc/src/codec/compress.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-22 22:17:34 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-22 22:17:34 +0100
commitcb2597ef6c3c11c11ba50021a5502efef1cf127a (patch)
tree837ce67b084a28eeddc099ee1f33860d7c9ba754 /evc/src/codec/compress.rs
parent4df7c1f1cbe0c3f79eec6be2474aead263f166c8 (diff)
downloadvideo-codec-experiments-cb2597ef6c3c11c11ba50021a5502efef1cf127a.tar
video-codec-experiments-cb2597ef6c3c11c11ba50021a5502efef1cf127a.tar.bz2
video-codec-experiments-cb2597ef6c3c11c11ba50021a5502efef1cf127a.tar.zst
trying to dct without success
Diffstat (limited to 'evc/src/codec/compress.rs')
-rw-r--r--evc/src/codec/compress.rs25
1 files changed, 13 insertions, 12 deletions
diff --git a/evc/src/codec/compress.rs b/evc/src/codec/compress.rs
index e011669..688f04b 100644
--- a/evc/src/codec/compress.rs
+++ b/evc/src/codec/compress.rs
@@ -65,7 +65,7 @@ pub fn lit_compress(w: usize, h: usize, pixels: &[Pixel]) -> Vec<u8> {
norm_dct_channel(w, h, &mut ch);
for i in 0..w * h {
- out.push(ch[i] as u8)
+ out.push(unsafe { std::mem::transmute(ch[i] as i8) });
}
}
out
@@ -75,7 +75,7 @@ pub fn lit_decompress(compressed: &[u8], mut target: View<&mut Frame>) {
for ci in 0..3 {
let mut ch = compressed[ci * w * h..(ci + 1) * w * h]
.iter()
- .map(|v| *v as f32)
+ .map(|v| unsafe { std::mem::transmute::<_, i8>(*v) } as f32)
.collect::<Vec<_>>();
norm_idct_channel(w, h, &mut ch);
for y in 0..h {
@@ -111,11 +111,16 @@ fn norm_dct_channel(w: usize, h: usize, values: &mut [f32]) {
let scale = 2. / (w as f32 * h as f32).sqrt();
for (i, v) in values_trans.iter().enumerate() {
- values[i] = *v * scale
+ values[i] = *v * scale * 127.0
}
}
-fn norm_idct_channel(w: usize, h: usize, values: &mut [f32]) {
+fn norm_idct_channel(h: usize, w: usize, values: &mut [f32]) {
+ let scale = 2. / (w as f32 * h as f32).sqrt();
+ for v in values.iter_mut() {
+ *v /= scale * 127.0
+ }
+
let d = DctPlanner::new().plan_dct2(w);
let mut temp = vec![0.; d.get_scratch_len()];
for c in values.chunks_exact_mut(w) {
@@ -128,22 +133,18 @@ fn norm_idct_channel(w: usize, h: usize, values: &mut [f32]) {
for c in values_trans.chunks_exact_mut(h) {
d.process_dct3_with_scratch(c, &mut temp)
}
-
- let scale = 2. / (w as f32 * h as f32).sqrt();
- for (i, v) in values_trans.iter().enumerate() {
- values[i] = *v * scale
- }
+ values.copy_from_slice(&values_trans)
}
fn transpose(w: usize, h: usize, values: &[f32]) -> Vec<f32> {
- let mut i = 0;
+ let mut io = 0;
let mut it;
let mut transposed = vec![0.; values.len()];
for row in 0..h {
it = row;
for _ in 0..w {
- transposed[it] = values[i];
- i += 1;
+ transposed[it] = values[io];
+ io += 1;
it += h;
}
}