diff --git a/doc/call_video.txt b/doc/call_video.txt index 02975e50..66184ef8 100644 --- a/doc/call_video.txt +++ b/doc/call_video.txt @@ -38,8 +38,10 @@ call_id, video_generation и request_id; одно исполнение и пос [+] Unit счётчиков: повторные ACK, reset, отдельные сервисы; UDP/STCP регрессии пройдены. [+] Дрейф feed/tempo устранён картой фактических участков SoundTouch; см. ниже. [ ] H.265 runtime bitrate: поддерживаемый backend без циклического пересоздания. -[+] Общий регулятор с детерминированными сценариями (пока не подключён к звонку). -[ ] Протокол возможностей/формата, видеофрагменты, сборка, A/V scheduler. +[+] Общий регулятор с детерминированными сценариями и подключением к router/encoder-командам. +[+] Видеофрагменты, ограниченная сборка, обмен возможностями с подтверждением. +[ ] Дополнить возможности ограничениями profile/level/tier и диапазоном битрейта. +[ ] Завершить A/V scheduler с платформенными очередями захвата/encode. [+] Общие capture PTS и отображение позиции аудиоустройства в исходное время. [ ] ChatGUI: движок, окно и настройки; Android: движок, JNI, сервис и экран. [ ] Интеграционные проверки всех пар, перегрузки, смены формата и lifecycle. @@ -98,7 +100,7 @@ AudioTrack playbackHeadPosition разворачивается из unsigned32 Локальные часы API — MONOTONIC, не get_time_us ядра (на Linux он использует BOOTTIME). Снимок без progress более 250мс недостоверен; экстраполяции за подтверждённый участок нет. Логи call DEBUG показывают epoch/source/played/written/PTS/valid/measured/held раз в секунду. -Видеопротокол, codecs, scheduler и UI ещё не подключены. Проверка A/V на устройствах +Видеотранспорт подключён к ядру; codecs, полный scheduler и UI ещё не подключены. Проверка A/V на устройствах остаётся следующим интеграционным этапом; unit-тесты не измеряют физическую задержку динамика. Проверки текущего этапа @@ -126,3 +128,73 @@ Android: assembleDebug и все 79 unit-тестов прошли (arm64-v8a и Логи: /tmp/call-clock-desktop-final-tests.log, /tmp/call-clock-shared-tests.log (test_radio_member_mute повторён вне sandbox: /tmp/call-clock-radio-mute-test.log), /tmp/call-clock-android-final.log. Физические устройства в этом этапе не проверялись. + +Реализованный видеотранспорт, 14.10.2026 +call_video.c задаёт общий wire и сборку; call_video_transport.c владеет состоянием +видеоканала внутри call_session. Сигнализация звонка, video control, audio и video +имеют отдельные router service IDs. Приёмная очередь видео не блокирует аудио. +CAPS повторяется до прикладного CAPS_ACK: получение транспортного ACK не гарантирует, +что получатель уже обработал ACCEPT и установил capabilities. Кодек выбирается +направленно: encoder отправителя пересекается с decoder получателя, H.265 перед H.264. +Текущие limits проверяют размеры, FPS и pixels/second; контракт профиля ещё неполон. + +Заголовок фрагмента 52 байта, payload до 1200 байт; полный кадр до 2MiB. +KEY содержит config_length:4BE + AnnexB config + access unit. Ядро проверяет +границы envelope; содержимое NAL обязан проверять платформенный decoder. +frame_id и capture PTS возрастают на всём протяжении звонка, включая смену generation. +Новый формат требует нового generation и KEY. После пропуска кадра нужен KEY. +На TX один незавершённый кадр, на RX одна ограниченная сборка; deadline 2с. +receive_ready резервирует возможность принять целый кадр до ACK первого фрагмента. +Callback копирует данные до возврата; платформенная очередь также должна быть ограничена. +Старые кадры другого generation сохраняются до соответствующей позиции аудиоряда. + +Видео пока удерживается до передачи соответствующего аудио в router. Аудио никогда +не ждёт камеру. Это первая часть scheduler: ограничение ожидания encode, pacing +на максимальном битрейте и политика остановки видеотрека остаются следующими задачами. +flush ограничен 16 фрагментами за вызов; пропускную способность этого бюджета нужно +проверить вместе с частотой вызовов от платформенного producer и аудио. + +Регулятор получает endpoint ACK 500мс/50мс и queued+inflight отдельного видеосервиса. +Фиксированные заголовки вычитаются; добавляется ещё не переданный остаток кадра. +Удержание по аудио не трактуется как нехватка сети. Смена эпохи сбрасывает окно. +Ограничение admission: задолженность + новый кадр не превышают 2MiB. +Одна команда bitrate в работе, подтверждение проверяет generation/request; +устаревшее подтверждение отвергается. Timeout 2с или отказ encoder останавливает +admission до явной повторной настройки; аудиозвонок продолжает работу. +Платформенные callbacks вызываются в uasync и не меняют call API реентерабельно. +При hangup отменяются таймеры и освобождаются pending TX/RX, callbacks снимаются. + +Проверки видеотранспорта +./check.sh: 154/154, proxy 9/9, burst/load PASS; /tmp/call-video-core-check.log. +test_call_video проверяет capabilities, wire, фрагментацию, replay, разрыв, +timeout, смену generation и некорректные размеры/config. +test_call через два реальных UDP-ядра проверяет обмен CAPS, удержание видео по аудио, +backpressure получателя без остановки аудио, H.265 -> H.264 с новым generation, +bitrate command/ACK, устаревшие ACK и hangup с ожидающим кадром. +Payload в этом тесте синтетический: тест не доказывает работу HEVC/AVC decoder. +Лог: /tmp/call-video-rate-integration.log. +ChatGUI vibechat собран; test_voice_tx и test_call_jitter прошли. +Android assembleDebug/testDebugUnitTest успешны; /tmp/call-video-android-core-build.log. +Камера, декодирование/показ и физическая A/V-синхронизация пока не проверены. + +Выявленная нестыковка перед подключением codecs +Размеров/FPS/pixels-per-second недостаточно: допустимый битрейт зависит также от +profile/level/tier и ограничений конкретного decoder. Текущий StreamVideoEncoder +не умеет runtime bitrate для H.265, а прямой x265 требует дополнительной проверки. +В upstream x265_encoder_reconfig при смене profile/level/tier отменяет изменение +rate-control, но эта ветка не меняет ret=0. Успешный return не доказывает применение. +Источник: https://github.com/videolan/x265/blob/master/source/encoder/api.cpp + +Предлагаемое продолжение: +1. Зафиксировать Main 8-bit / Constrained Baseline и согласовать level/tier, + верхний bitrate/VBV и ограничения reference frames для каждого направления. + Выбранный режим должен проверяться фактическим открытием encoder/decoder. +2. Открывать encoder в согласованных пределах. Автоадаптация работает внутри них + без пересоздания. ACK команды означает проверенное фактическое применение, + а не только возврат setter; отдельно измеряется реальный выход encoder. +3. Пользовательское изменение за пределами режима создаёт новый generation, + config и KEY после проверки возможностей получателя; звук продолжается. +4. Проверить установленный x265 и Android MediaCodec тестом encode/decode с + понижением/повышением битрейта и отказом настройки. Непригодный H.265 backend + не объявляется доступным; в auto используется H.264. +Подключение платформенных codecs остановлено на этой границе согласно AGENTS.md. diff --git a/doc/tasks.md b/doc/tasks.md index 8ba2d5fe..084e2b92 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -7,10 +7,15 @@ [ ] **Видеозвонки Android и ChatGUI** — 14.10.2026: H.265 с fallback H.264, смена камеры/разрешения/кодека/битрейта во время звонка. Общая шкала захвата, приёмное видео следует аудиоряду; адаптация по ACK 500мс/50мс и задолженности. - Реализованы router ACK/debt и отдельный регулятор; check.sh 153/153 + proxy/burst/load проходят. + Реализованы router ACK/debt и подключение регулятора к видеотранспорту; check.sh 154/154 + proxy/burst/load проходят. Реализован вариант 2: фактическая карта Copy/Mix SoundTouch, CallTimeline, capture PTS/эпоха/Opus delay в протоколе, часы воспроизведения desktop/Android. Сборки успешны, 79 Kotlin-тестов и профильные C++-тесты проходят. - Видео пока не подключено: далее codecs/capabilities, ограниченные очереди и A/V scheduler, UI обеих платформ. + Добавлены видеопротокол, CAPS/ACK, ограниченная сборка/отправка, отдельные очереди audio/video/control, + удержание TX-видео по аудио, generation-safe bitrate ACK. Сетевой тест проверяет backpressure, + смену H.265/H.264 и hangup; payload синтетический, реальные codecs/камера/UI ещё не подключены. + Выявлена нестыковка capabilities: нужны profile/level/tier и предел bitrate/VBV. + x265 может отменить reconfigure при смене level и вернуть 0; ACK требует проверки применения. + По правилу AGENTS.md подключение codecs остановлено; решение и оставшиеся этапы описаны в плане. Контракты, этапы и проверки: `doc/call_video.txt`. [+] **Android live: увеличение и перемещение видео как в просмотрщике файлов** — 14.10.2026: