From 6001cdeff335e12583a398acbb5a8a42c01bc077 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 8 Dec 2022 09:13:17 +0100 Subject: fast mode --- evc/src/codec/decode.rs | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'evc/src/codec/decode.rs') diff --git a/evc/src/codec/decode.rs b/evc/src/codec/decode.rs index b7ab8c7..197028c 100644 --- a/evc/src/codec/decode.rs +++ b/evc/src/codec/decode.rs @@ -1,13 +1,33 @@ -use crate::{block::Block, frame::Frame, refsampler::Sampler, view::View}; +use crate::{ + block::Block, frame::Frame, helpers::threading::both_par, refsampler::Sampler, view::View, +}; -pub fn decode_block(block: &Block, mut target: View<&mut Frame>, prev: View<&Frame>) { +pub struct DecodeConfig { + pub max_threads: usize, +} + +pub fn decode_block( + block: &Block, + mut target: View<&mut Frame>, + prev: View<&Frame>, + config: &DecodeConfig, +) { match &block { Block::Literal(pixels) => target.set_pixels(pixels), Block::Split(box [a, b]) => { - let [at, bt] = target.split_mut_unsafe(); - let [ap, bp] = prev.split(); - decode_block(a, at, ap); - decode_block(b, bt, bp); + let [a, b] = unsafe { std::mem::transmute::<_, [&'static Block; 2]>([a, b]) }; + let [at, bt] = unsafe { + std::mem::transmute::<_, [View<&'static mut Frame>; 2]>(target.split_mut_unsafe()) + }; + let [ap, bp] = + unsafe { std::mem::transmute::<_, [View<&'static Frame>; 2]>(prev.split()) }; + let config = unsafe { std::mem::transmute::<_, &'static DecodeConfig>(config) }; + + both_par( + move || decode_block(a, at, ap, config), + move || decode_block(b, bt, bp, config), + config.max_threads, + ); } Block::Reference { translation } => target.copy_from(&prev.offset(*translation)), Block::AdvancedReference(r) => target.copy_from_sampler(&Sampler::from_refblock(prev, r)), -- cgit v1.2.3-70-g09d2