Document Samsung surface ACK deadlock and hardware regression results

This commit is contained in:
evgeny committed 2026-10-20 00:43:06 +02:00
1 parent dd5dee2767
commit bea8f1f901
2 files changed
+55

No files matched your search

+43
View File
@@ -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 ещё не проверен.
+12
View File
@@ -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,