diff --git a/doc/call_video.txt b/doc/call_video.txt index e00918cd..eb5e98ed 100644 --- a/doc/call_video.txt +++ b/doc/call_video.txt @@ -224,3 +224,52 @@ desktop / DataStore Android и передаётся в общий chat_setting. Полный ./check.sh вне sandbox: 154/154, proxy 9/9, burst/load PASS; /tmp/call-range-check-final.log. Первый запуск в sandbox блокировался запретом сокетов. Настройки и регулятор готовы; подключение камеры/codec/render остаётся отдельным этапом. + +Проверка реального x265 перед подключением backend, 14.10.2026 +Добавлена ручная цель probe_call_x265 (EXCLUDE_FROM_ALL, не входит в ctest), если +найден x265 через pkg-config. Сборка/запуск: + cmake --build tools/chatgui/build --target probe_call_x265 -j4 + ./tools/chatgui/build/probe_call_x265 + ./tools/chatgui/build/probe_call_x265 --frame-rc +Один encoder, 640x360@30, Main 8-bit/Main tier/level 3.1, reference=1, +B=0/lookahead=0, ABR+VBV, буфер 1000 кбит. Три участка по 120 кадров: +4 Мбит/с -> 300 кбит/с -> 4 Мбит/с. Детерминированная шумовая сцена требует полосы; +измерение каждого участка исключает первые 30 кадров переходного процесса. +Код 0 — измерение прошло; 1 — ошибка API/потеря PTS; 2 — непригодный rate control. +Допуск измерения 0.5..1.5 target — диагностический, не гарантия CBR для любой сцены. + +Установленная библиотека 4.1+1-1d117be (пакет 4.1-4) не проходит пробу: + target 4000000: output 4016866 бит/с; + target 300000: output 4006669 бит/с, несмотря на getter bitrate=300/vbv=300 кбит/с; + target 4000000: output 3945016 бит/с. +Лог: /tmp/call-x265-system.log. Return reconfigure=0 и getter недостаточны. +frame-rc также непригоден для этого zerolatency-профиля: output около 40 кбит/с +на всех трёх участках; /tmp/call-x265-frame-rc.log. + +Причина проверена по исходникам именно установленного выпуска: + https://deb.debian.org/debian/pool/main/x/x265/x265_4.1.orig.tar.xz + SHA256 85abb8a850000bf693947459c42a666a3ecd6de10a2ac6b3c6647554b14d3270 +Encoder::configure(p) теперь присваивает this->m_param=p. Вызов из +x265_encoder_reconfig с m_latestParam переключает encoder на новый объект, но +RateControl::m_param остаётся прежним адресом. Последующий x265_copy_params +копирует latest в него самого; reconfigureRC читает старые параметры rate control. +Для frame-rc обнаружен отдельный дефект: tuneQscaleToUpdatedBitrate делит +frameBitsTotal на i=0 при пустом lookahead, что в этой пробе приводит к QP=69. + +Проверенный минимальный патч сохраняет активный m_param до configure(latest) +и восстанавливает его после. Файл для дальнейшего подключения: + tools/chatgui/ffmpeg/patches/x265-4.1-reconfigure-param-owner.patch +Применён только к отдельной копии исходников в /tmp/call-x265-source; +библиотека собрана в /tmp/call-x265-build без установки в систему. +С тем же тестом и frame-rc=off output=4016866 / 298165 / 4213269 бит/с. +Логи: /tmp/call_x265_probe_fixed.log и /tmp/call-x265-fixed.log. +Дополнительная проверка ffprobe: 360/360 кадров декодируются, Main, level=93 +(HEVC level 3.1), has_b_frames=0. Системная библиотека и приложение не заменены. +ChatGUI успешно собирается; /tmp/call-x265-desktop-build.log. + +Рекомендуемое продолжение: закрепить проверенную версию x265 и патч в локальной +сборке зависимости, повторить codec-пробу для рабочих разрешений и decoder, +затем подключить direct API к backend звонка. Непрошедший проверку backend +не объявлять в capabilities; H.264 остаётся альтернативой, когда H.265 недоступен. +Патч пока не подключён к build_ffmpeg.sh; изменение поставки зависимости и +интеграция backend остановлены по правилу AGENTS.md о выявленной нестыковке. diff --git a/doc/tasks.md b/doc/tasks.md index bceaf5f1..065eff34 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -21,6 +21,12 @@ достигает обеих границ без неограниченного роста очереди; сетевой тест смены диапазона проходит. ChatGUI собран, Android assembleDebug + 81 unit-тест прошли; итоговый check.sh 154/154 + proxy/burst/load PASS. Камера/codec/render ещё не подключены. + Перед интеграцией H.265 найден дефект x265 4.1: reconfigure/getter сообщают 300 кбит/с, + реальный выход остаётся 4 Мбит/с. Ручная цель probe_call_x265 воспроизводит отказ. + Минимальный патч владения параметрами проверен на отдельной библиотеке в /tmp: + реальный выход 4.02 -> 0.298 -> 4.21 Мбит/с, декодируются 360/360 кадров. + Патч сохранён в tools/chatgui/ffmpeg/patches, к сборке/приложению пока не подключён. + Согласно AGENTS.md остановлено перед изменением зависимости; подробности и варианты в плане. Контракты, этапы и проверки: `doc/call_video.txt`. [+] **Android live: увеличение и перемещение видео как в просмотрщике файлов** — 14.10.2026: diff --git a/tools/chatgui/ffmpeg/patches/x265-4.1-reconfigure-param-owner.patch b/tools/chatgui/ffmpeg/patches/x265-4.1-reconfigure-param-owner.patch new file mode 100644 index 00000000..01c29314 --- /dev/null +++ b/tools/chatgui/ffmpeg/patches/x265-4.1-reconfigure-param-owner.patch @@ -0,0 +1,12 @@ +--- a/source/encoder/api.cpp ++++ b/source/encoder/api.cpp +@@ -339,7 +339,9 @@ int x265_encoder_reconfig(x265_encoder* enc, x265_param* param_in) + } + else + { ++ x265_param* activeParam = encoder->m_param; + encoder->configure(encoder->m_latestParam); ++ encoder->m_param = activeParam; + if (strlen(encoder->m_latestParam->scalingLists) && strcmp(encoder->m_latestParam->scalingLists, encoder->m_param->scalingLists)) + { + if (encoder->m_param->bRepeatHeaders)