gx 604cffb5e5 spike(phase0): minimal CUDA IPC ping-pong producer/consumer
PoC для validation концепта перед инвестированием в Phase 1.

Структура:
- tools/spike/common.h          — типы SharedHeader / SlotDescriptor / NV12 meta
- tools/spike/pingpong_producer.cu — аллоцирует CUDA pool, экспортирует IPC handles
  в /dev/shm/cuframes-spike-<key>, имитирует publish frames с monotonic pattern
- tools/spike/pingpong_consumer.cu — открывает handles, читает frames,
  verify содержимого (no torn frames), измеряет latency, печатает summary
- tools/spike/CMakeLists.txt    — sm_75/86/89/90/120 для RTX 5090
- tools/spike/bench.sh          — basic / multi-consumer / stress scenarios
- tools/spike/README.md         — what / how / acceptance

Намеренные упрощения PoC (не идём в Phase 1 пока без validation):
- 2-slot ring (Phase 1 будет N)
- POSIX shared memory + atomic seq (без Unix socket handshake)
- cudaStreamSynchronize sync (Phase 0 spike проверит будет ли достаточно;
  альтернатива cudaIpcEventHandle_t — отложена)
- NV12 hardcoded (других форматов в Phase 1)
- Drop-oldest backpressure (без ACK protocol)

Acceptance Phase 0:
- p99 latency на RTX 5090 для FullHD < 5 ms
- throughput ≥ 1 GB/s
- multi-consumer (3) с сопоставимой latency
- cross-container работает
- 1-hour stress без VRAM/RAM leak

Если acceptance fail → дизайн пересмотр (sync через CUDA IPC events).
2026-05-14 21:20:39 +01:00

cuframes

Zero-copy sharing декодированных видеокадров между процессами через CUDA IPC.

Статус: ⚠️ Design phase. Дизайн-спецификация готова, реализация в процессе. Лицензия: LGPL-2.1+ Платформы: Linux, NVIDIA CUDA ≥ 12.0

Идея в одну минуту

Типичный setup с несколькими сервисами видеоаналитики:

Camera ─► ffmpeg #1 (NVR, decode + record)
       ─► ffmpeg #2 (AI-detector, decode + inference)
       ─► ffmpeg #3 (custom analytics, decode + ...)

Каждый сервис делает свой decode на GPU. На 16 cameras × 25 fps × 3 consumers это сотни лишних NVDEC operations и GB/s VRAM-bandwidth впустую.

cuframes устраняет дублирование:

Camera ─► ffmpeg + cuframes filter ─► VRAM ─┬─► consumer 1 (NVR)
                                             ├─► consumer 2 (AI)
                                             └─► consumer 3 (analytics)

Один decode, frame остаётся в VRAM, любое количество consumers читают zero-copy через CUDA IPC.

Состав

  • FFmpeg filter cuda_ipc_export — добавляется в любой ffmpeg-pipeline
  • libcuframes — C library + C++/Python bindings для consumers
  • Docker images — drop-in replacement для существующих setups (включая Frigate)

Quickstart

🚧 в разработке

# Producer (после v0.1)
docker run --gpus all -v /run/cuframes:/run/cuframes ghcr.io/<org>/cuframes-ffmpeg:N \
  ffmpeg -hwaccel cuda -i rtsp://camera/stream \
         -vf "scale_cuda=1920:1080,cuda_ipc_export=key=cam1" \
         -c:v copy -f segment recording.mp4

# Consumer (C++)
#include <cuframes.hpp>
cuframes::Subscriber sub("cam1");
while (auto frame = sub.next()) {
    // frame->cuda_ptr — device pointer, zero-copy
    process_on_cuda(frame->cuda_ptr, frame->width, frame->height);
}

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

Why

Подтверждённый спрос в Frigate community (#17033, #20191, #21559) — люди тычатся в NVDEC saturation при многокамерных setup'ах. Решения уровня NVIDIA DeepStream закрытые / vendor-locked. Open source FFmpeg-plugin для этой ниши не существует. См. подробный prior-art analysis в docs/architecture.md.

Roadmap

Phase Что Срок
0 PoC spike, CUDA IPC latency measurements 3 дня
1 libcuframes (producer/consumer ring buffer + handshake protocol) 1 неделя
2 FFmpeg filter vf_cuda_ipc_export + patched FFmpeg build 1-2 недели
3 C++ / Python bindings 1 неделя
4 Docker packaging + Frigate drop-in image 3-5 дней
5 Reference consumer: 16-камерный mosaic compositor 1 неделя
6 OSS launch (HN, reddit, FFmpeg upstream PR) 3-5 дней

Contributing

Проект на ранней стадии. Перед PR сверьтесь с docs/architecture.md и CONTRIBUTING.md.

S
Description
No description provided
Readme LGPL-2.1 601 KiB
2026-05-19 17:49:50 +01:00
Languages
C 54.3%
C++ 24.1%
Cuda 15.1%
CMake 3%
Python 2%
Other 1.5%