add some more compression variations
This commit is contained in:
parent
62ee8a6efa
commit
a1bcf7d90b
4 changed files with 168 additions and 54 deletions
|
@ -53,58 +53,58 @@ pub fn cell_diff_4_vertical(prev_frame: &Frame, frame: &Frame, loss: usize) -> E
|
|||
}
|
||||
}
|
||||
|
||||
// pub fn cell_diff_4_vertical_large(prev_frame: &Frame, frame: &Frame, loss: usize) -> EncodedFrame {
|
||||
// let loss = loss / 4;
|
||||
// const CELLS_X: usize = WIDTH / 4;
|
||||
// const CELLS_Y: usize = HEIGHT / 4;
|
||||
pub fn cell_diff_8_vertical_big(prev_frame: &Frame, frame: &Frame, loss: usize) -> EncodedFrame {
|
||||
let loss = loss / 8;
|
||||
const CELLS_X: usize = WIDTH / 8;
|
||||
const CELLS_Y: usize = HEIGHT / 8;
|
||||
|
||||
// let mut modified_cells = [[0; CELLS_Y]; CELLS_X];
|
||||
let mut modified_cells = [[0; CELLS_Y]; CELLS_X];
|
||||
|
||||
// for cellx in 0..CELLS_X {
|
||||
// for celly in 0..CELLS_Y {
|
||||
// let mut changed = 0;
|
||||
// for dx in 0..4 {
|
||||
// for dy in 0..4 {
|
||||
// let x = cellx * 4 + dx;
|
||||
// let y = celly * 4 + dy;
|
||||
// let pixel = frame[x][y];
|
||||
for cellx in 0..CELLS_X {
|
||||
for celly in 0..CELLS_Y {
|
||||
let mut changed = 0;
|
||||
for dx in 0..8 {
|
||||
for dy in 0..8 {
|
||||
let x = cellx * 8 + dx;
|
||||
let y = celly * 8 + dy;
|
||||
let pixel = frame[x][y];
|
||||
|
||||
// if pixel != prev_frame[x][y] {
|
||||
// changed += 1;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if changed > loss {
|
||||
// modified_cells[cellx][celly] = 1;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// let mut changed_pixels = Vec::new();
|
||||
// for x in 0..WIDTH {
|
||||
// for y in 0..HEIGHT {
|
||||
// let cellx = x / 4;
|
||||
// let celly = y / 4;
|
||||
if pixel != prev_frame[x][y] {
|
||||
changed += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if changed > loss {
|
||||
modified_cells[cellx][celly] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut changed_pixels = Vec::new();
|
||||
for x in 0..WIDTH {
|
||||
for y in 0..HEIGHT {
|
||||
let cellx = x / 8;
|
||||
let celly = y / 8;
|
||||
|
||||
// if modified_cells[cellx][celly] != 0 {
|
||||
// changed_pixels.push(frame[x][y]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// let mut modified_cells_flat = Vec::new();
|
||||
// for x in 0..CELLS_X {
|
||||
// for y in 0..CELLS_Y {
|
||||
// modified_cells_flat.push(modified_cells[x][y]);
|
||||
// }
|
||||
// }
|
||||
// let mut data = Vec::new();
|
||||
// data.extend_from_slice(&pack_nybbles(rle_encode(&modified_cells_flat, 15)));
|
||||
// data.extend_from_slice(&rle_255_encode(&changed_pixels));
|
||||
if modified_cells[cellx][celly] != 0 {
|
||||
changed_pixels.push(frame[x][y]);
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut modified_cells_flat = Vec::new();
|
||||
for x in 0..CELLS_X {
|
||||
for y in 0..CELLS_Y {
|
||||
modified_cells_flat.push(modified_cells[x][y]);
|
||||
}
|
||||
}
|
||||
let mut data = Vec::new();
|
||||
data.extend_from_slice(&pack_nybbles(rle_encode(&modified_cells_flat, 15)));
|
||||
data.extend_from_slice(&rle_255_encode(&changed_pixels));
|
||||
|
||||
// EncodedFrame {
|
||||
// encoding: Encoding::CellDiff4VV_large,
|
||||
// data,
|
||||
// }
|
||||
// }
|
||||
EncodedFrame {
|
||||
encoding: Encoding::CellDiff8VBig,
|
||||
data,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn cell_diff_8_vertical(prev_frame: &Frame, frame: &Frame, loss: usize) -> EncodedFrame {
|
||||
const CELLS_X: usize = WIDTH / 8;
|
||||
|
@ -348,6 +348,37 @@ pub fn rle_vertical_ext(_prev_frame: &Frame, frame: &Frame) -> EncodedFrame {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
pub fn rle_vertical_16(_prev_frame: &Frame, frame: &Frame) -> EncodedFrame {
|
||||
let mut data = Vec::new();
|
||||
let mut last_pixel = 0;
|
||||
let mut run: u16 = 0;
|
||||
for x in 0..WIDTH {
|
||||
for y in 0..HEIGHT {
|
||||
let pixel = frame[x][y];
|
||||
if pixel != last_pixel || run == 0xffff {
|
||||
data.push((run >> 8) as u8);
|
||||
data.push((run & 0xff) as u8);
|
||||
if run == 0xffff && pixel == last_pixel {
|
||||
// inserting dummy run because we ran out of max len
|
||||
data.push(0);
|
||||
data.push(0);
|
||||
}
|
||||
run = 1;
|
||||
} else {
|
||||
run += 1;
|
||||
}
|
||||
last_pixel = pixel;
|
||||
}
|
||||
}
|
||||
data.push((run >> 8) as u8);
|
||||
data.push((run & 0xff) as u8);
|
||||
EncodedFrame {
|
||||
encoding: Encoding::RLEVertical16,
|
||||
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