From 9d7986bbfd44b69a623fa29528b5d13000b91c77 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 7 Dec 2022 20:38:00 +0100 Subject: advanced translate --- evc/src/codec/decode.rs | 8 ++------ evc/src/codec/encode.rs | 44 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 10 deletions(-) (limited to 'evc/src/codec') 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(), ¶ms); + let mut diff = View::diff_sampler(&view, &sampler); + + loop { + pub fn pk ()>( + 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; + } } } }; -- cgit v1.2.3-70-g09d2