Browse Source

Document the corrected video contract and verified hardware matrix

master
evgeny 5 days ago
parent
commit
8b4b278f3c
  1. 68
      doc/call_video.txt
  2. 14
      doc/tasks.md

68
doc/call_video.txt

@ -2,7 +2,15 @@
Контракт
Каждая сторона независимо включает видео. Автовыбор H.265 Main 8-bit, затем
H.264 Constrained Baseline: пересечение encoder отправителя и decoder получателя.
H.264 Baseline/Constrained Baseline: пересечение encoder отправителя и decoder получателя.
Encode/decode проверяются независимо, профили AVC согласуются явной маской.
HEVC Main/Main tier, 8-bit 4:2:0, progressive, без reorder; DPB ограничен Annex A,
не фиксированным числом references. Общий call_video_bitstream проверяет VPS/SPS/PPS,
HRD при наличии, геометрию и независимый IDR. Фактический level проверяется после
открытия encoder. CAPS — 64 байта, header — 56 байт; старый формат не поддерживается.
VBV является локальной настройкой software encoder, в сетевом контракте его нет.
Результат запуска decoder (generation + accepted) передаётся отдельно от router ACK:
неподдержанный формат вызывает fallback в Auto, потеря references — запрос KEY.
Камера, разрешение, кодек и диапазон битрейта меняются во время звонка.
Автоматический диапазон по умолчанию 300–4000 кбит/с (десятичные единицы).
@ -50,26 +58,29 @@ Worker хранит pending-команду и применяет её перед
независимо от сетевого admission; иначе закрытый admission создаст взаимное ожидание.
Успех означает применение настройки, не гарантию бит-в-бит постоянного выхода.
До IDR регулятор видит старый applied bitrate и одну pending-команду; его текущий
таймаут 2с включает ожидание IDR и открытие encoder. При отсутствии кадров/ошибке
таймаут 12с включает ожидание IDR, проверку hardware encoder (до 5с) и возможное
восстановление предыдущей конфигурации (до 5с). При отсутствии кадров/ошибке
команда завершается отказом; нельзя бесконечно продлевать её таймаут.
Ограничитель очереди работает и во время ожидания. Если новый IDR не принят,
producer запрашивает следующий IDR по существующему контракту send_frame.
Открытие кандидата и проверка первого IDR предшествуют освобождению старого encoder;
ошибка не должна уничтожать рабочий контекст. Реальные затраты переключения и
Desktop сохраняет старый encoder до готовности кандидата. Android переоткрывает
encoder последовательно (аппаратный ресурс может быть единственным), при отказе
восстанавливает прежнюю конфигурацию и подтверждает фактически восстановленный bitrate.
Допустима пауза картинки; аудио и capture timeline продолжаются. Реальные затраты переключения и
пиковый объём IDR нужно проверить для каждого доступного режима/backend.
Порядок реализации
[+] История первых ACK 500мс/50мс и снимок payload send_q/inflight отдельного сервиса.
[+] Unit счётчиков: повторные ACK, reset, отдельные сервисы; UDP/STCP регрессии пройдены.
[+] Дрейф feed/tempo устранён картой фактических участков SoundTouch; см. ниже.
[+] ChatGUI codec component: замена H.264/H.265 encoder на IDR, с непрерывными PTS; ещё без camera/bridge.
[ ] Android MediaCodec: применение bitrate на ближайшем IDR и проверка фактического выхода.
[+] ChatGUI codec component: замена H.264/H.265 encoder на IDR, с непрерывными PTS.
[+] Android MediaCodec: применение bitrate на ближайшем IDR, проверка фактического формата.
[+] Общий регулятор с детерминированными сценариями и подключением к router/encoder-командам.
[+] Видеофрагменты, ограниченная сборка, обмен возможностями с подтверждением.
[+] Согласование фиксированных profile/tier, level и пределов bitrate/VBV; проверка transport/encoder.
[ ] Завершить A/V scheduler с платформенными очередями захвата/encode.
[+] Согласование profiles/level и целевого bitrate; проверка transport/encoder, независимый decoder probe.
[+] A/V scheduler с платформенными очередями захвата/encode.
[+] Общие capture PTS и отображение позиции аудиоустройства в исходное время.
[ ] ChatGUI: движок, окно и настройки; Android: движок, JNI, сервис и экран.
[+] ChatGUI: движок, окно и настройки; Android: движок, JNI, сервис и экран.
[ ] Интеграционные проверки всех пар, перегрузки, смены формата и lifecycle.
Приёмка
@ -80,6 +91,9 @@ producer запрашивает следующий IDR по существующ
Видео следует аудио при догоне, underrun, смене устройства и формате видеотрека.
Завершение звонка безопасно во время переключения камеры, bitrate и decoder.
Далее журнал этапов разработки. Старые описания wire/profile/VBV ниже исторические;
актуальный контракт приведён в начале, последние проверки — в конце документа.
Проверка SoundTouch, 14.10.2026
test_soundtouch_clock сравнивает положение реальных четырёхсэмпловых фрагментов
в выходном сигнале с двумя вариантами временной шкалы. 60с входа, mono 48kHz,
@ -461,3 +475,39 @@ Samsung объявляет только AVC. Нельзя считать так
Дальнейшая реализация остановлена по правилу AGENTS.md о выявленной нестыковке.
После решения нужны проверки CPB/bitrate, камеры/смены Surface/lifecycle, полный
check.sh, Kotlin unit-тесты и реальные звонки Android↔Android↔ChatGUI.
Устранение аппаратных блокеров и проверка совместимости, 14.10.2026
Реализован согласованный план: Baseline/CB как отдельные AVC profiles, общий C-анализатор
VPS/SPS/PPS/HRD/IDR, нормативный DPB, независимые encode/decode probes с эталонными
потоками. Убрано неподтверждённое обещание VBV MediaCodec. Фактические profile/level
проверяются против CAPS после подготовки encoder; смена bitrate подтверждается
только настоящим IDR. Android допускает один экземпляр encoder и восстанавливает
прежний режим при отказе. Встречные направления выбирают codec независимо.
VIDEO_DECODE_OK/REJECT передают результат decoder; Auto исключает отвергнутый codec
для текущего выбора и пробует fallback. Старые generations не влияют на текущий.
Сетевой тест проверяет acceptance, rejection, stale result и сохранение запрета
отправки после очередного tick регулятора. При смене звонка очищаются pending команды port.
Сетевой долг ограничен полусекундой целевого потока плюс базовый RTT, с минимумом
64 KiB для IDR и абсолютным пределом 2 MiB. Частичная отправка по-прежнему ограничена
2с. Обе платформы отбрасывают показ кадров, отставших от аудио более чем на 500мс.
Подтверждено на подключённых устройствах последней debug instrumentation:
- D2AR10P3600820: c2.unisoc.hevc.encoder Main/level 93/DPB=3; AVC Baseline/level 31.
Независимо работают c2.unisoc.hevc.decoder и AVC decoder (Baseline + CB).
- RZ8R72MG64B: c2.qti.avc.encoder CB/level 31. HEVC encoder отвергнут за tier=1,
level=93; независимо работает c2.qti.hevc.decoder и AVC decoder (Baseline + CB).
- На обоих телефонах последовательные открытия 4M -> 300k -> 4M прошли проверку
реального IDR/PTS; это проверка применения конфигурации, не измерение среднего CBR
на сложной сцене (синтетический серый кадр не требует целевой полосы).
- Фактический HEVC Unisoc декодирован Samsung; AVC Samsung декодирован Unisoc;
AVC Baseline Unisoc декодирован Samsung. Каждый remote probe: 4 независимых IDR.
- Все три аппаратных потока декодированы production CallVideoDecoder ChatGUI.
Экспортные кадры синтетические, камера не включалась; /tmp/call-video-cross/.
Проверки: ./check.sh — 154/154, proxy 9/9, burst/load PASS (131с),
/tmp/call-profile-full-check.log. ChatGUI vibechat собран; codec QtTest 6/6 PASS,
/tmp/call-profile-codec-final.log. Перекрёстный production decode PASS,
/tmp/call-profile-cross-desktop.log. Android assembleDebug + 81/81 unit PASS,
/tmp/call-profile-cross-build.log; APK установлен на оба устройства.
Полная ручная приёмка звонка с реальными камерами/Surface, A/V и сменой режимов
остаётся отдельной проверкой; на рабочем Linux-хосте отсутствуют /dev/video*.

