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/encode.rs | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) (limited to 'evc/src/codec/encode.rs') 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