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