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>,
}
|