Phase 1: NVENC через dlopen + источник через cuframes_subscriber

Скелет проекта cuframes-composer (LGPL-2.1+) и MVP кодирования
одного источника в файл H.264.

Что включает Phase 1:

- LICENSE (LGPL-2.1+), README с поэтапным планом, корневой CMake
- Подмодули: cuframes v0.4 (pinned), nv-codec-headers (n12.2.72.0)
- include/cuframes_composer/source.h — публичный API источника
  с явной машиной состояний (DISCONNECTED → CONNECTING → ACTIVE →
  STALE → DEAD) и snapshot-паттерном для чтения без блокировки
- include/cuframes_composer/nvenc.h — публичный API кодировщика
  на CUdeviceptr-вход (zero-copy через VMM-mapped указатели)
- src/nvenc_loader.{h,c} — dlopen libnvidia-encode.so.1 и инициализация
  таблицы функций NVENC через NvEncodeAPICreateInstance. Идёт через
  pthread_once. Сделано отдельно чтобы держать LGPL-совместимость:
  проприетарный SDK не статически линкуется
- src/nvenc.c — обвязка над NVENC: open session, init encoder, кеш
  registered resources, encode/lock/unlock, flush с EOS, поддержка
  H.264 CBR low-latency, preset GUID p1/p4/p7
- src/source.c — обвязка над cuframes_subscriber c фоновым потоком,
  exponential backoff reconnect (1с → 30с), и переходами по таймаутам
  для stale/dead-детекта
- examples/simple_record — smoke-test программа: подписка на cuframes,
  кодирование, запись в .h264 файл, корректное завершение по SIGINT
This commit is contained in:
2026-06-03 04:28:33 +01:00
commit ba68550f4c
16 changed files with 2051 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
# cuframes-composer
Стандалонный композитор-демон для multi-source видео grid через CUDA + NVENC + RTSP.
Заменяет монолитный ffmpeg-конвейер (`ffmpeg + vf_cuda_grid` фильтр) для случаев, когда нужно:
- Поток продолжает работать при потере любого числа источников (graceful degradation)
- Композитор сам управляет частотой кадров и обработкой ошибок без зависимости от семантики ffmpeg-демухера
- Минимум перемещений данных: zero-copy CUDA от источника `cuframes` напрямую в NVENC
## Статус
**Phase 1 — MVP.** В разработке. Не для боевой эксплуатации.
См. [дизайн-документ](https://git.goldix.org/gx/cuframes/raw/branch/main/docs/DESIGN-composer-daemon.md) для архитектурных решений и поэтапного плана.
## Зависимости
- [cuframes](https://git.goldix.org/gx/cuframes) — библиотека zero-copy передачи кадров. Подключена как git submodule.
- [nv-codec-headers](https://github.com/FFmpeg/nv-codec-headers) — MIT-licensed заголовки NVENC API. Подключена как git submodule. Сама библиотека `libnvidia-encode.so` грузится через `dlopen` при старте (это даёт LGPL-совместимость — см. дизайн-документ часть 1.6).
- CUDA Toolkit 12.x+ (для cuda runtime и компиляции)
- NVIDIA драйвер 525+ (для NVENC и `cuMemCreate` POSIX FD)
- Linux 64-bit (POSIX shm, SCM_RIGHTS)
Дополнительно по фазам:
- Phase 3: `libfreetype` (текст), `lodepng` через submodule (PNG-декодирование)
- Phase 4: `libzmq` (управление)
## Сборка
```bash
git clone --recursive git@git.goldix.org:gx/cuframes-composer.git
cd cuframes-composer
cmake -B build -G Ninja
ninja -C build
```
## Поэтапный план
| фаза | срок | результат |
|---|---|---|
| 1 | 1 неделя | один источник → NVENC → файл .h264 (доказательство zero-copy) |
| 2 | 2 недели | четыре источника + композиция через `libcugrid` |
| 3 | 2 недели | оверлеи + RTSP push к mediamtx + AAC passthrough из `/live-audio` |
| 4 | 1 неделя | паритет ZMQ-управления с фильтром `vf_cuda_grid` |
| 5 | 1 неделя | боевое развёртывание + MQTT health + watchdog |
| 6 | 2 недели | тесты + бенчмарки + документация |
Итого ~9 недель для одного разработчика.
## Лицензия
LGPL-2.1-or-later. См. файл [LICENSE](LICENSE).
NVENC SDK headers (`third_party/nv-codec-headers`) — MIT license, совместима с LGPL.