ba68550f4c
Скелет проекта 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
56 lines
3.0 KiB
Markdown
56 lines
3.0 KiB
Markdown
# 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.
|