From b2b34df2ec6c9af99149bddd1dca428024c89a9a Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 00:29:01 +0100 Subject: [PATCH] Document video receive cleanup acknowledgments and host fault coverage --- doc/service_lifecycle.md | 8 +++++++- .../java/com/utun/chat/data/CallVideoCadence.kt | 2 +- tools/chatgui-android/doc/ARCHITECTURE.md | 14 +++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/doc/service_lifecycle.md b/doc/service_lifecycle.md index 3102a521..4ae32305 100644 --- a/doc/service_lifecycle.md +++ b/doc/service_lifecycle.md @@ -510,8 +510,14 @@ wake lock: перед исходящим вызовом или принятие wake lock и сервис. Ошибочные операции сохраняют владельцев и повторяются независимо с задержкой 250 мс..30 с; process-ссылка удерживает их также после onDestroy. Успешный Deferred от shutdown подтверждает stop API audio/video и очистку receiver, -wake lock, токенов, foreground/stopSelf. Video подтверждает RX join/native close +wake lock, токенов, foreground/stopSelf. Video подтверждает RX join/освобождение decoder, +playout и Surface, native close и постановку camera cleanup, которая завершается асинхронно на video worker. +RX stop ограничивает join 250 мс за попытку; ошибка release сохраняет decoder, +его Surface не освобождается до codec. Прочие Surface и playout очищаются независимо. +Process-ссылка и Handler повторяют cleanup после выхода worker; поздние Surface также +удерживаются до успешного callback release. Исключение callback требует повторяемого +освобождения у передавшего владельца. Неудачный RX stop запрещает закрывать native port. Отказ поста или join оставляет stop повторяемым. Отмена Deferred не снимает владельцев. Audio stop ждёт каждый worker до 250 мс за попытку; playback включает join reporter. Живые workers и устройства с отказавшим release остаются у движка, native audio stop diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoCadence.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoCadence.kt index 94a3fb2f..8590f059 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoCadence.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallVideoCadence.kt @@ -2,7 +2,7 @@ package com.utun.chat.data /** Worker-локальный отбор raw по фазе fps=1..60; PTS — монотонные мкс одного запуска камеры. * accept=false при неверном/повторном PTS, риске overflow либо раннем кадре (допуск 1/4 периода). - * Пауза больше периода переносит фазу без burst; новый источник/шкала PTS требует нового экземпляра. */ + * Опоздание относительно очередной фазы больше периода переносит её без burst; новая шкала требует нового экземпляра. */ internal class CallVideoCadence(private val fps: Int) { private var lastPts = -1L private var next = -1L diff --git a/tools/chatgui-android/doc/ARCHITECTURE.md b/tools/chatgui-android/doc/ARCHITECTURE.md index 0ca5fb15..9054bc6c 100644 --- a/tools/chatgui-android/doc/ARCHITECTURE.md +++ b/tools/chatgui-android/doc/ARCHITECTURE.md @@ -422,8 +422,15 @@ AudioRecord/CallAudioOutput у движка, включая частичный повторяются независимо; после передачи режима в Telecom fallback его не восстанавливает. Незавершённая очистка бросает ошибку сервису и запрещает новый start. Native audio stop вызывается после подтверждения этих операций, его отказ также допускает повтор. -Video stop подтверждает RX join/native close и принятие cleanup камерой/encoder +Video stop подтверждает RX join/освобождение его decoder, playout handle и Surface, +native close и принятие cleanup камерой/encoder worker; окончательная camera cleanup асинхронна. Ошибка RX join или post допускает повтор stop. +RX join ограничен 250 мс за попытку; decoder не теряется при отказе release, его Surface +остаётся до подтверждённого освобождения codec. Остальные Surface и playout очищаются +независимо. Очередь Surface владеет callback release до успешного возврата, включая +позднюю передачу после stop; callback должен допускать повтор после исключения. +Process-ссылка и Handler сохраняют cleanup после выхода RX, без переноса уже назначенного +раннего таймера. Отказ post не теряет владельцев и допускает явный stop. Shutdown возвращает Deferred, успешный результат означает подтверждение всех владельцев сервиса. При отказе process-ссылка удерживает экземпляр даже после @@ -648,6 +655,11 @@ CallAudioLifecycleTest компилирует настоящие CallAudioEngine поздний Telecom handoff и запрет stop вне main/нулевого ID. Барьер capture доказывает, что до выхода worker устройства/native сохраняются и новая сессия не запускается. Android hardware и DSP моделируются; AAudio/OEM поведение на устройстве не проверяется. +`:video-tests:test` проверяет настоящий CallVideoPlayer, uAV2 KEY framing и смену поколений +на JVM. Управляемые границы MediaCodec/probe/JNI позволяют воспроизвести отказы частичного +configure/start/stop/release, Surface callback, playout destroy, join и retry Handler. +Проверяются независимое освобождение, запрет release Surface до codec, старый detach, +ACK показа/PTS и EOS drain без смены Surface. OEM/реальное декодирование остаются вне модели. RadioCallLifecycleTest использует настоящие RadioCallController, IncomingCallManager, CoreActivity и гудки. Управляемые Android/JNI/repository-границы проверяют все команды сигналинга, pending START, валидацию событий/полной identity, активацию,