aboutsummaryrefslogtreecommitdiff
path: root/mtree-test/src/main.rs
blob: 927ecac7aae04f0f268fe4e269b783b5bacdd517 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
pub mod decode;
pub mod encode;

use decode::Dec;
use encode::Enc;
use framework::bitstream_filter_main;
use glam::IVec2;
use std::{collections::VecDeque, env::args};

fn main() -> Result<(), std::io::Error> {
    match args().nth(1).unwrap().as_str() {
        "enc" => bitstream_filter_main::<Enc>(),
        "dec" => bitstream_filter_main::<Dec>(),
        _ => panic!("unknown mode"),
    }
}

pub const BLOCK_SIZE: i32 = 8;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AbsRef {
    pub off: IVec2,
    pub frame: u64,
}

#[derive(Clone)]
pub struct Frame {
    pub res: IVec2,
    pub data: Vec<u8>,
}

impl Frame {
    pub fn new(res: IVec2) -> Self {
        let ures = res.as_usizevec2();
        Self {
            res,
            data: vec![0; ures.x * ures.y + 2 * (ures.x / 2 * ures.y / 2)],
        }
    }
    pub fn export_rect(&self, off: IVec2, size: IVec2, buf: &mut Vec<u8>) {
        // Luma
        for y in 0..size.y {
            let y_off = off.x + (y + off.y) * self.res.x;
            buf.extend(&self.data[y_off as usize..(y_off + size.x) as usize]);
        }
        // Chroma
        let uvplane_off = self.res.x * self.res.y;
        for y in 0..size.y / 2 {
            let y_off = uvplane_off + (off.x & !1) + (y + off.y / 2) * self.res.x;
            buf.extend(&self.data[y_off as usize..(y_off + size.x) as usize]);
        }
    }
    pub fn import_rect(&mut self, off: IVec2, size: IVec2, buf: &[u8]) -> usize {
        let mut p = 0;
        // Luma
        for y in 0..size.y {
            let y_off = off.x + (y + off.y) * self.res.x;
            self.data[y_off as usize..(y_off + size.x) as usize]
                .copy_from_slice(&buf[p..p + size.x as usize]);
            p += size.x as usize;
        }
        // Chroma
        let uvplane_off = self.res.x * self.res.y;
        for y in 0..size.y / 2 {
            let y_off = uvplane_off + (off.x & !1) + (y + off.y / 2) * self.res.x;
            self.data[y_off as usize..(y_off + size.x) as usize]
                .copy_from_slice(&buf[p..p + size.x as usize]);
            p += size.x as usize;
        }
        p
    }
}

pub fn frame_to_frame_rect_copy(
    aframe: &Frame,
    bframe: &mut Frame,
    size: IVec2,
    aoff: IVec2,
    boff: IVec2,
) {
    assert_eq!(aframe.res, bframe.res);
    let res = aframe.res;
    // Luma
    for y in 0..size.y {
        let ay_off = aoff.x + (y + aoff.y) * res.x;
        let by_off = boff.x + (y + boff.y) * res.x;

        bframe.data[by_off as usize..(by_off + size.x) as usize]
            .copy_from_slice(&aframe.data[ay_off as usize..(ay_off + size.x) as usize]);
    }

    // Chroma
    let uvplane_off = res.x * res.y;
    for y in 0..size.y / 2 {
        let ay_off = uvplane_off + (aoff.x & !1) + (y + aoff.y / 2) * res.x;
        let by_off = uvplane_off + (boff.x & !1) + (y + boff.y / 2) * res.x;

        bframe.data[by_off as usize..(by_off + size.x) as usize]
            .copy_from_slice(&aframe.data[ay_off as usize..(ay_off + size.x) as usize]);
    }
}

pub struct LastFrames {
    pub frame_offset: u64,
    pub frames: VecDeque<Frame>,
}