Skip to content

Commit a429bf6

Browse files
committed
fix(compositor): open the settle window after a paused seek too
A paused seek goes through `present_frame`, which composes exactly once and skipped the window the previous commit added — so the mask of the PREVIOUS position stayed on screen until some other action caused a compose. Same blind spot as the one that commit fixed, one branch over. Both call sites now go through `open_settle_window`, so a forgotten `last_settle` cannot make the loop recompose at its own rate instead of the segmentation's.
1 parent 1322223 commit a429bf6

1 file changed

Lines changed: 27 additions & 3 deletions

File tree

‎crates/compositor/src/live.rs‎

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,13 @@ const SETTLE_WINDOW: Duration = Duration::from_millis(500);
11051105
/// pas celle de la boucle — recomposer à 250 Hz n'accélérerait pas une inférence limitée à 30 Hz.
11061106
const SETTLE_STEP: Duration = Duration::from_millis(33);
11071107

1108+
/// Ouvre (ou rouvre) la fenêtre de stabilisation. Les deux appelants — changement en pause et
1109+
/// seek en pause — doivent poser la MÊME paire : un `last_settle` oublié ferait recomposer à la
1110+
/// cadence de la boucle au lieu de celle de la segmentation.
1111+
fn open_settle_window(now: Instant) -> (Option<Instant>, Instant) {
1112+
(Some(now + SETTLE_WINDOW), now)
1113+
}
1114+
11081115
/// Faut-il recomposer alors que RIEN n'a changé ? Oui tant que la fenêtre de stabilisation
11091116
/// court et que la cadence le permet. Extrait de la boucle pour être vérifiable sans GPU.
11101117
fn should_settle(now: Instant, settle_until: Option<Instant>, last_settle: Instant) -> bool {
@@ -1600,6 +1607,11 @@ unsafe fn render_thread(
16001607
if let Some(target) = requested {
16011608
if player.present_frame(&comp, &cfg, target)? {
16021609
stepped = true;
1610+
// Un seek en pause compose UNE fois, exactement comme un changement de param :
1611+
// la frame webcam a changé, donc son masque aussi, et il arrivera deux composes
1612+
// plus tard. Sans cette fenêtre, le masque de la position PRÉCÉDENTE reste
1613+
// affiché jusqu'à ce qu'une autre action provoque un compose.
1614+
(settle_until, last_settle) = open_settle_window(now);
16031615
}
16041616
acc = 0.0; // resynchronise l'accumulateur de lecture libre après un seek
16051617
} else if shared.playing.load(Ordering::Relaxed) {
@@ -1712,8 +1724,7 @@ unsafe fn render_thread(
17121724
}
17131725
} else if first || ip_changed || scene_changed || clip_changed || resized {
17141726
// pause : recompose la frame courante (param / scène / clip / résolution changés).
1715-
settle_until = Some(now + SETTLE_WINDOW);
1716-
last_settle = now;
1727+
(settle_until, last_settle) = open_settle_window(now);
17171728
let _ = player.recompose(&comp, &cfg);
17181729
stepped = true;
17191730
} else if should_settle(now, settle_until, last_settle) {
@@ -1939,7 +1950,7 @@ pub fn run_standalone(_screen: &str, _webcam: &str, _cursor_json: &str) -> anyho
19391950

19401951
#[cfg(test)]
19411952
mod tests {
1942-
use super::{should_settle, SETTLE_STEP, SETTLE_WINDOW};
1953+
use super::{open_settle_window, should_settle, SETTLE_STEP, SETTLE_WINDOW};
19431954
use std::time::Instant;
19441955

19451956
/// Le bug d'origine : en pause, un seul recompose par changement, donc le masque de
@@ -1964,6 +1975,19 @@ mod tests {
19641975
);
19651976
}
19661977

1978+
/// Un seek en pause compose aussi UNE seule fois : la frame webcam a changé, son masque
1979+
/// arrive deux composes plus tard. Le chemin `present_frame` doit donc ouvrir la même
1980+
/// fenêtre que le chemin « un param a changé », sans recomposer immédiatement.
1981+
#[test]
1982+
fn a_paused_seek_opens_the_same_window() {
1983+
let t0 = Instant::now();
1984+
let (until, last) = open_settle_window(t0);
1985+
1986+
assert!(!should_settle(t0, until, last), "pas de recompose en boucle juste après le seek");
1987+
assert!(should_settle(t0 + SETTLE_STEP, until, last), "le tour suivant livre le masque");
1988+
assert!(!should_settle(t0 + SETTLE_WINDOW, until, last), "puis la fenêtre se referme");
1989+
}
1990+
19671991
use super::*;
19681992

19691993
fn multiclip_scene() -> Scene {

0 commit comments

Comments
 (0)