|
|
|
|
@ -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. |
|
|
|
|
|