14
doc/tasks.md

@ -43,10 +43,16 @@
Подключены общий ограниченный call_video_port, desktop camera/encoder/decoder/audio-clock render и окно управления;
Android JNI/Camera2/YUV/MediaCodec/RX Surface, CallService и экран управления. Обе сборки проходят.
Новые сетевой port-тест 2/2 и production desktop decoder 5/5 проходят; полный видеозвонок ещё не принят.
Аппаратная проба выявила блокер: Samsung AVC проходит, HEVC выдаёт High tier вместо Main;
второй телефон AVC выдаёт Baseline вместо Constrained Baseline, HEVC Main требует DPB=3.
Нужно отделить decoder probe от encoder, не приравнивать DPB к reference count и уточнить контракт profiles/DPB/CPB.
Диагностика и варианты в ТЗ; дальнейшая реализация остановлена по правилу AGENTS.md о нестыковке.
Аппаратные блокеры устранены: общий C validator, AVC Baseline/CB, нормативный DPB,
независимые encoder/decoder probes, фактические profile/level, VBV убран из wire.
Decoder сообщает acceptance/rejection; Auto делает fallback, отдельный KEY request восстанавливает references.
Android последовательно заменяет encoder на IDR с восстановлением предыдущего режима при отказе.
Unisoc кодирует HEVC и AVC; Samsung кодирует AVC и независимо принимает HEVC.
Проверены аппаратные 4M -> 300k -> 4M и перекрёстное декодирование трёх потоков
между телефонами и production decoder ChatGUI. APK установлен на оба телефона.
Итог: check.sh 154/154 + proxy 9/9 + burst/load, Qt codecs 6/6, Kotlin 81/81 PASS.
Осталась ручная приёмка полного звонка с камерами, Surface, A/V и переключениями;
на Linux-хосте нет /dev/video*. Аппаратные probes используют синтетические кадры.
Контракты, этапы и проверки: `doc/call_video.txt`.
[+] **Android live: увеличение и перемещение видео как в просмотрщике файлов** — 14.10.2026:

Loading…
Cancel
Save