libavformat: cuframes_packets demuxer (cuframes v0.2) #1
Reference in New Issue
Block a user
Delete Branch "n7.1-cuframes-v0.2"
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?
Draft PR — depends on cuframes v0.2 (gx/cuframes PR #4).
Что
Companion демуксер к существующему
cuframes://—cuframes_packets://<key>выдаёт encoded H.264/H.265 stream напрямую из publisher'а без декодирования.Use case
В Frigate:
→ 1 RTSP connection к камере вместо 2-3 (текущая ситуация). Каждый camera сегодня даёт 2-5 streams одновременно через RTSP-сервер камеры, что Dahua/Hikvision capping'ает.
Реализация
libavformat/cuframes_packetsdec.ccuframes_subscriber_create+enable_packets+get_codec_params. read_packet →next_packet→ memcpy в AVPacket.libavformat/MakefileCONFIG_CUFRAMES_PACKETS_DEMUXER→cuframes_packetsdec.olibavformat/allformats.cextern const FFInputFormat ff_cuframes_packets_demuxer;configurecuframes_packets_demuxer_deps="libcuframes"Flag mapping:
CUFRAMES_PKT_FLAG_KEYAV_PKT_FLAG_KEYCUFRAMES_PKT_FLAG_CORRUPTAV_PKT_FLAG_CORRUPTCUFRAMES_PKT_FLAG_DISCONTINUITYAV_PKT_FLAG_DISCONTINUITY(if FFmpeg has it)Error handling:
CUFRAMES_ERR_PACKET_OVERRUN→AVERROR(EAGAIN)+ warning (library уже resync'нула на keyframe, next call восстановит).CUFRAMES_ERR_DISCONNECTED→AVERROR_EOF.Dependency
Требует
libcuframesс v0.2 API (cuframes_subscriber_enable_packets,_next_packet,_get_codec_params). Это в gx/cuframes PR #4 — должен быть merged в main и установлен до этой сборки.Acceptance (для не-draft merge)
./configure --enable-libcuframes ... | grep cuframes_packetsffmpeg -formats | grep cuframes_packets→D cuframes_packets cuframes encoded packet ring--enable-packet-ring→ ffmpeg consumer с-c:v copy→ mp4 файл playable, без glitches.Related
Companion к существующему cuframes://. URL `cuframes_packets://<key>` открывает encoded packet ring у publisher'а (поднятого с --enable-packet-ring) и выдаёт raw H.264/H.265 stream без декодирования. Use case в Frigate config: cameras: cam_parking: ffmpeg: inputs: - path: cuframes://cam-parking # decoded NV12 для detect roles: [detect] - path: cuframes_packets://cam-parking # encoded H.264 для record input_args: -f cuframes_packets roles: [record] → 1 RTSP connection к камере (вместо 2-3). Implementation: - read_header: cuframes_subscriber_create + enable_packets + get_codec_params (codec_id + extradata → AVStream.codecpar). - read_packet: cuframes_subscriber_next_packet → memcpy в AVPacket. PACKET_OVERRUN → EAGAIN (library resync'нет на next call). - AV_PKT_FLAG_KEY/CORRUPT/DISCONTINUITY mapping из cuframes flags. - pts/dts: ns from publisher → µs timebase. Build wiring: - configure: cuframes_packets_demuxer_deps="libcuframes" - libavformat/Makefile: CONFIG_CUFRAMES_PACKETS_DEMUXER → cuframes_packetsdec.o - libavformat/allformats.c: extern ff_cuframes_packets_demuxer