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:
@@ -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.
|
||||
Reference in New Issue
Block a user