Skip to content

Commit fe647f4

Browse files
committed
test(verify): root-cause every full-tier failure and AVF flake
Full tier on all three platforms had unexpected failures, and several AVF entries cited the wrong mechanism. Each entry now states a measured cause: - Pool position capping in the AVAssetReader decoder (a reader that decoded past a frame is reused for it without a reset) explains the one-frame-ahead answers. seek-native/keyframes60 is deterministic and now strict, with a three-seek repro. The storm30 cases, the 60 fps transition, backward-hold, camera-pts-late, the vfr storm and the 120 s jitter export and playback all pass with the decoder changes of #2595, measured on Apple silicon. - The decoder's 250 ms idle timeout makes several outcomes depend on request timing: a 300 ms pause flips decoder-model seeds 28, 53 and 59 from future to stale, removes the seek-native storm's ahead answers, makes the 60 fps transition correct and reproduces the last-frame stale answer of the 120 s jitter playback. Those entries are flaky with that mechanism. - editing seed 10 is the FFmpeg first-frame shortcut, reproduced with the FFmpeg decoder on macOS. - The 120 s jitter export's nondeterminism and torn frame, the 30 s audio cross-fades and the recorded-Studio isolated ahead frame are the IOSurface source lifetime bug (absent with sources retained). - Full-tier variants with identical failures share the existing entries (30 s long cross-fade, 120 s jitter playback on FFmpeg).
1 parent a287f53 commit fe647f4

2 files changed

Lines changed: 71 additions & 26 deletions

File tree

‎crates/rendering/src/decoder/model/expectations.toml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -418,16 +418,16 @@ case = "decoder-model/avf/vfr/keyframe-seeks/playback"
418418
class = "future"
419419
seeds = "28 53 59"
420420
flaky = true
421-
reason = "AVAssetReader seeks: the reader starts on the keyframe time rounded to 10 ms, so it can return the previous GOP's last frame under the keyframe's number, and a reused pooled reader answers from frames cached by an earlier, unrelated seek Seeds 28, 53 and 59 fail in every run, but their first wrong answer is a future frame in some macos-15 runs (38730081267, 38732325087, 38740252853) and a stale frame in others (38743345280), so each class is flaky for these seeds"
422-
link = "https://github.com/CapSoftware/Cap/pull/2603"
421+
reason = "Seeds 28, 53 and 59 fail in every run; which wrong answer comes first depends on the wall clock. Without a stall the first wrong answer is a future one at a seek (seed 28 request 61, seed 53 request 8, seed 59 request 9: the next sample, e.g. sample 68 for 67): pool position capping, the reader's pool position is capped to the newest request (avassetreader.rs update_decoder_position(decoder_idx, capped)) so a reader that already decoded past the sample is reused without a reset. When the test thread stalls for 250 ms or more, the decoder's idle timeout (IDLE_READER_TIMEOUT, avassetreader.rs) clears the cache and reader state, the later requests take another path and the first wrong answer is a stale one from the wrong-GOP seek (reader started on the keyframe time rounded to 10 ms). Measured on Apple silicon: future 3 of 3 per seed without a stall, stale for all three seeds with a 300 ms stall before every request, and for seed 53 with a single 300 ms stall before request 6 (a 240 ms stall keeps future). macos-15: future in 6 of 7 runs, stale in 1 (38743345280). With #2595's decoder changes seed 28 passes and seeds 53 and 59 keep only the stale (wrong-GOP) answer"
422+
link = "https://github.com/CapSoftware/Cap/pull/2595 https://github.com/CapSoftware/Cap/pull/2603"
423423

424424
[[xfail]]
425425
case = "decoder-model/avf/vfr/keyframe-seeks/playback"
426426
class = "stale"
427427
seeds = "28 53 59"
428428
flaky = true
429-
reason = "AVAssetReader seeks: the reader starts on the keyframe time rounded to 10 ms, so it can return the previous GOP's last frame under the keyframe's number, and a reused pooled reader answers from frames cached by an earlier, unrelated seek Seeds 28, 53 and 59 fail in every run, but their first wrong answer is a future frame in some macos-15 runs (38730081267, 38732325087, 38740252853) and a stale frame in others (38743345280), so each class is flaky for these seeds"
430-
link = "https://github.com/CapSoftware/Cap/pull/2603"
429+
reason = "Seeds 28, 53 and 59 fail in every run; which wrong answer comes first depends on the wall clock. Without a stall the first wrong answer is a future one at a seek (seed 28 request 61, seed 53 request 8, seed 59 request 9: the next sample, e.g. sample 68 for 67): pool position capping, the reader's pool position is capped to the newest request (avassetreader.rs update_decoder_position(decoder_idx, capped)) so a reader that already decoded past the sample is reused without a reset. When the test thread stalls for 250 ms or more, the decoder's idle timeout (IDLE_READER_TIMEOUT, avassetreader.rs) clears the cache and reader state, the later requests take another path and the first wrong answer is a stale one from the wrong-GOP seek (reader started on the keyframe time rounded to 10 ms). Measured on Apple silicon: future 3 of 3 per seed without a stall, stale for all three seeds with a 300 ms stall before every request, and for seed 53 with a single 300 ms stall before request 6 (a 240 ms stall keeps future). macos-15: future in 6 of 7 runs, stale in 1 (38743345280). With #2595's decoder changes seed 28 passes and seeds 53 and 59 keep only the stale (wrong-GOP) answer"
430+
link = "https://github.com/CapSoftware/Cap/pull/2595 https://github.com/CapSoftware/Cap/pull/2603"
431431

432432
[[xfail]]
433433
case = "decoder-model/avf/vfr/keyframe-seeks/playback"

0 commit comments

Comments
 (0)