libavformat: cuframes_packets demuxer (cuframes v0.2) #1

Merged
gx merged 1 commits from n7.1-cuframes-v0.2 into n7.1-cuframes 2026-05-19 17:47:30 +01:00
Owner

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:

cameras:
  cam_parking:
    ffmpeg:
      inputs:
        - path: cuframes://cam-parking          # decoded NV12 для detect
          input_args: preset-cuframes
          roles: [detect]
        - path: cuframes_packets://cam-parking  # encoded для record (no decode!)
          input_args: -f cuframes_packets
          roles: [record]

1 RTSP connection к камере вместо 2-3 (текущая ситуация). Каждый camera сегодня даёт 2-5 streams одновременно через RTSP-сервер камеры, что Dahua/Hikvision capping'ает.

Реализация

Component Что
libavformat/cuframes_packetsdec.c новый файл, ~240 LOC. read_header → cuframes_subscriber_create + enable_packets + get_codec_params. read_packet → next_packet → memcpy в AVPacket.
libavformat/Makefile CONFIG_CUFRAMES_PACKETS_DEMUXERcuframes_packetsdec.o
libavformat/allformats.c extern const FFInputFormat ff_cuframes_packets_demuxer;
configure cuframes_packets_demuxer_deps="libcuframes"

Flag mapping:

cuframes flag AVPacket flag
CUFRAMES_PKT_FLAG_KEY AV_PKT_FLAG_KEY
CUFRAMES_PKT_FLAG_CORRUPT AV_PKT_FLAG_CORRUPT
CUFRAMES_PKT_FLAG_DISCONTINUITY AV_PKT_FLAG_DISCONTINUITY (if FFmpeg has it)

Error handling:

  • CUFRAMES_ERR_PACKET_OVERRUNAVERROR(EAGAIN) + warning (library уже resync'нула на keyframe, next call восстановит).
  • CUFRAMES_ERR_DISCONNECTEDAVERROR_EOF.

Dependency

Требует libcuframes с v0.2 API (cuframes_subscriber_enable_packets, _next_packet, _get_codec_params). Это в gx/cuframes PR #4 — должен быть merged в main и установлен до этой сборки.

Acceptance (для не-draft merge)

  • gx/cuframes PR #4 merged
  • Configure passes: ./configure --enable-libcuframes ... | grep cuframes_packets
  • Build clean: ffmpeg -formats | grep cuframes_packetsD cuframes_packets cuframes encoded packet ring
  • End-to-end test: cuframes-rtsp-source с --enable-packet-ring → ffmpeg consumer с -c:v copy → mp4 файл playable, без glitches.

Related

  • gx/cuframes PR #4 (v0.2 library work)
  • gx/cuframes issue #2 (feature request с motivation + benchmarks expectation)
**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: ```yaml cameras: cam_parking: ffmpeg: inputs: - path: cuframes://cam-parking # decoded NV12 для detect input_args: preset-cuframes roles: [detect] - path: cuframes_packets://cam-parking # encoded для record (no decode!) input_args: -f cuframes_packets roles: [record] ``` → **1 RTSP connection** к камере вместо 2-3 (текущая ситуация). Каждый camera сегодня даёт 2-5 streams одновременно через RTSP-сервер камеры, что Dahua/Hikvision capping'ает. ## Реализация | Component | Что | |---|---| | `libavformat/cuframes_packetsdec.c` | новый файл, ~240 LOC. read_header → `cuframes_subscriber_create` + `enable_packets` + `get_codec_params`. read_packet → `next_packet` → memcpy в AVPacket. | | `libavformat/Makefile` | `CONFIG_CUFRAMES_PACKETS_DEMUXER` → `cuframes_packetsdec.o` | | `libavformat/allformats.c` | `extern const FFInputFormat ff_cuframes_packets_demuxer;` | | `configure` | `cuframes_packets_demuxer_deps="libcuframes"` | Flag mapping: | cuframes flag | AVPacket flag | |---|---| | `CUFRAMES_PKT_FLAG_KEY` | `AV_PKT_FLAG_KEY` | | `CUFRAMES_PKT_FLAG_CORRUPT` | `AV_PKT_FLAG_CORRUPT` | | `CUFRAMES_PKT_FLAG_DISCONTINUITY` | `AV_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) - [ ] gx/cuframes PR #4 merged - [ ] Configure passes: `./configure --enable-libcuframes ... | grep cuframes_packets` - [ ] Build clean: `ffmpeg -formats | grep cuframes_packets` → `D cuframes_packets cuframes encoded packet ring` - [ ] End-to-end test: cuframes-rtsp-source с `--enable-packet-ring` → ffmpeg consumer с `-c:v copy` → mp4 файл playable, без glitches. ## Related - gx/cuframes PR #4 (v0.2 library work) - gx/cuframes issue #2 (feature request с motivation + benchmarks expectation)
gx added 1 commit 2026-05-19 17:03:53 +01:00
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
gx marked the pull request as ready for review 2026-05-19 17:47:21 +01:00
gx merged commit 77eef27e29 into n7.1-cuframes 2026-05-19 17:47:30 +01:00
gx deleted branch n7.1-cuframes-v0.2 2026-05-19 17:47:30 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gx/ffmpeg-patched#1