diff --git a/doc/call_video.txt b/doc/call_video.txt index bc5794d0..787b71cf 100644 --- a/doc/call_video.txt +++ b/doc/call_video.txt @@ -62,7 +62,8 @@ producer запрашивает следующий IDR по существующ [+] История первых ACK 500мс/50мс и снимок payload send_q/inflight отдельного сервиса. [+] Unit счётчиков: повторные ACK, reset, отдельные сервисы; UDP/STCP регрессии пройдены. [+] Дрейф feed/tempo устранён картой фактических участков SoundTouch; см. ниже. -[ ] H.265 bitrate: замена encoder перед ближайшим плановым IDR, с непрерывными PTS. +[+] ChatGUI codec component: замена H.264/H.265 encoder на IDR, с непрерывными PTS; ещё без camera/bridge. +[ ] Android MediaCodec: применение bitrate на ближайшем IDR и проверка фактического выхода. [+] Общий регулятор с детерминированными сценариями и подключением к router/encoder-командам. [+] Видеофрагменты, ограниченная сборка, обмен возможностями с подтверждением. [ ] Дополнить возможности ограничениями profile/level/tier и диапазоном битрейта. @@ -318,3 +319,47 @@ ffprobe подтверждает Main/level 3.1, B=0 и 360 кадров. Это проверка 640x360@30 на синтетической сложной сцене, не готовый тракт звонка: worker/camera/decoder UI и Android MediaCodec ещё предстоит подключить и проверить. Патч x265 остаётся диагностическим материалом и не требуется выбранному способу. + +Компонент кодирования ChatGUI, 14.10.2026 +StreamVideoEncoder переименован в LiveVideoEncoder и выделен в chatgui_live_video; +трансляции используют тот же код, без дублирования захвата/конвертации/FFmpeg. +Явный профиль H.264 Constrained Baseline / H.265 Main задаёт level, reference=1, +VBV и 8-bit 4:2:0. Для этого режима пока проверены software libx264/libx265. +Открытие проверяет независимый IDR настоящим decoder: profile, level, Main tier, +pixel format, отсутствие B-кадров и размер. Проверка принятого option не заменяет +эту проверку bitstream. Automatic-профили трансляций сохраняют прежний выбор GPU/SW. +Опции encoder сверены с https://ffmpeg.org/ffmpeg-codecs.html#libx265 и разделом libx264. + +CallVideoEncoder принадлежит будущему video worker. Он хранит единственную pending +команду generation/request/bitrate, отклоняет replay, чужой generation и выход за +согласованный maximumBitrate. На ближайшем IDR по capture PTS создаётся кандидат; +старый encoder сохраняется до получения полного KEY с точным исходным PTS. +При отказе кандидата возвращается completion с bitrate=0 и используется прежний +контекст. Неизменный target также подтверждается на KEY без пересоздания. +Completion отделён от отправки кадра: даже при закрытом admission его нужно +передать в call_video_rate_applied. Периодический IDR задаётся по capture PTS, +поэтому пропуски кадров/закрытая сеть не сдвигают применение на дополнительные GOP. +Физический захват камеры, audio origin и сетевые frame_id компонентом не меняются. + +test_call_video_encoder прошёл: 5 QtTest cases (включая init/cleanup), без skip. +Для обоих codecs: 640x360@30, level 3.1, VBV 1 Мбит, шумовая сцена; +запрос на кадре 7, переход на кадре 30, один decoder на все 360 кадров. +Проверены PTS каждого decoded frame, профиль/level/размер/B=0 и средний bitrate: + H.264: 3996916 / 296904 / 3989748 бит/с; + H.265: 3993720 / 302956 / 3999788 бит/с. +Отдельно проверены отказ новой конфигурации с сохранением старого encoder, +предел bitrate, pending/replay/generation, force-key и разрыв capture PTS вперёд. +Логи: /tmp/call-live-video-test-final.log, /tmp/call-live-video-build-final.log. +test_stream_publish: 11 passed, 1 skip (capture под Xvfb), 0 failed; +/tmp/call-live-stream-regression.log. После уточнения VBV профильная проверка +liveSoftwareBitrateKeepsDecoder повторена успешно, /tmp/call-live-stream-bitrate-final.log. +ChatGUI собран; ./check.sh: 154/154, proxy 9/9, burst/load PASS за 118с; +/tmp/call-live-core-check.log. Android в этом этапе не менялся. + +Граница готовности: это рабочий codec component, ещё не камера/worker/видеозвонок. +В CAPS пока нет согласования level/tier/bitrate/VBV: до его реализации компонент +не объявляется доступным в реальном звонке. Владелец обязан проверять соответствие +размера/FPS согласованному envelope, а не считать маркировку level доказательством +всех ограничений стандарта. Другие режимы, hardware codecs и Android требуют +отдельных проверок. Следующий этап — CAPS envelope и подключение capture/bridge, +затем decoder/render по audio clock и UI на обеих платформах. diff --git a/doc/tasks.md b/doc/tasks.md index 198471a6..05796a8c 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -30,6 +30,12 @@ 4.01 -> 0.310 -> 4.02 Мбит/с, 360/360 кадров декодируются с сохранёнными PTS кодера. Обычный reconfigure на IDR не помогает. В плане уточнены ожидание <= одного GOP, pending ACK, backpressure и сохранение аудиошкалы; подключение к платформенным workers ещё предстоит. + Реализован ChatGUI CallVideoEncoder поверх выделенного общего LiveVideoEncoder: + проверка фактического профиля декодером, pending-команда, новый контекст на IDR, + сохранение PTS/старого контекста при отказе, предел bitrate и защита generation/request. + Реальная проверка H.264/H.265: 360 кадров на codec, 4M -> 300k -> 4M, один decoder, 5/5 cases PASS. + Трансляции: 11 PASS, 1 skip (Xvfb); ChatGUI собран; check.sh 154/154 + proxy 9/9 + burst/load PASS. + Codec component ещё не подключён к звонку: нужны CAPS envelope, capture/bridge/render и Android backend. Контракты, этапы и проверки: `doc/call_video.txt`. [+] **Android live: увеличение и перемещение видео как в просмотрщике файлов** — 14.10.2026: