From 1815de059e783032a94a8dd35eb24ca9a79f97cb Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 14 Oct 2026 15:58:31 +0200 Subject: [PATCH] Record direct preview verification and camera teardown ownership --- doc/service_lifecycle.md | 6 ++++-- doc/tasks.md | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/service_lifecycle.md b/doc/service_lifecycle.md index f2bf683d..480cd0f3 100644 --- a/doc/service_lifecycle.md +++ b/doc/service_lifecycle.md @@ -104,8 +104,10 @@ Android preview собственного эфира не создаёт reader: и encoder Surface. UI attach/detach меняет лишь camera session; audio/encoder/origin сохраняются. UI, ожидающие команды camera handler и каждая camera session удерживают preview target отдельно. TextureView возвращает false при destroy и снимает ссылку UI; Surface/SurfaceTexture освобождаются -после закрытия последней session. Capture stop запрещает attach и снимает своё владение target; -camera HandlerThread завершается после camera close и callbacks всех созданных sessions. +после закрытия последней session. CameraDevice.onClosed снимает также оставшиеся ссылки своих +sessions, если Android не прислал отдельные session.onClosed. Повторные callbacks безопасны. +Capture stop запрещает attach и снимает своё владение target; camera HandlerThread завершается +после camera close и освобождения outputs всех созданных sessions. Отказ preview output возвращает encoder-only session и не завершает сам эфир. При stop/destroy отменяются delivery и media-index callbacks до освобождения store; destroy отсоединённого cursor не обращается к store. Frontend прекращает audio callback diff --git a/doc/tasks.md b/doc/tasks.md index 79a514be..afc07c30 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,25 @@ ## Текущие задачи +[+] **Live: прямое превью Android без собственного decoder** — 14.10.2026: + Камера одновременно выводит в encoder Surface и TextureView; собственное превью больше не открывает + stream viewer/cursor, MediaCodec decoder, AudioTrack и адаптивные часы воспроизведения. + Attach/detach меняет только camera session, сохраняя encoder, audio, revision и origin; + ON_STOP снимает preview output сразу, без ожидания Compose recomposition. Отказ preview сохраняет encoder-only эфир. + Surface/texture удерживаются UI, ожидающими командами и camera sessions до окончания использования; + CameraDevice.onClosed освобождает также sessions, для которых Android не доставил отдельный onClosed. + TextureView сам учитывает sensor orientation; дополнительный UI rotation компенсирует лишь поворот дисплея. + Повторный поворот сенсора убран, DisplayListener учитывает также 180° без изменения размеров окна. + Диагностика показывает native transform, sensor/display/UI rotation, first frame, FPS, возраст кадров и освобождение outputs. + REALTIME timestamp сравнивается с elapsedRealtimeNanos; UNKNOWN не выдаёт выдуманный абсолютный возраст. + На SM проверены AV1, задняя/передняя камеры, ручной поворот, фон/возврат, закрытие/открытие preview, + полная остановка и повторный запуск. Нет собственного decoder; типичный возраст кадров около 130ms + вместо накопленных 6s; перед stop median=133.7ms, p95=175.7ms по 297 диагностическим samples. + Stop освободил codec и все sessions, camera HandlerThread завершён; после проверки восстановлены AV1/main/0°. + 151 тест ядра и Kotlin unit tests прошли, в том числе 6 проверок preview; APK установлен на SM. + Архитектура: `doc/stream.txt`, `doc/service_lifecycle.md`. + Логи: `/tmp/direct-preview-{full-check,android-orientation-build,sm-live}.log`. + [+] **Live: независимая подача decoder и устранение вечного ожидания AV1 на SM** — 14.10.2026: Причина: Android подавал максимум три кадра и читал видео только на 80ms вперёд от остановившегося clock; c2.android.av1-dav1d.decoder требовал заполнения своего конвейера. KEY уже был принят, но UI продолжал ждать KEY.