aboutsummaryrefslogtreecommitdiff
path: root/evc
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-07 23:08:11 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-07 23:08:11 +0100
commit8b7792d6aa27578221fee7cc8be1ceb202602a5a (patch)
tree0675d17e616482b606fbf656575fe56144b7a361 /evc
parente4704f1ba3ff7d9c75714d432768ce12f630e745 (diff)
downloadvideo-codec-experiments-8b7792d6aa27578221fee7cc8be1ceb202602a5a.tar
video-codec-experiments-8b7792d6aa27578221fee7cc8be1ceb202602a5a.tar.bz2
video-codec-experiments-8b7792d6aa27578221fee7cc8be1ceb202602a5a.tar.zst
implement broken value scale
Diffstat (limited to 'evc')
-rw-r--r--evc/spec.md8
-rw-r--r--evc/src/bin/encode.rs5
-rw-r--r--evc/src/codec/encode.rs9
-rw-r--r--evc/src/helpers/pixel.rs3
-rw-r--r--evc/src/refsampler.rs4
5 files changed, 19 insertions, 10 deletions
diff --git a/evc/spec.md b/evc/spec.md
index 58691a3..9d4cc62 100644
--- a/evc/spec.md
+++ b/evc/spec.md
@@ -18,8 +18,8 @@
- translation: _`s8, s8`_ (translation encoded as _floats_)
- transform: _`s8, s8, s8, s8`_ (2x2-matrix of _floats_ applied before
sampling)
- - value_scale: _`s8`_ (represents multiplication of each color component
- with $1.1^n$)
+ - value_scale: _`i8`_ (represents multiplication of each color component
+ with $1.05^n$)
### _`s8`_
@@ -28,7 +28,5 @@
### Todo
-- JPEG compress I-Blocks
-- Sub-pixel translation
-- fade
+- JPEG compress Literal-Blocks
- general compression (gzip oder so)
diff --git a/evc/src/bin/encode.rs b/evc/src/bin/encode.rs
index 6f3f0a7..fe03023 100644
--- a/evc/src/bin/encode.rs
+++ b/evc/src/bin/encode.rs
@@ -26,6 +26,9 @@ pub struct EncodeArgs {
#[arg(short, long, default_value = "8")]
jobs: usize,
+ #[arg(short, long, default_value = "8")]
+ min_block_size: isize,
+
#[arg(short = 't', long, default_value = "100")]
ref_thres: f64,
#[arg(short = 'T', long)]
@@ -43,7 +46,7 @@ fn main() -> anyhow::Result<()> {
mode: args.mode,
ref_thres: args.ref_thres,
max_diff_area: 10_000,
- min_block_size: 8,
+ min_block_size: args.min_block_size,
max_threads: args.jobs,
};
diff --git a/evc/src/codec/encode.rs b/evc/src/codec/encode.rs
index c9a1172..4eb86b5 100644
--- a/evc/src/codec/encode.rs
+++ b/evc/src/codec/encode.rs
@@ -6,7 +6,7 @@ use crate::{
view::View,
};
use clap::ValueEnum;
-use log::{debug, trace};
+use log::debug;
#[derive(Debug, Clone)]
pub struct EncodeConfig {
@@ -78,7 +78,6 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
let mut p = params.clone();
f(&mut p);
let d = View::diff_sampler(view, &Sampler::from_refblock(prev.clone(), &p));
- trace!("best={diff} try={d}");
if d < *diff {
*diff = d;
*params = p;
@@ -86,6 +85,7 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
}
let (mut d, mut p) = (diff, params.clone());
+
pk(&view, &prev, &mut d, &mut p, |p| p.translation.x += 4);
pk(&view, &prev, &mut d, &mut p, |p| p.translation.x -= 4);
pk(&view, &prev, &mut d, &mut p, |p| p.translation.y += 4);
@@ -98,6 +98,10 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
pk(&view, &prev, &mut d, &mut p, |p| p.translation.x -= 1);
pk(&view, &prev, &mut d, &mut p, |p| p.translation.y += 1);
pk(&view, &prev, &mut d, &mut p, |p| p.translation.y -= 1);
+
+ pk(&view, &prev, &mut d, &mut p, |p| p.value_scale += 1);
+ pk(&view, &prev, &mut d, &mut p, |p| p.value_scale -= 1);
+
pk(&view, &prev, &mut d, &mut p, |p| p.transform.a -= 1);
pk(&view, &prev, &mut d, &mut p, |p| p.transform.a += 1);
pk(&view, &prev, &mut d, &mut p, |p| p.transform.b -= 1);
@@ -106,6 +110,7 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
pk(&view, &prev, &mut d, &mut p, |p| p.transform.c += 1);
pk(&view, &prev, &mut d, &mut p, |p| p.transform.d -= 1);
pk(&view, &prev, &mut d, &mut p, |p| p.transform.d += 1);
+
debug!("{diff} -> {d}");
if d >= diff {
diff --git a/evc/src/helpers/pixel.rs b/evc/src/helpers/pixel.rs
index f7d6621..964040d 100644
--- a/evc/src/helpers/pixel.rs
+++ b/evc/src/helpers/pixel.rs
@@ -29,6 +29,7 @@ impl Pixel {
);
SQRT[rd + gd + bd]
}
+
#[inline]
pub fn average(a: Pixel, b: Pixel) -> Pixel {
//? this functions is broken
@@ -39,6 +40,8 @@ impl Pixel {
b: (a.b >> 1) + (b.b >> 1),
}
}
+
+ #[inline]
pub fn scale(&self, factor: f32) -> Pixel {
Pixel {
r: ((self.r as f32) * factor).clamp(0.0, 255.0) as u8,
diff --git a/evc/src/refsampler.rs b/evc/src/refsampler.rs
index 16a0600..d6f2bb1 100644
--- a/evc/src/refsampler.rs
+++ b/evc/src/refsampler.rs
@@ -22,7 +22,7 @@ impl<'a> Sampler<'a> {
pub fn sample(&self, p: Vec2<f32>) -> Pixel {
self.view
.sample(self.translation + self.transform.transform(p + self.halfsize) - self.halfsize)
- // .scale(self.value_scale)
+ .scale(self.value_scale)
}
pub fn from_refblock(
view: View<&'a Frame>,
@@ -44,7 +44,7 @@ impl<'a> Sampler<'a> {
x: map_scalar8(translation.x),
y: map_scalar8(translation.y),
},
- value_scale: map_scalar8(*value_scale),
+ value_scale: 1.05f32.powf(*value_scale as f32),
view,
}
}