aboutsummaryrefslogtreecommitdiff
path: root/dhwt-codec/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-05-05 15:09:54 +0200
committermetamuffin <metamuffin@disroot.org>2025-05-05 15:09:54 +0200
commit306f96164784a8cbf405e72fa4364d6523366e95 (patch)
tree51717fc139871baa438aad806f4923669ae0896c /dhwt-codec/src
parent9cc089e2d6e841879e430b01d2f3d92c8820523e (diff)
downloadvideo-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar
video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar.bz2
video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar.zst
old dir
Diffstat (limited to 'dhwt-codec/src')
-rw-r--r--dhwt-codec/src/bin/decode.rs57
-rw-r--r--dhwt-codec/src/bin/encode.rs57
-rw-r--r--dhwt-codec/src/bin/export.rs42
-rw-r--r--dhwt-codec/src/bin/import.rs51
-rw-r--r--dhwt-codec/src/io.rs71
-rw-r--r--dhwt-codec/src/lib.rs23
-rw-r--r--dhwt-codec/src/transform.rs42
-rw-r--r--dhwt-codec/src/trim.rs36
-rw-r--r--dhwt-codec/src/view.rs42
9 files changed, 0 insertions, 421 deletions
diff --git a/dhwt-codec/src/bin/decode.rs b/dhwt-codec/src/bin/decode.rs
deleted file mode 100644
index 1930dfb..0000000
--- a/dhwt-codec/src/bin/decode.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use clap::Parser;
-use dhwt_codec::{
- io::{empty_videobuf, infile, outfile, read_videobuf_small, write_videobuf, VideoBuf},
- transform, trim,
- view::{BufferView, IndexMode},
- CommonArgs,
-};
-use rayon::prelude::{IntoParallelIterator, ParallelIterator};
-
-fn main() {
- let args = CommonArgs::parse();
-
- let mut inf = infile(&args.infile);
- let mut of = outfile(&args.outfile);
-
- for c in 0..args.channels {
- eprintln!("encoding channel #{c}");
- let a = empty_videobuf(args.x, args.y, args.z);
- let b = read_videobuf_small(&mut inf);
-
- eprintln!("\tdecoding Z");
- (0..args.x).into_par_iter().for_each(|x| {
- for y in 0..args.y {
- run_mode(make_mut(&b), make_mut(&a), IndexMode::XY(x, y), args.z)
- }
- });
- eprintln!("\tdecoding Y");
- (0..args.x).into_par_iter().for_each(|x| {
- for z in 0..args.z {
- run_mode(make_mut(&a), make_mut(&b), IndexMode::XZ(x, z), args.y)
- }
- });
- eprintln!("\tdecoding X");
- (0..args.y).into_par_iter().for_each(|y| {
- for z in 0..args.z {
- run_mode(make_mut(&b), make_mut(&a), IndexMode::YZ(y, z), args.x)
- }
- });
- write_videobuf(&mut of, a);
- }
-}
-
-fn run_mode(a: &mut VideoBuf, b: &mut VideoBuf, mode: IndexMode, size: usize) {
- trim::untrim(size, &mut BufferView::new(b, mode));
- transform::decode(
- size,
- &mut BufferView::new(a, mode),
- &mut BufferView::new(b, mode),
- );
-}
-
-fn make_mut<T>(r: &T) -> &mut T {
- #[allow(mutable_transmutes)]
- unsafe {
- std::mem::transmute::<&T, &mut T>(r)
- }
-}
diff --git a/dhwt-codec/src/bin/encode.rs b/dhwt-codec/src/bin/encode.rs
deleted file mode 100644
index db4c70e..0000000
--- a/dhwt-codec/src/bin/encode.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use clap::Parser;
-use dhwt_codec::{
- io::{empty_videobuf, infile, outfile, read_videobuf, write_videobuf_small, VideoBuf},
- transform, trim,
- view::{BufferView, IndexMode},
- CommonArgs,
-};
-use rayon::prelude::{IntoParallelIterator, ParallelIterator};
-
-fn main() {
- let args = CommonArgs::parse();
-
- let mut inf = infile(&args.infile);
- let mut of = outfile(&args.outfile);
-
- for c in 0..args.channels {
- eprintln!("encoding channel #{c}");
- let o = empty_videobuf(args.x, args.y, args.z);
- let i = read_videobuf(&mut inf);
-
- eprintln!("\tencoding X");
- (0..args.y).into_par_iter().for_each(|y| {
- for z in 0..args.z {
- run_mode(make_mut(&i), make_mut(&o), IndexMode::YZ(y, z), args.x)
- }
- });
- eprintln!("\tencoding Y");
- (0..args.x).into_par_iter().for_each(|x| {
- for z in 0..args.z {
- run_mode(make_mut(&o), make_mut(&i), IndexMode::XZ(x, z), args.y)
- }
- });
- eprintln!("\tencoding Z");
- (0..args.x).into_par_iter().for_each(|x| {
- for y in 0..args.y {
- run_mode(make_mut(&i), make_mut(&o), IndexMode::XY(x, y), args.z)
- }
- });
- write_videobuf_small(&mut of, o);
- }
-}
-
-fn run_mode(a: &mut VideoBuf, b: &mut VideoBuf, mode: IndexMode, size: usize) {
- transform::encode(
- size,
- &mut BufferView::new(a, mode),
- &mut BufferView::new(b, mode),
- );
- trim::trim(size, &mut BufferView::new(b, mode));
-}
-
-fn make_mut<T>(r: &T) -> &mut T {
- #[allow(mutable_transmutes)]
- unsafe {
- std::mem::transmute::<&T, &mut T>(r)
- }
-}
diff --git a/dhwt-codec/src/bin/export.rs b/dhwt-codec/src/bin/export.rs
deleted file mode 100644
index 73f3067..0000000
--- a/dhwt-codec/src/bin/export.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-use clap::Parser;
-use dhwt_codec::io::{infile, read_videobuf};
-use std::io::{stdout, BufWriter, Write};
-
-#[derive(Parser)]
-#[clap(about)]
-struct ExportArgs {
- #[arg(short)]
- x: usize,
- #[arg(short)]
- y: usize,
- #[arg(short)]
- z: usize,
-
- #[arg(short, long, default_value = "3")]
- channels: usize,
-
- infile: String,
-}
-
-fn main() {
- let args = ExportArgs::parse();
-
- let mut i = infile(&args.infile);
- let mut writer = BufWriter::new(stdout());
-
- let mut channels = vec![];
- for _ in 0..args.channels {
- channels.push(read_videobuf(&mut i))
- }
-
- for z in 0..args.z {
- for y in 0..args.y {
- for x in 0..args.x {
- for c in 0..args.channels {
- writer.write_all(&[channels[c][x][y][z] as u8]).unwrap();
- }
- }
- }
- }
- writer.flush().unwrap();
-}
diff --git a/dhwt-codec/src/bin/import.rs b/dhwt-codec/src/bin/import.rs
deleted file mode 100644
index cd2a35e..0000000
--- a/dhwt-codec/src/bin/import.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-use clap::Parser;
-use dhwt_codec::io::{outfile, write_videobuf, Value};
-use std::io::{stdin, Read};
-
-#[derive(Parser)]
-#[clap(about)]
-struct ImportArgs {
- #[arg(short)]
- x: usize,
- #[arg(short)]
- y: usize,
- #[arg(short)]
- z: usize,
-
- #[arg(short, long, default_value = "3")]
- channels: usize,
-
- outfile: String,
-}
-
-fn main() {
- let args = ImportArgs::parse();
-
- let mut rawbuf = (0..(args.x * args.y * args.z * args.channels))
- .map(|_| 0u8)
- .collect::<Vec<_>>();
- stdin().read_exact(&mut rawbuf).unwrap();
-
- let mut o = outfile(&args.outfile);
-
- for c in 0..args.channels {
- let mut cols = vec![];
- for x in 0..args.x {
- let mut col = vec![];
- for y in 0..args.y {
- let mut span = vec![];
- for z in 0..args.z {
- span.push(
- rawbuf[c
- + (x * args.channels)
- + (y * args.channels * args.x)
- + (z * args.channels * args.x * args.y)] as Value,
- );
- }
- col.push(span);
- }
- cols.push(col)
- }
- write_videobuf(&mut o, cols)
- }
-}
diff --git a/dhwt-codec/src/io.rs b/dhwt-codec/src/io.rs
deleted file mode 100644
index c60bc79..0000000
--- a/dhwt-codec/src/io.rs
+++ /dev/null
@@ -1,71 +0,0 @@
-use bincode::config;
-use std::{
- fs::File,
- io::{BufReader, BufWriter, Read, Write},
-};
-
-pub type Value = f32;
-pub type VideoBuf = Vec<Vec<Vec<Value>>>;
-pub const ZERO: Value = 0 as Value;
-pub const TWO: Value = 2 as Value;
-
-pub fn empty_videobuf(x: usize, y: usize, z: usize) -> VideoBuf {
- (0..x)
- .map(|_| (0..y).map(|_| (0..z).map(|_| ZERO).collect()).collect())
- .collect()
-}
-
-pub fn outfile(p: &str) -> impl Write {
- BufWriter::new(File::create(p).unwrap())
-}
-pub fn infile(p: &str) -> impl Read {
- BufReader::new(File::open(p).unwrap())
-}
-
-pub fn read_videobuf(f: &mut impl Read) -> VideoBuf {
- bincode::decode_from_std_read(f, config::standard()).unwrap()
-}
-pub fn write_videobuf(f: &mut impl Write, i: VideoBuf) {
- bincode::encode_into_std_write(i, f, config::standard()).unwrap();
-}
-
-pub fn write_videobuf_small(f: &mut impl Write, mut i: VideoBuf) {
- for _ in 0..(i.len() / 2) {
- i.pop();
- }
- for i in &mut i {
- for _ in 0..(i.len() / 2) {
- i.pop();
- }
- for i in i {
- for _ in 0..(i.len() / 2) {
- i.pop();
- }
- }
- }
- write_videobuf(f, i);
-}
-pub fn read_videobuf_small(f: &mut impl Read) -> VideoBuf {
- let mut i = read_videobuf(f);
-
- for i in &mut i {
- for i in i {
- for _ in 0..i.len() {
- i.push(ZERO);
- }
- }
- }
- for i in &mut i {
- for _ in 0..i.len() {
- i.push((0..i[0].len()).map(|_| ZERO).collect());
- }
- }
- for _ in 0..i.len() {
- i.push(
- (0..i[0].len())
- .map(|_| ((0..i[0][0].len()).map(|_| ZERO)).collect())
- .collect(),
- );
- }
- i
-}
diff --git a/dhwt-codec/src/lib.rs b/dhwt-codec/src/lib.rs
deleted file mode 100644
index 69d6b4c..0000000
--- a/dhwt-codec/src/lib.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-use clap::Parser;
-
-pub mod io;
-pub mod transform;
-pub mod trim;
-pub mod view;
-
-#[derive(Parser)]
-#[clap(about)]
-pub struct CommonArgs {
- #[arg(short)]
- pub x: usize,
- #[arg(short)]
- pub y: usize,
- #[arg(short)]
- pub z: usize,
-
- #[arg(short, long, default_value = "3")]
- pub channels: usize,
-
- pub infile: String,
- pub outfile: String,
-}
diff --git a/dhwt-codec/src/transform.rs b/dhwt-codec/src/transform.rs
deleted file mode 100644
index 82bccd1..0000000
--- a/dhwt-codec/src/transform.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-use crate::io::{Value, TWO};
-use std::ops::{Index, IndexMut};
-
-pub fn encode<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>(
- size: usize,
- a: &mut X,
- b: &mut X,
-) {
- let mut k = size;
- while k != 1 {
- k /= 2;
- for i in 0..k {
- let x = a[i * 2];
- let y = a[i * 2 + 1];
- b[i] = x + y;
- b[k + i] = x - y;
- }
- for i in 0..k {
- a[i] = b[i]
- }
- }
-}
-
-pub fn decode<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>(
- size: usize,
- a: &mut X,
- b: &mut X,
-) {
- let mut k = 1;
- while k != size {
- for i in 0..k {
- let avr = a[i] / TWO;
- let spread = a[i + k] / TWO;
- b[i * 2] = avr + spread;
- b[i * 2 + 1] = avr - spread;
- }
- k *= 2;
- for i in 0..k {
- a[i] = b[i]
- }
- }
-}
diff --git a/dhwt-codec/src/trim.rs b/dhwt-codec/src/trim.rs
deleted file mode 100644
index 85a920a..0000000
--- a/dhwt-codec/src/trim.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-use crate::io::{Value, TWO, ZERO};
-use std::ops::{Index, IndexMut};
-
-pub fn trim<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>(
- size: usize,
- a: &mut X,
-) {
- let half = size / 2;
- let quarter = size / 4;
- for i in 0..(size / 2 / 4) {
- let hi = half + i * 4;
- let qi = quarter + i * 2;
- a[qi] = (a[qi + 0] + a[qi + 1]) / TWO;
- a[qi + 1] = (a[hi + 0] + a[hi + 1] + a[hi + 2] + a[hi + 3]) / (TWO * TWO);
- }
- for i in half..size {
- a[i] = ZERO;
- }
-}
-
-pub fn untrim<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>(
- size: usize,
- a: &mut X,
-) {
- let half = size / 2;
- let quarter = size / 4;
- for i in 0..(size / 2 / 4) {
- let hi = half + i * 4;
- let qi = quarter + i * 2;
- a[hi + 0] = a[qi + 1];
- a[hi + 1] = a[qi + 1];
- a[hi + 2] = a[qi + 1];
- a[hi + 3] = a[qi + 1];
- a[qi + 1] = a[qi];
- }
-}
diff --git a/dhwt-codec/src/view.rs b/dhwt-codec/src/view.rs
deleted file mode 100644
index 0f2ecf7..0000000
--- a/dhwt-codec/src/view.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-use std::ops::{Index, IndexMut};
-
-use crate::io::{VideoBuf, Value};
-
-#[derive(Copy, Clone, Debug)]
-pub enum IndexMode {
- XY(usize, usize),
- XZ(usize, usize),
- YZ(usize, usize),
-}
-
-pub struct BufferView<'a> {
- mode: IndexMode,
- buf: &'a mut VideoBuf,
-}
-
-impl<'a> BufferView<'a> {
- pub fn new(buf: &'a mut VideoBuf, mode: IndexMode) -> Self {
- BufferView { mode, buf }
- }
-}
-
-impl Index<usize> for BufferView<'_> {
- type Output = Value;
-
- fn index(&self, a: usize) -> &Self::Output {
- match self.mode {
- IndexMode::XY(x, y) => &self.buf[x][y][a],
- IndexMode::XZ(x, z) => &self.buf[x][a][z],
- IndexMode::YZ(y, z) => &self.buf[a][y][z],
- }
- }
-}
-impl IndexMut<usize> for BufferView<'_> {
- fn index_mut(&mut self, a: usize) -> &mut Self::Output {
- match self.mode {
- IndexMode::XY(x, y) => &mut self.buf[x][y][a],
- IndexMode::XZ(x, z) => &mut self.buf[x][a][z],
- IndexMode::YZ(y, z) => &mut self.buf[a][y][z],
- }
- }
-}