aboutsummaryrefslogtreecommitdiff
path: root/evc/src
diff options
context:
space:
mode:
Diffstat (limited to 'evc/src')
-rw-r--r--evc/src/bin/decode.rs7
-rw-r--r--evc/src/bin/encode.rs17
-rw-r--r--evc/src/codec/compress.rs9
-rw-r--r--evc/src/codec/decode.rs7
-rw-r--r--evc/src/codec/encode/mod.rs4
5 files changed, 14 insertions, 30 deletions
diff --git a/evc/src/bin/decode.rs b/evc/src/bin/decode.rs
index 4ac4fc8..fbf5624 100644
--- a/evc/src/bin/decode.rs
+++ b/evc/src/bin/decode.rs
@@ -17,9 +17,6 @@ use std::io::{BufReader, BufWriter};
pub struct DecodeArgs {
#[arg(long)]
debug: bool,
-
- #[arg(short, long, default_value = "8")]
- jobs: usize,
}
fn main() -> anyhow::Result<()> {
@@ -36,9 +33,7 @@ fn main() -> anyhow::Result<()> {
}
let size = header.resolution;
- let config = DecodeConfig {
- max_threads: args.jobs,
- };
+ let config = DecodeConfig {};
let progress_bar = ProgressBar::new(header.frame_count as u64);
diff --git a/evc/src/bin/encode.rs b/evc/src/bin/encode.rs
index e1f6730..6d18992 100644
--- a/evc/src/bin/encode.rs
+++ b/evc/src/bin/encode.rs
@@ -3,6 +3,7 @@ use clap::Parser;
use indicatif::ProgressBar;
use libreschmux::{
codec::{
+ compress::compress_block,
decode::{decode_block, DecodeConfig},
encode::{encode_block, EncodeConfig, EncodeMode},
},
@@ -11,6 +12,7 @@ use libreschmux::{
helpers::vector::Vec2,
};
use log::info;
+use rayon::{ThreadPool, ThreadPoolBuilder};
use std::io::{BufReader, BufWriter};
#[derive(Parser)]
@@ -35,9 +37,6 @@ pub struct EncodeArgs {
length: Option<usize>,
#[arg(short, long, default_value = "8")]
- jobs: usize,
-
- #[arg(short, long, default_value = "8")]
min_block_size: isize,
#[arg(short = 't', long, default_value = "200")]
@@ -57,7 +56,6 @@ fn main() -> anyhow::Result<()> {
weight_factor: 50.0,
max_diff_area: 10_000,
min_block_size: args.min_block_size,
- max_threads: args.jobs,
do_translate: !args.no_translate,
do_linear_transform: !args.no_linear_transform,
do_value_scale: !args.no_value_scale,
@@ -75,8 +73,8 @@ fn main() -> anyhow::Result<()> {
.context("writing header")?;
let progress_bar = args.length.map(|len| ProgressBar::new(len as u64));
-
let mut prev_frame = Frame::new(size);
+
for i in 0.. {
info!("encode frame {i}");
let mut frame = Frame::read(&mut input, size).context("reading raw frame")?;
@@ -106,14 +104,7 @@ fn main() -> anyhow::Result<()> {
progress_bar.inc(1);
}
- decode_block(
- &root,
- frame.view_mut(),
- prev_frame.view(),
- &DecodeConfig {
- max_threads: config.max_threads,
- },
- );
+ decode_block(&root, frame.view_mut(), prev_frame.view(), &DecodeConfig {});
prev_frame = frame;
}
diff --git a/evc/src/codec/compress.rs b/evc/src/codec/compress.rs
index 688f04b..09d1f29 100644
--- a/evc/src/codec/compress.rs
+++ b/evc/src/codec/compress.rs
@@ -65,17 +65,20 @@ pub fn lit_compress(w: usize, h: usize, pixels: &[Pixel]) -> Vec<u8> {
norm_dct_channel(w, h, &mut ch);
for i in 0..w * h {
- out.push(unsafe { std::mem::transmute(ch[i] as i8) });
+ out.extend(unsafe { std::mem::transmute::<_, [u8; 4]>(ch[i]) });
}
}
out
}
+
pub fn lit_decompress(compressed: &[u8], mut target: View<&mut Frame>) {
let (w, h) = (target.size.x as usize, target.size.y as usize);
for ci in 0..3 {
let mut ch = compressed[ci * w * h..(ci + 1) * w * h]
- .iter()
- .map(|v| unsafe { std::mem::transmute::<_, i8>(*v) } as f32)
+ .chunks_exact(4)
+ .map(|v| unsafe {
+ std::mem::transmute::<_, f32>(TryInto::<[u8; 4]>::try_into(v).unwrap())
+ })
.collect::<Vec<_>>();
norm_idct_channel(w, h, &mut ch);
for y in 0..h {
diff --git a/evc/src/codec/decode.rs b/evc/src/codec/decode.rs
index bb2aadf..b1f6a3d 100644
--- a/evc/src/codec/decode.rs
+++ b/evc/src/codec/decode.rs
@@ -3,9 +3,7 @@ use crate::{
block::Block, frame::Frame, helpers::threading::both_par, refsampler::Sampler, view::View,
};
-pub struct DecodeConfig {
- pub max_threads: usize,
-}
+pub struct DecodeConfig {}
pub fn decode_block(
block: &Block,
@@ -24,10 +22,9 @@ pub fn decode_block(
unsafe { std::mem::transmute::<_, [View<&'static Frame>; 2]>(prev.split()) };
let config = unsafe { std::mem::transmute::<_, &'static DecodeConfig>(config) };
- both_par(
+ rayon::join(
move || decode_block(a, at, ap, config),
move || decode_block(b, bt, bp, config),
- config.max_threads,
);
}
Block::CompressedLiteral(data) => {
diff --git a/evc/src/codec/encode/mod.rs b/evc/src/codec/encode/mod.rs
index 8b7b342..43607aa 100644
--- a/evc/src/codec/encode/mod.rs
+++ b/evc/src/codec/encode/mod.rs
@@ -15,7 +15,6 @@ pub struct EncodeConfig {
pub ref_thres: f64,
pub max_diff_area: isize,
pub min_block_size: isize,
- pub max_threads: usize,
pub weight_factor: f64,
pub do_translate: bool,
@@ -72,10 +71,9 @@ pub fn encode_block(view: View<&Frame>, prev: View<&Frame>, config: &EncodeConfi
// only bother to do multithreading, when the block is big.
let ((ad, a), (bd, b)) = if view.area() > 100 {
- both_par(
+ rayon::join(
|| encode_block(av, ap, config),
|| encode_block(bv, bp, config),
- config.max_threads,
)
} else {
(encode_block(av, ap, config), encode_block(bv, bp, config))