aboutsummaryrefslogtreecommitdiff
path: root/evc/src/codec/decode.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-08 09:13:17 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-08 09:13:17 +0100
commit6001cdeff335e12583a398acbb5a8a42c01bc077 (patch)
tree4c1c515cbf33e727f5db317880aadd425a1e0b96 /evc/src/codec/decode.rs
parent8b7792d6aa27578221fee7cc8be1ceb202602a5a (diff)
downloadvideo-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.rs32
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)),