v0.2: encoded packet sharing (для Frigate record path без второго RTSP) #2
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Motivation
Текущий cuframes v0.1 раздает decoded NV12 frames через CUDA IPC. Это идеально для consumer'ов которые делают detect/AI/processing.
Но Frigate (как и любой recorder) для record roles делает
-c:v copy— берёт encoded H.264/H.265 stream и mux'ит в mp4 без decode. Сейчас Frigate должен открывать второй RTSP connection к камере для record stream (decode skipped, но второй RTSP-link на камеру).Proposal
Расширить cuframes публиковать encoded packets (H.264/H.265 NAL units) параллельно decoded frames — через отдельный shared ring.
Benefits
API Sketch
Producer
Consumer (sync API)
Same
keynamespace что v0.1 — но отдельный ring в одной публикации. Subscriber выбирает frames-ring и/или packets-ring приcuframes_subscriber_create()(новая опция).FFmpeg demuxer extension
cuframes_packets://— комплементарный к существующемуcuframes://. AVPacket'ы выдаются 1-в-1 как они пришли с камеры, без decode. Codec info (SPS/PPS, profile, level) extracted из первого SETUP/RTSP DESCRIBE и шарится через protocol header.Implementation plan
cuframes-rtsp-sourceпослеav_read_frame()дублировать AVPacket в encoded ring до передачи в decoder.libavformat/cuframes_packetsdec.c—cuframes_packets_read_packetкопирует bytes из shared ring в AVPacket. Включить SPS/PPS handshake.BUILD_ENCODED_RING=ONшлёт только NV12 (как v0.1). С опцией — оба rings active.Edge cases
Связь с Frigate
После v0.2 — Frigate config'ы parking-камер мoгут быть полностью через cuframes:
cuframes://cuframes_packets://Это сильное value-add для community. Сейчас Frigate users регулярно жалуются на NVDEC saturation (Frigate#17033, #20191).
Effort estimate
~1-2 недели focused работы. См. ROADMAP.md.
Related
Sub-task: publisher-side resize
Дополнение к v0.2: publisher должен поддерживать pre-scaling кадров до target size перед публикацией:
Motivation
Patched FFmpeg для downstream consumer'ов (Frigate / FFmpeg-based) собирается без
--enable-cuda-llvmна runtime платформах с glibc < 2.38 (Debian 12, CentOS 8). Без cuda-llvm — нетscale_cudaфильтра → consumer вынужден CPU-resize либо отключить hwaccel совсем.Publisher-side resize устраняет эту зависимость: consumer получает frames уже нужного размера, scale-фильтр не нужен.
Дополнительные выгоды
Implementation sketch
В
cuframes-rtsp-source:avcodec_receive_frame()— apply CUDA-side resize (через CUDA kernel либо libavfilterscale_cudaесли builder image его имеет)cuframes_publisher_config_t::width/heightотражают post-scale размерыВ libcuframes — никаких изменений, scale делается на стороне publisher'а в memory before publish.
Multi-key setup для разных resolutions
Один RTSP → multiple cuframes publishers с разными keys/scales:
(Или extend single instance чтобы publish'ить под multiple keys одновременно — TBD.)
Delivered в v0.2.0:
cuframes_packets://demuxer) — mergedВсе 6 шагов из issue plan завершены, CI зелёный, stress test в
libcuframes/tests/test_packet_ring.c.Frigate dual-input config готов:
docs/integrations/frigate.mdсекция "v0.2: dual-input".