Skip to content

Commit eb51054

Browse files
committed
Parallelize image transparency update
1 parent 1bc89ab commit eb51054

File tree

1 file changed

+11
-16
lines changed

1 file changed

+11
-16
lines changed

src/lib.rs

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ impl Writer {
650650
let mut prev_frame_keeps = false;
651651
let mut frame_index = 0;
652652
let mut importance_map = None;
653-
while let Some(DiffMessage { mut image, pts, frame_duration, ordinal_frame_number, importance_map: new_importance_map }) = inputs.next() {
653+
while let Some(DiffMessage { image, pts, frame_duration, ordinal_frame_number, importance_map: new_importance_map }) = inputs.next() {
654654

655655
if importance_map.is_none() {
656656
importance_map = Some(new_importance_map);
@@ -681,15 +681,6 @@ impl Writer {
681681
let importance_map = importance_map.take().ok_or(Error::ThreadSend)?; // always set at the beginning
682682

683683
if !prev_frame_keeps || importance_map.iter().any(|&px| px > 0) {
684-
if prev_frame_keeps {
685-
// if denoiser says the background didn't change, then believe it
686-
// (except higher quality settings, which try to improve it every time)
687-
let bg_keep_likelihood = u32::from(settings.s.quality.saturating_sub(80) / 4);
688-
if settings.s.fast || (settings.s.quality < 100 && (frame_index % 5) >= bg_keep_likelihood) {
689-
image.pixels_mut().zip(&importance_map).filter(|&(_, &m)| m == 0).for_each(|(px, _)| *px = RGBA8::new(0,0,0,0));
690-
}
691-
}
692-
693684
let end_pts = if let Some(&DiffMessage { pts: next_pts, .. }) = inputs.peek() {
694685
next_pts
695686
} else {
@@ -704,14 +695,18 @@ impl Writer {
704695
}
705696
}
706697
Ok(())
707-
}, move |(end_pts, image, mut importance_map, ordinal_frame_number, frame_index, dispose, first_frame_has_transparency, prev_frame_keeps)| {
698+
}, move |(end_pts, mut image, importance_map, ordinal_frame_number, frame_index, dispose, first_frame_has_transparency, prev_frame_keeps)| {
699+
if prev_frame_keeps {
700+
// if denoiser says the background didn't change, then believe it
701+
// (except higher quality settings, which try to improve it every time)
702+
let bg_keep_likelihood = u32::from(settings.s.quality.saturating_sub(80) / 4);
703+
if settings.s.fast || (settings.s.quality < 100 && (frame_index % 5) >= bg_keep_likelihood) {
704+
image.pixels_mut().zip(&importance_map).filter(|&(_, &m)| m == 0).for_each(|(px, _)| *px = RGBA8::new(0,0,0,0));
705+
}
706+
}
707+
708708
let needs_transparency = frame_index > 0 || (frame_index == 0 && first_frame_has_transparency);
709709
let (liq, remap, liq_image, out_buf) = Self::quantize(image, &importance_map, frame_index == 0, needs_transparency, prev_frame_keeps, settings)?;
710-
let max_loss = settings.gifsicle_loss();
711-
for imp in &mut importance_map {
712-
// encoding assumes rgba background looks like encoded background, which is not true for lossy
713-
*imp = ((256 - u32::from(*imp)) * max_loss / 256).min(255) as u8;
714-
}
715710

716711
remap_queue.push(frame_index as usize, RemapMessage {
717712
ordinal_frame_number,

0 commit comments

Comments
 (0)