aboutsummaryrefslogtreecommitdiff
path: root/evc/src/codec
diff options
context:
space:
mode:
Diffstat (limited to 'evc/src/codec')
-rw-r--r--evc/src/codec/decode.rs8
-rw-r--r--evc/src/codec/encode.rs44
2 files changed, 42 insertions, 10 deletions
diff --git a/evc/src/codec/decode.rs b/evc/src/codec/decode.rs
index 2da320f..b7ab8c7 100644
--- a/evc/src/codec/decode.rs
+++ b/evc/src/codec/decode.rs
@@ -1,4 +1,4 @@
-use crate::{block::Block, frame::Frame, view::View};
+use crate::{block::Block, frame::Frame, refsampler::Sampler, view::View};
pub fn decode_block(block: &Block, mut target: View<&mut Frame>, prev: View<&Frame>) {
match &block {
@@ -10,10 +10,6 @@ pub fn decode_block(block: &Block, mut target: View<&mut Frame>, prev: View<&Fra
decode_block(b, bt, bp);
}
Block::Reference { translation } => target.copy_from(&prev.offset(*translation)),
- Block::AdvancedReference {
- translation: _,
- transform: _,
- value_scale: _,
- } => todo!(),
+ Block::AdvancedReference(r) => target.copy_from_sampler(&Sampler::from_refblock(prev, r)),
}
}
diff --git a/evc/src/codec/encode.rs b/evc/src/codec/encode.rs
index 5ce0b16..5ffee4b 100644
--- a/evc/src/codec/encode.rs
+++ b/evc/src/codec/encode.rs
@@ -1,10 +1,12 @@
use crate::{
- block::Block,
+ block::{AdvancedReference, Block},
frame::Frame,
helpers::{pixel::Pixel, threading::both_par, vector::Vec2},
+ refsampler::Sampler,
view::View,
};
use clap::ValueEnum;
+use log::{debug, trace};
#[derive(Debug, Clone)]
pub struct EncodeConfig {
@@ -22,7 +24,6 @@ pub enum EncodeMode {
Advanced,
}
-
pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfig) -> Block {
let (diff, refblock) = if view.area() > config.max_diff_area {
(
@@ -47,7 +48,7 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
for x in OFFSETS {
for y in OFFSETS {
let translation = Vec2 { x: *x, y: *y };
- let diff = View::diff(&view, &prev.offset(translation)); // / view.area() as f64;
+ let diff = View::diff(&view, &prev.offset(translation));
if diff < best_diff {
best_translation = translation;
best_diff = diff;
@@ -62,7 +63,42 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
)
}
EncodeMode::Advanced => {
- todo!()
+ let mut params = AdvancedReference::default();
+ let sampler = Sampler::from_refblock(prev.clone(), &params);
+ let mut diff = View::diff_sampler(&view, &sampler);
+
+ loop {
+ pub fn pk<F: FnMut(&mut AdvancedReference) -> ()>(
+ view: &View<&Frame>,
+ prev: &View<&Frame>,
+ diff: &mut f64,
+ params: &mut AdvancedReference,
+ mut f: F,
+ ) {
+ 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;
+ }
+ }
+
+ let (mut d, mut p) = (diff, params.clone());
+ pk(&view, &prev, &mut d, &mut p, |p| p.translation.x += 2);
+ pk(&view, &prev, &mut d, &mut p, |p| p.translation.x -= 2);
+ pk(&view, &prev, &mut d, &mut p, |p| p.translation.y += 2);
+ pk(&view, &prev, &mut d, &mut p, |p| p.translation.y -= 2);
+ debug!("{diff} -> {d}");
+
+ if d >= diff {
+ break (diff, Block::AdvancedReference(params));
+ }
+
+ diff = d;
+ params = p;
+ }
}
}
};