diff options
author | metamuffin <metamuffin@disroot.org> | 2022-12-07 20:38:00 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-12-07 20:38:00 +0100 |
commit | 9d7986bbfd44b69a623fa29528b5d13000b91c77 (patch) | |
tree | 8da95f328243a96acec6c3ea6ebddc71bb63f05c /evc/src/codec/encode.rs | |
parent | 7be0d5039db7e8660bced13698178bf1d6758109 (diff) | |
download | video-codec-experiments-9d7986bbfd44b69a623fa29528b5d13000b91c77.tar video-codec-experiments-9d7986bbfd44b69a623fa29528b5d13000b91c77.tar.bz2 video-codec-experiments-9d7986bbfd44b69a623fa29528b5d13000b91c77.tar.zst |
advanced translate
Diffstat (limited to 'evc/src/codec/encode.rs')
-rw-r--r-- | evc/src/codec/encode.rs | 44 |
1 files changed, 40 insertions, 4 deletions
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<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; + } } } }; |