diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-06 00:05:13 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-06 00:05:13 +0200 |
commit | 110f6738b89d22a384f5ec580b452ef411b975bb (patch) | |
tree | 1bfcb2446e46f36ce60f529d349d5d6b180e672d /mtree-test/src/lib.rs | |
parent | 2c09942bc1af0a1f41c0e3ee52323deede19e6bd (diff) | |
download | video-codec-experiments-110f6738b89d22a384f5ec580b452ef411b975bb.tar video-codec-experiments-110f6738b89d22a384f5ec580b452ef411b975bb.tar.bz2 video-codec-experiments-110f6738b89d22a384f5ec580b452ef411b975bb.tar.zst |
theory works, reality not yet
Diffstat (limited to 'mtree-test/src/lib.rs')
-rw-r--r-- | mtree-test/src/lib.rs | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/mtree-test/src/lib.rs b/mtree-test/src/lib.rs index 1214cbf..cf55e92 100644 --- a/mtree-test/src/lib.rs +++ b/mtree-test/src/lib.rs @@ -1,4 +1,7 @@ -use glam::I16Vec2; +use glam::{I16Vec2, i16vec2}; +use std::{collections::VecDeque, ops::Range}; + +pub const BLOCK_SIZE: i16 = 4; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct AbsRef { @@ -6,8 +9,15 @@ pub struct AbsRef { pub frame: u64, } +#[derive(Clone)] pub struct Frame(pub Vec<u8>); + impl Frame { + pub fn new(res: I16Vec2) -> Self { + let res = res.as_usizevec2(); + Self(vec![0; res.x * res.y + 2 * (res.x / 2 * res.y / 2)]) + } + pub fn index(&self, res: I16Vec2, p: I16Vec2) -> [usize; 3] { let res = res.as_usizevec2(); let p = p.as_usizevec2(); @@ -23,7 +33,68 @@ impl Frame { ysize + usize + puv.x + puv.y * uvstride, ] } + pub fn slice(&self, res: I16Vec2, y: i16, x: Range<i16>) -> [&[u8]; 3] { + let start = self.index(res, i16vec2(x.start, y)); + let end = self.index(res, i16vec2(x.end, y)); + [ + &self.0[start[0]..end[0]], + &self.0[start[1]..end[1]], + &self.0[start[2]..end[2]], + ] + } pub fn get(&self, res: I16Vec2, p: I16Vec2) -> [u8; 3] { self.index(res, p).map(|i| self.0[i]) } + + pub fn export_rect(&self, res: I16Vec2, r: Range<I16Vec2>, out: &mut Vec<u8>) { + for y in r.start.y..r.end.y { + let slices = self.slice(res, y, r.start.x..r.end.x); + out.extend(slices[0]); + out.extend(slices[1]); + out.extend(slices[2]); + } + } + pub fn import_rect(&mut self, res: I16Vec2, r: Range<I16Vec2>, mut data: &[u8]) -> usize { + let mut off = 0; + for y in r.start.y..r.end.y { + let start = self.index(res, i16vec2(r.start.x, y)); + let end = self.index(res, i16vec2(r.end.x, y)); + + let mut do_slice = |s: &mut [u8]| { + s.copy_from_slice(&data[..s.len()]); + data = &data[s.len()..]; + off += s.len(); + }; + + do_slice(&mut self.0[start[0]..end[0]]); + do_slice(&mut self.0[start[1]..end[1]]); + do_slice(&mut self.0[start[2]..end[2]]); + } + off + } +} + +pub fn frame_to_frame_rect_copy( + res: I16Vec2, + aframe: &mut Frame, + bframe: &Frame, + size: I16Vec2, + aoff: I16Vec2, + boff: I16Vec2, +) { + for y in size.x..size.y { + let astart = aframe.index(res, i16vec2(aoff.x, aoff.y + y)); + let aend = aframe.index(res, i16vec2(aoff.x + size.x, aoff.y + y)); + let bstart = bframe.index(res, i16vec2(boff.x, boff.y + y)); + let bend = bframe.index(res, i16vec2(boff.x + size.x, boff.y + y)); + + aframe.0[astart[0]..aend[0]].copy_from_slice(&bframe.0[bstart[0]..bend[0]]); + aframe.0[astart[1]..aend[1]].copy_from_slice(&bframe.0[bstart[1]..bend[1]]); + aframe.0[astart[2]..aend[2]].copy_from_slice(&bframe.0[bstart[2]..bend[2]]); + } +} + +pub struct LastFrames { + pub frame_offset: u64, + pub frames: VecDeque<Frame>, } |