v0.2: encoded packet ring #4
Reference in New Issue
Block a user
Delete Branch "v0.2-encoded-packets"
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 — design + incremental implementation для issue #2 (encoded packet sharing).
Что в этом PR
✅ Step 1: Protocol design (
docs/protocol.md§10) — committedad75aa9Полная wire-protocol spec:
/dev/shm/cuframes-<key>-packets(variable-length byte buffer + slot index)proto_version=2publishers принимают v1 subscribers (frames-only)initial_packet_seqв SUBSCRIBE_RESPcuframes_publisher_publish_packet,cuframes_subscriber_next_packet,cuframes_subscriber_get_codec_params⏳ Steps 2-6: Implementation (TBD)
libcuframes/src/packet_ring.c— bytes-backed ring impl (POSIX SHM, atomic head/tail, seqlock read)cuframes.h+ RAII wrapperscuframes.hppcuframes-rtsp-source— дублирует AVPacket в packet ring до decoderlibavformat/cuframes_packetsdec.cв ffmpeg-patched repoЧто review сейчас (design)
Specifically прошу feedback на:
Sizing defaults в §10.3:
packet_ring_slots = 64(≈ 2 sec @ 30 fps)packet_data_size = 8 MBmax_packet_size = 2 MBДля H.265 4K cameras с большими IDR (1-2 MB) этого может не хватать. Стоит ли поднять defaults?
data_offsetsemantics в §10.5:% data_sizecodec_extradata_size= 4096 bytes max в §10.4:Sub-stream selection — отложено в v0.3 (§10.16). Сейчас один
key= один stream. Но Dahua/Hikvision камеры дают main+sub stream через тот же RTSP. Стоит ли в v0.2 включать?Audio packets — тоже v0.3 (§10.16). Но если Frigate record хочет mux'ить audio (некоторые users) — нужно сразу заложить?
Versioning при codec change mid-stream — текущий design требует publisher destroy+recreate. Возможна ли graceful invalidation (например, bump
generation_idв SHM)?Acceptance (для merge не-draft когда impl будет готова)
ffmpeg -formats | grep cuframes_packetsшows demuxercuframes://<key>для detect +cuframes_packets://<key>для record — 1 RTSP к камере вместо 2Связано
docs/protocol.md§10 — full specТесты: - libcuframes/tests/test_packet_ring.c — 2 scenarios: 1) normal flow: 1 pub × 1 sub × 2000 packets, varied sizes, GOP=30, payload integrity check (seq в первых 8 байтах + pattern). PTS monotonicity, first KEY seq, нет data errors. 2) slow consumer (10ms delay): publisher 200 fps, subscriber должен detect OVERRUN, library resync на keyframe — verify received >10 даже на сильно медленном консьюмере. - libcuframes/tests/CMakeLists.txt: add_test packet_ring_basic. Docs: - CHANGELOG.md: новая [Unreleased] секция с full v0.2 highlights и явно declared limitations (sub-stream, audio, codec change → v0.3). - docs/integrations/frigate.md: новая секция "v0.2: dual-input (detect + record через один RTSP)" с config example, requirements, trade-offs. Связано: #2, PR #4. Step 6 (final) перед снятием draft.