gx 98a60b7730 header v2: address arch review R3 + Y4/Y5/Y6/Y7/Y9
R3 (publisher API не работает с FFmpeg's hwframe pool):
- Добавлен ownership_mode field: LIBRARY (default, текущий API) или EXTERNAL.
- Новая функция publisher_create_external(cuda_ptrs[], ptr_count, frame_size)
  для случая когда CUDA память выделена upstream (FFmpeg AVHWFramesContext).
- Новая publish_external(cuda_ptr) — публикует один из pre-registered handles.
- Для FFmpeg filter теперь zero-copy: filter получает AVFrame, library уже
  имеет IPC handle на этот pointer (registered в create), publish — atomic seq bump.

R1/R2 closure отражено в API:
- publish() теперь принимает cudaStream_t — library делает cudaEventRecord
  вместо stream sync.
- next() теперь принимает consumer_stream — library делает cudaStreamWaitEvent
  перед возвратом frame. Cross-process sync через cudaIpcEventHandle_t.

Y6 (opaque frame через handle, не struct с _internal_*):
- cuframes_frame_t стал opaque (typedef struct, не определена).
- Accessor functions: cuda_ptr, format, size, pitch_y, pitch_uv, seq, pts_ns.
- ABI-stable при добавлении полей в minor releases.

Y7 (redundant try_next):
- Удалён subscriber_try_next. next(.., timeout_ms=0) — non-blocking
  с CUFRAMES_ERR_WOULD_BLOCK.

Y5 (consumer_name uniqueness):
- Документировано что duplicate name → ALREADY_EXISTS.
- Добавлен CUFRAMES_ERR_TOO_MANY для случая >32 subscribers.

Y9 (pts_ns clock):
- Документировано что MONOTONIC у publisher'а, consumer должен sanity-check
  на epoch reset при publisher restart.

Также:
- meta-блок (cuframes_frame_meta_t) перестал быть public — meta доступна
  через accessor'ы на opaque frame.
- _reserved[4] в configs для forward-compat без breaking ABI.
- Добавлен cuframes_protocol_version() — wire protocol majoring отдельно
  от lib version.

Готов к Step 2 (docs/protocol.md + implementation).
2026-05-14 23:02:50 +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%