From 8b4b278f3c455530ecb43fb4a41cb04f225bd0b5 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 14 Oct 2026 23:45:01 +0200 Subject: [PATCH] Document the corrected video contract and verified hardware matrix --- doc/call_video.txt | 68 ++++++++++++++++++++++++++++++++++++++++------ doc/tasks.md | 14 +++++++--- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/doc/call_video.txt b/doc/call_video.txt index 71920398..2f03df26 100644 --- a/doc/call_video.txt +++ b/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*. diff --git a/doc/tasks.md b/doc/tasks.md index 39db9757..5ae9ce19 100644 --- a/doc/tasks.md +++ b/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: