diff options
author | metamuffin <metamuffin@disroot.org> | 2022-12-08 09:13:17 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-12-08 09:13:17 +0100 |
commit | 6001cdeff335e12583a398acbb5a8a42c01bc077 (patch) | |
tree | 4c1c515cbf33e727f5db317880aadd425a1e0b96 /evc/src/codec/decode.rs | |
parent | 8b7792d6aa27578221fee7cc8be1ceb202602a5a (diff) | |
download | video-codec-experiments-6001cdeff335e12583a398acbb5a8a42c01bc077.tar video-codec-experiments-6001cdeff335e12583a398acbb5a8a42c01bc077.tar.bz2 video-codec-experiments-6001cdeff335e12583a398acbb5a8a42c01bc077.tar.zst |
fast mode
Diffstat (limited to 'evc/src/codec/decode.rs')
-rw-r--r-- | evc/src/codec/decode.rs | 32 |
1 files changed, 26 insertions, 6 deletions
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)), |