diff --git a/doc/call_video.txt b/doc/call_video.txt index 1d9ce3c6..0524b6ad 100644 --- a/doc/call_video.txt +++ b/doc/call_video.txt @@ -1391,3 +1391,46 @@ encode/decode фазы 640x480/480x640 при 30/50/60; более высоки /tmp/video60-android-final-build.log, /tmp/video60-desktop-cross.log; артефакты Samsung /tmp/video60-sm-results/. Живой звонок новой камеры на Windows не проверен. Установленные приложения не заменялись; аппаратные проверки выполнялись отдельным app_process. Обе стороны нужно обновить для новых режимов. + +Android Surface ACK: устранение фризов 1–2 fps на Samsung, 20.10.2026 +Свежий logcat /tmp/video-freeze-sm.log, звонок 8563820959416855278, 01:31:23–01:32:39: +77 playout сводок, медиана 1.99 показанных fps, медиана dispatch-to-ACK 538мс, максимум 1019мс. +Очередь ready=2, awaiting=1; decode останавливается за ожидающим Surface ACK. Смена размера/FPS +не устраняет паузы. Это конкретное ожидание подтверждения GUI, не доказательство медленного decoder. + +ViewRootImpl в performDraw захватывает список frame commit callbacks ДО draw TextureView. +Прежний onSurfaceTextureUpdated вызывался уже во время draw и регистрировал callback слишком поздно. +Он оставался до следующего постороннего UI draw (статистика каждые 500мс). RX ждал ACK, +не отправлял следующий кадр на Surface, а без нового кадра TextureView сам не создавал следующий draw. +Отсюда цикл ожидания и накопление задержки; пропуск decoded presentation не мог устранить причину. + +CallVideoTexture теперь регистрирует frame commit в OnPreDrawListener, до захвата списка ViewRoot. +Timestamp SurfaceTexture читается после commit того же кадра и сверяется с единственным ожидающим PTS. +Посторонний draw со старым timestamp не подтверждает новый кадр: настоящий TextureView update сам +назначит следующий draw/commit. На API<29 сохраняется postOnAnimation с ожиданием правильного timestamp. +Listener снимается при detach; старые callback проверяют закрытие и идентичность Surface. +Нет постоянного invalidate-цикла, дополнительного draw после каждого кадра и ACK по таймауту. +Encoded порядок, три decoded места, playout/rate/protocol не менялись. +Диагностика call=debug: video surface updates/commits/updateToCommitMaxUs/pts и +video playback acknowledged/surfaceAckMaxUs/surfaceWaitMs разделяют texture update, commit и RX ACK. +Документация API: https://developer.android.com/reference/android/view/ViewTreeObserver#registerFrameCommitCallback(java.lang.Runnable) + +VideoSurfaceProbeActivity в отдельном audio-probe APK проверяет настоящий TextureView/EGL: +один EGL-кадр до ACK, точные presentation timestamps, посторонний UI draw раз в 500мс. +Команда: adb shell am start -n com.utun.audioprobe/.VideoSurfaceProbeActivity --ei fps 60 --ez legacy false +legacy=true воспроизводит прежнюю регистрацию в onSurfaceTextureUpdated. +На Samsung старая схема: 15 ACK /8.028с, максимальное ожидание 516414мкс — дефект воспроизведён. +Исправленная схема 60fps: 483 ACK /8.050с, максимум 21391мкс; все ACK соответствуют ожидающим PTS. +30fps: 241 ACK /8.033с, максимум 31071мкс. Три посторонних draw увидели старый timestamp +и правильно дождались настоящего обновления; это не потеря кадра и не неверный ACK. +Тест проверяет FPS и число подтверждений/входов, а не отсутствие законных промежуточных UI draw. +Лог: /tmp/video-surface-sm-probe.log. Проба второго телефона не получила Surface при Dozing; +её остановили, устройство не разблокировали, результатом проверки показа это не считается. + +C-сборка, Android assembleDebug и 114 unit — PASS. Полный check.sh: 162/164, прежние сбои: +local_transport peers():95 после TTL age_ms=30335 (отдельный повтор PASS), encrypted_attachment +phase=5/heartbeats=12001, артефакт /tmp/utun_encrypted_attachment_3XZGxj. +Логи: /tmp/video-surface-freeze-core-build.log, /tmp/video-surface-freeze-android-final.log, +/tmp/video-surface-freeze-full-check.log, /tmp/video-surface-freeze-local-retry.log. +Основное приложение на телефонах в этой проверке не заменялось; готовый исправленный APK — +tools/chatgui-android/app/build/outputs/apk/debug/app-debug.apk. Сетевой звонок с новым APK ещё не проверен. diff --git a/doc/tasks.md b/doc/tasks.md index 6c8529c3..b7edefcb 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,16 @@ ## Текущие задачи +[+] **Samsung RX: фризы из-за поздней регистрации Surface ACK** — 20.10.2026: + В живом логе 1.99 fps, ожидание ACK 538мс в медиане/1019мс максимум. Callback регистрировался + в onSurfaceTextureUpdated после захвата списка текущего draw и ждал постороннего обновления окна. + Регистрация перенесена в onPreDraw, timestamp проверяется после commit того же кадра. + Отдельный TextureView/EGL тест на Samsung воспроизвёл 15 кадров за 8с до исправления; + после — 483/8с при 60fps и 241/8с при 30fps. Основной чат не заменялся, сеть/камера не использовались. + Добавлены диагностика texture/commit/ACK и аппаратный regression probe. APK и 114 unit PASS; + check.sh 162/164: прежние local_transport TTL (повтор PASS), encrypted_attachment phase=5. + Исправленный APK собран, живой сетевой звонок на нём ещё не проверен. Подробности: doc/call_video.txt. + [+] **Режимы камеры до 60 fps и восстановление задержки без потери encoded кадров** — 20.10.2026: Исправлен фильтр Windows камер 50/100/330 fps; размер/FPS передаются через изолированный camera IPC. Desktop и Android выбирают пары размер/FPS, проверяют encoder/decoder 30/50/60 в обеих ориентациях. @@ -27,6 +37,8 @@ В check.sh для HEVC: 162/164, кроме прежнего encrypted_attachment упал peers():95 failed: found; перед отказом endpoint peer=2 удалён по TTL (age_ms=30331). Отдельный повтор прошёл. Логи: /tmp/hevc-high-core-check.log, /tmp/hevc-high-local-transport-retry.log; код local_transport не менялся. + Повторилось при исправлении Android Surface ACK: age_ms=30335, тот же peers():95; + отдельный повтор PASS. Логи /tmp/video-surface-freeze-full-check.log, /tmp/video-surface-freeze-local-retry.log. [ ] **Разобрать ожидание запросов ключей после перезапуска автора в test_encrypted_attachment** — 19.10.2026: При проверке настроек входящих звонков общий check.sh: 160/162; test_encrypted_attachment остановился в phase=5,