gx 7bd8184159 frigate_mqtt: unique client_id per instance (несколько subscriber'ов)
Bug: client_id format "composer-frigate-%d" использовал только now_ms().
Когда создаются 2 subscriber'а подряд (frigate + yoloworld) — оба
получают один client_id за тот же мс, mosquitto kick'ает старый при
connect нового → infinite reconnect loop, ни один не получает events
стабильно.

Fix: static _Atomic int instance_seq counter — tie-break суффикс.
Format: "composer-frigate-%d-%d".

Verify mosquitto logs:
  composer-frigate--2117451292-0  (frigate subscriber)
  composer-frigate--2117451292-1  (yoloworld subscriber)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-16 13:50:28 +01:00

cuframes-composer

CUDA-композитор multi-source видео в один H.264 RTSP-поток с авто-раскладкой по motion и runtime-управлением через ONVIF/ZMQ.

Заменяет монолитный ffmpeg-конвейер (ffmpeg + vf_cuda_grid фильтр) для случаев, когда нужно:

  • Поток продолжает работать при потере любого числа источников (graceful degradation, blank cells вместо crash'а)
  • Композитор сам управляет частотой кадров без зависимости от ffmpeg-демухера
  • Минимум перемещений данных: zero-copy CUDA от cuframes-publisher до NVENC
  • Auto-layout по движению (Frigate-driven), без оператора
  • Управление с TV через ONVIF PTZ

Что внутри

  • CUDA-композитор (C++ ООП-ядро + extern "C" ABI, Phase 11b)
  • Auto-layout с asymmetric hysteresis + best-fit selection
  • PTZ-override через ONVIF (с auto-возвратом в motion-mode)
  • MQTT-driven text overlays (температура, статусы, etc.)
  • Detection box overlay от Frigate, следует за камерой при смене layout
  • ZMQ control plane для runtime-управления (set_layout, set_text, ...)
  • NVENC через dlopen (LGPL-совместимая интеграция)

Документация

Русский English
Для пользователя docs/ru/user.md docs/en/user.md
Для разработчика docs/ru/developer.md docs/en/developer.md
Operations / deploy docs/ru/operations.md docs/en/operations.md

Статус

Phase 11b — production. Развёрнут на R9-88.23 в составе CCTV-стека.

См. STATE.md для текущего состояния infra и git-history main для эволюции по фазам.

Зависимости

  • cuframes — zero-copy frame delivery от RTSP-publisher'а к composer'у. Подключена как git submodule.
  • nv-codec-headers — MIT-licensed заголовки NVENC API (submodule). libnvidia-encode.so грузится через dlopen в runtime для LGPL-совместимости.
  • CUDA Toolkit 12.x+ (cudart, nvcc, driver API)
  • NVIDIA driver 525+ (NVENC, cuMemCreate POSIX FD)
  • FreeType, libpng, libzmq, libjson-c, libmosquitto, libavformat/avcodec/avutil
  • Linux 64-bit (POSIX shm, SCM_RIGHTS, named pipes)

Quick start (host build)

git submodule update --init --recursive
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)

Артефакты:

  • build/src/libcuframes_composer.so — shared library
  • build/examples/grid_record — main CLI entry (C)
  • build/examples/grid_record_cpp — C++ smoke test

Запуск (1 камера, motion-mode, JSON-templates):

build/examples/grid_record \
  --out=/tmp/grid.h264 --fps=25 --bitrate=6000 \
  --width=1920 --height=1080 \
  --source=cam-parking,frigate=parking_overview,priority=100 \
  --motion-mode --motion-ttl=45000 \
  --templates=docker/templates.json \
  --mqtt-overlays=docker/mqtt_overlays.json

Production deploy и jammy-build — см. docs/ru/operations.md.

Архитектура одной картинкой

Frigate ──MQTT events──→ frigate_mqtt subscriber
                                    │
                                    ↓ motion_pulse
cuframes-pub-* ──VMM──→ Composer (C++ Cell/Layout/Decoration)
                          │
                          ↓ best-fit + hysteresis
                       Layout::apply()
                          │
                          ↓ NV12 zero-copy
                       NVENC ──→ H.264 pipe
                                       ↓
                              cfc-grid-ffmpeg
                                       ↓ RTSP push
                              mediamtx ──→ TV/VLC/HLS/WebRTC
                                  ↑
                              cctv-onvif (PTZ → ZMQ set_layout)

Подробности — docs/ru/developer.md §1.

Лицензия

LGPL-2.1+

S
Description
cuframes-composer — стандалонный композитор-демон для multi-source видео grid через CUDA + NVENC + RTSP. Замена монолитному ffmpeg + vf_cuda_grid конвейеру. Часть OSS-проекта cuframes.
Readme LGPL-2.1 1.1 MiB
Languages
C 62.1%
C++ 29.7%
Cuda 3.5%
CMake 3.2%
Dockerfile 1.5%