add RLEVerticalExt (16 bit run length support)
This commit is contained in:
parent
90f648e0b0
commit
62ee8a6efa
8 changed files with 77689 additions and 106875 deletions
|
@ -1,6 +1,6 @@
|
|||
use crate::*;
|
||||
|
||||
pub fn cell_diff_4_vertical_small(prev_frame: &Frame, frame: &Frame, loss: usize) -> EncodedFrame {
|
||||
pub fn cell_diff_4_vertical(prev_frame: &Frame, frame: &Frame, loss: usize) -> EncodedFrame {
|
||||
let loss = loss / 4;
|
||||
const CELLS_X: usize = WIDTH / 4;
|
||||
const CELLS_Y: usize = HEIGHT / 4;
|
||||
|
@ -48,7 +48,7 @@ pub fn cell_diff_4_vertical_small(prev_frame: &Frame, frame: &Frame, loss: usize
|
|||
data.extend_from_slice(&rle_255_encode(&changed_pixels));
|
||||
|
||||
EncodedFrame {
|
||||
encoding: Encoding::CellDiff4VV_small,
|
||||
encoding: Encoding::CellDiff4VV,
|
||||
data,
|
||||
}
|
||||
}
|
||||
|
@ -306,6 +306,48 @@ pub fn rle_vertical(_prev_frame: &Frame, frame: &Frame) -> EncodedFrame {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn rle_vertical_ext(_prev_frame: &Frame, frame: &Frame) -> EncodedFrame {
|
||||
let mut data = Vec::new();
|
||||
let mut last_pixel = 0;
|
||||
let mut run: u16 = 0;
|
||||
|
||||
let push_run = |data: &mut Vec<u8>, run| {
|
||||
if run < 256 {
|
||||
data.push(run as u8);
|
||||
} else {
|
||||
// double zero to mark 16 bit run length
|
||||
// if data.last() != Some(&0) {
|
||||
// }
|
||||
data.push(0);
|
||||
data.push(0);
|
||||
data.push((run >> 8) as u8);
|
||||
data.push((run & 0xff) as u8);
|
||||
}
|
||||
};
|
||||
|
||||
for x in 0..WIDTH {
|
||||
for y in 0..HEIGHT {
|
||||
let pixel = frame[x][y];
|
||||
if pixel != last_pixel || run == 0xffff {
|
||||
push_run(&mut data, run);
|
||||
if run == 0xffff && pixel == last_pixel {
|
||||
// inserting dummy run because we ran out of max len
|
||||
data.push(0);
|
||||
}
|
||||
run = 1;
|
||||
} else {
|
||||
run += 1;
|
||||
}
|
||||
last_pixel = pixel;
|
||||
}
|
||||
}
|
||||
push_run(&mut data, run);
|
||||
EncodedFrame {
|
||||
encoding: Encoding::RLEVerticalExt,
|
||||
data,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fill_white(_prev_frame: &Frame, _frame: &Frame, _loss: usize) -> EncodedFrame {
|
||||
EncodedFrame {
|
||||
encoding: Encoding::FillWhite,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue