From 390747343b6511935d39b2545731dceab102bbbb Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 20 Oct 2026 01:28:59 +0200 Subject: [PATCH] Document background codec preparation and complete probe validation --- doc/call_video.txt | 50 ++++++++++++++++++++++++++++++++++++++++++++++ doc/tasks.md | 24 +++++++++++++++++----- 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/doc/call_video.txt b/doc/call_video.txt index fa3c830e..635e84a7 100644 --- a/doc/call_video.txt +++ b/doc/call_video.txt @@ -1472,3 +1472,53 @@ Linux ACTIVE 01:01:17.892, Samsung RX CAPS уже через 4мс, duplex че Поэтому раннее открытие encode-only порта при продолжающейся подготовке RX требует отличать подготовку от окончательного отказа либо перехода к проверке только выбранного режима при запуске. Непроверенные режимы нельзя молча выдавать за прошедшие аппаратную матрицу. + +Подготовка codec при старте приложения, 20.10.2026 +Задержка e55c56204f7bf159 устранена переносом всей проверки из начала звонка в фоновый запуск. +CallVideoEngine::capabilities — единый процессный кэш desktop encoder/decoder, защищённый mutex. +main запускает подготовку через std::async после создания окна; event loop не ждёт future. +Завершение приложения отменяет подготовку и забирает future до освобождения зависимостей. +TX звонка читает готовый кэш; конкурентный ранний звонок ждёт ту же пробу с отменой по stop. +Полная decoder matrix сохраняет собственный кэш даже при последующей отмене encoder matrix; +частичные общие CAPS не публикуются. Успешные проверки encoder больше не повторяются каждый звонок. + +Android ChatApplication запускает один отдельный call-video-probe thread после инициализации приложения. +Он прогревает процессные кэши CallVideoCodec.probeDecoders/probe; Activity, разрешение камеры, +захват, Surface и сетевой экземпляр для этого не нужны. Ранний звонок ждёт соответствующий lock, +после прогрева использует результаты без создания тестовых codec. Опрос/открытие подключаемых камер +по-прежнему выполняется отдельно. Проверка выбранного рабочего encoder перед публикацией формата +и обработка отказа GPU остаются на месте. Протокол/CAPS и тракт кадров не менялись. + +Ускорение не сокращает матрицу и число кадров: каждый профиль/размер/FPS/ориентация всё ещё +проверяется по восьми кадрам с точными PTS и геометрией. До первого выхода сохраняется исходный +pacing для измерения pipeline, затем оставшиеся кадры подаются без ожидания следующего периода. +Desktop проверяет весь хвост до EOS, в том числе выход до EOS; Android требует вернуть все восемь +в пределах прежнего deadline. Кэш содержит только завершённый результат, а не декларации API драйвера. +Это заменяет промежуточную оптимизацию с завершением после первого кадра: полное покрытие сохранено. + +Регрессионная GPU-граница FFmpeg: первый выход задержан до третьего input, хвост удерживается +до EOS. Все 48 вариантов по 8 кадров: inputs=outputs=384, first_inputs=3, max_inputs_per_mode=8. +Настоящая матрица Linux VAAPI/CPU: ~8.3с до изменения -> 2.740с после, прежние decode masks=3/3. +Qt video encoder/GPU/clock/camera 4/4 PASS вне sandbox; sandbox запрещал локальные camera IPC сокеты. +Дополнительный test_call_video_clock прерывает подготовку посреди encoder, затем проверяет +полный прогрев без повторной decoder matrix, работающий GUI timer и три cache hit без codec opens. +Все сценарии RX/ACK/60fps/stop прошли; /tmp/video-warmup-clock-verified-test.log. + +Аппаратная проба второго Android отдельным app_process: RX 10799мс, encode 9992мс, всего 20792мс +вместо прежних 23811мс. Три повторных обращения — суммарно 309мкс, режимы неизменны: decoder=12, +encoder=10. Во время обычного старта основного приложения время зависит от планирования Android: +Samsung 18759мс (decoder=12, encoder=18), второй телефон 47770мс (decoder=12, encoder=10). +Оба установленных приложения завершили подготовку до следующего звонка. При немедленном звонке +после старта процесса сохраняется ожидание оставшейся проверки; обещания нулевого cold-start нет. + +APK/118 unit и C build PASS. check.sh: 162/164, прежний encrypted_attachment phase=5/heartbeats=12001 +(артефакт /tmp/utun_encrypted_attachment_YrZw7E), новый зафиксированный flaky local_transport_packets +line=198 invitations-before==8; отдельный повтор PASS. Код транспорта/вложений здесь не менялся. +Логи: /tmp/video-warmup-android-build.log, /tmp/video-warmup-qt-tests.log, +/tmp/video-warmup-cold-linux.log, /tmp/video-warmup-full-check.log, +/tmp/video-warmup-local-packets-retry.log, /tmp/video-warmup-sm-startup.log, +/tmp/video-warmup-q8-full.log. Оба телефона обновлены; временные аппаратные пробы удалены с телефона. + +Локальный desktop штатно перезапущен, новый pid=243509: GUI startup 01:28:04.487, +decoder matrix завершена через 2717644мкс, общая подготовка через 4697835мкс (encode=2/1, decode=3/3). +Самостоятельный сетевой звонок не инициировался; первый кадр нового живого звонка ещё не измерен. diff --git a/doc/tasks.md b/doc/tasks.md index dcd461e6..6184d474 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,14 +4,28 @@ ## Текущие задачи -[ ] **Desktop: подготовка собственных decoder блокирует первую отправку камеры** — 20.10.2026: +[+] **Desktop/Android: codec probes при запуске вместо задержки каждого звонка** — 20.10.2026: Звонок e55c56204f7bf159, локальный Linux: ACTIVE 01:01:17.892, decoder probes до 01:01:26.255, encoder probes до 01:01:28.284. Samsung уже опубликовал RX CAPS за 4мс; первый input через 10459мс, фактический показ через 10648мс. Источник задержки — последовательная матрица TX worker Linux. - Нельзя просто публиковать decode=0: текущий отправитель второго устройства принимает это за - окончательную недоступность режима и выключает камеру. Нужен согласованный контракт подготовки - возможностей/проверки выбранного режима. Логи: /tmp/call-startup-sm-first-call.log, - tools/chatgui/build/vibechat.log (живой файл). Подробности: doc/call_video.txt. + Проверки обоих направлений перенесены в фоновую подготовку при старте приложения, результаты + сохраняются до завершения процесса. Desktop теперь кэширует и encoder, Android прогревает прежний кэш. + Все режимы/профили/ориентации и восемь кадров сохраняются; pacing нужен только до первого выхода, + после измерения pipeline хвост проверяется без искусственных пауз. GPU/CPU fallback не менялся. + Decoder Linux: 8.3 -> 2.7с; настоящий запуск обновлённого GUI: вся подготовка 4.7с, без камеры/сети. + Samsung: фоновая подготовка 18.8с, второй телефон 47.8с; оба завершили её до следующего звонка. + До завершения прогрева ранний звонок ждёт оставшуюся подготовку, частичные CAPS не публикуются. + Qt video/GPU/clock/camera 4/4 и дополнительная отмена/кэш/GUI проверка PASS; Android APK/118 unit PASS. + check.sh 162/164: прежний encrypted_attachment и local_transport_packets (отдельный повтор PASS). + Оба телефона обновлены, локальный GUI штатно перезапущен. Нового живого звонка ещё не было. + Логи: /tmp/video-warmup-qt-tests.log, /tmp/video-warmup-clock-verified-test.log, + /tmp/video-warmup-full-check.log; подробности: doc/call_video.txt. + +[ ] **Разобрать нестабильный flood-тест test_local_transport_packets** — 20.10.2026: + Общий check.sh при подготовке codec cache: line=198 failed: invitations - before == 8. + Отдельный повтор PASS: миллион hostile packets, bounded flood/events/memory, discovery recovery. + Код local transport не менялся. Логи: /tmp/video-warmup-full-check.log, + /tmp/video-warmup-local-packets-retry.log; причина и связь с нагрузкой пока не установлены. [+] **Android: fullscreen вдоль длинной стороны и повторное использование codec probes** — 20.10.2026: Общее вписывание со стримами поворачивает только изображение большого видео, интерфейс остаётся