Record Windows startup GUI stalls and capture-gap scheduling correction

This commit is contained in:
evgeny committed 2026-10-19 18:25:34 +02:00
1 parent 40dcc76adb
commit c92f7991ec
1 file changed
+26 -1
+26 -1
View File
@@ -950,7 +950,7 @@ Decoder получает кадры строго последовательно,
Playout больше не содержит DROP_LATE/DROP_SCHEDULE. Invalid/order остаётся диагностируемой ошибкой.
CallTimeline публикует rate_ppm из фактического SourceSpan SoundTouch -> PCM на текущей позиции устройства.
База темпа видео max(1x, audio rate), коррекция 2 * max(0, audioPTS-framePTS) ppm, предел 1.6x.
После показа следующий интервал равен deltaPTS/speed; после опоздания отсчитывается от фактической
После показа следующий интервал равен min(deltaPTS, 1000000/format.fps)/speed; после опоздания отсчитывается от фактической
выдачи, поэтому очередь не выдаётся мгновенной пачкой. После отсутствия готовых кадров привязка снимается:
прошедшее ожидание данных не добавляется второй раз. Дополнительный стартовый резерв не создаётся.
Видео может временно отставать от звука более 50мс, затем догоняет; опережение ограничено 40мс.
@@ -973,3 +973,28 @@ test_call_video_port проверяет частично принятую пач
test_call_video_flush проверяет bounded burst, событие send_ready, аудиогейт и отмену callbacks.
Qt clock требует 90/90 при RX/GUI-паузах; GPU-тест проверяет каждый исходный PTS через смену bitrate
и равенство decoded + pending входам, без настоящего Windows драйвера.
Windows 1.log, повторный прогон 19.10.2026
В 19:16:31–19:16:41 decoder занимает 1.7–4.4мс, но notification ждёт до 113мс,
а подтверждение paint — до 227мс. Показ падает до 3–6fps, RX FIFO заполняется,
ожидание уже принятого кадра до decode достигает 2.66с. Аудио в этот период работает:
WASAPI padding 20мс, callback около 10мс, аудиочасы valid=1. Это локальное ограничение GUI;
длительность самого paint и причина задержки event loop в старой диагностике не различались.
После 19:16:41 notification обычно <1.8мс, paint acknowledgement <9мс, показ 29–32fps.
Остаточное опоздание RX sleep достигает 19.2мс; точность Windows timer отдельно не исправлялась.
Отсутствие кадров около 19:17:04–19:17:10 заканчивается generation=2; пользователь подтвердил один перезапуск.
Выявлена дополнительная искусственная пауза playout: gap_pts_us=2264933 при готовом lookahead
превращался в cadence_us=1424602 из-за deltaPTS/1.6. Захват мог быть приостановлен upstream
backpressure, но эта пауза проходилась второй раз на показе. Теперь интервал ограничен FPS текущего
формата, реальное опережение по-прежнему удерживается audio PTS. Encoded/decoded кадры не удаляются.
source_gaps/source_gap_max_us и первый video source gap за секунду показывают устранённый лишний интервал.
Тест queued_capture_gap моделирует готовые соседние кадры с разрывом 0.5/2.265/10с на 15/30/60fps;
следующий кадр выходит за один обычный интервал, а граница опережения аудио 40мс сохраняется.
Для установления причины стартовой задержки GUI добавлены call=debug сводки:
- video GUI loop: частота timer 20мс и максимальный разрыв event loop, первая задержка >50мс — WARN;
- video GUI delivery image_slot_max_us: время синхронных slots imageChanged, отдельно от notification wait;
- video GUI paint: ожидание UpdateRequest -> paintEvent, prepare/draw/overlay/painter.end,
размеры изображения/окна, DPR при первом замедлении, число move/resize событий.
Замена renderer или изменение Windows system timer без этих измерений не выполнялись.