aboutsummaryrefslogtreecommitdiff
path: root/dhwt-codec/src/bin/encode.rs
blob: 0e711b06b93937bdea15e02cfeda8cadb95f7a11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 {
    unsafe { &mut *((r as *const T) as *mut T) }
}