@@ -650,7 +650,7 @@ impl Writer {
650
650
let mut prev_frame_keeps = false ;
651
651
let mut frame_index = 0 ;
652
652
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 ( ) {
654
654
655
655
if importance_map. is_none ( ) {
656
656
importance_map = Some ( new_importance_map) ;
@@ -681,15 +681,6 @@ impl Writer {
681
681
let importance_map = importance_map. take ( ) . ok_or ( Error :: ThreadSend ) ?; // always set at the beginning
682
682
683
683
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
-
693
684
let end_pts = if let Some ( & DiffMessage { pts : next_pts, .. } ) = inputs. peek ( ) {
694
685
next_pts
695
686
} else {
@@ -704,14 +695,18 @@ impl Writer {
704
695
}
705
696
}
706
697
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
+
708
708
let needs_transparency = frame_index > 0 || ( frame_index == 0 && first_frame_has_transparency) ;
709
709
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
- }
715
710
716
711
remap_queue. push ( frame_index as usize , RemapMessage {
717
712
ordinal_frame_number,
0 commit comments