feat(encode): add Jetson Multimedia API encoder backend
Integrate a native Jetson Multimedia API encoder path and keep the existing encoded access-unit contract for RTMP, RTP, and recording consumers. This adds conditional Jetson MMAPI detection in CMake, builds the required NVIDIA sample common classes into a dedicated support library, and compiles the new backend only when the platform dependencies are present. The runtime selector now lets encoder.backend=auto prefer Jetson MM for NVIDIA hardware requests while keeping encoder.backend=ffmpeg as an explicit FFmpeg path. Device selection semantics are updated so nvidia requires the Jetson backend, auto can fall back to FFmpeg software, and software remains FFmpeg-only. The Jetson backend converts supported raw inputs through swscale, feeds NvVideoEncoder in YUV420M, emits Annex-B access units, and harvests decoder configuration from a warmup keyframe so downstream packetizers keep their existing contract. This also splits FFmpeg encoder option handling into a shared header, updates runtime config/help text and tester defaults, and refreshes compatibility/caveat documentation to reflect the new selection behavior. Build-tree runtime RPATH handling is tightened so GCC 15 builds keep the matching libstdc++ visible locally. Verification covered GCC 15 builds, RTP H.264/H.265 tester runs, RTMP H.264 stub publish, local live SRS smoke with cvmmap://zed1, and remote execution on 192.168.2.155 using the deployed bundle lib directory for the GCC 15 runtime.
This commit is contained in:
+19
-13
@@ -16,30 +16,36 @@ Legacy flags such as `--shm-name`, `--zmq-endpoint`, `--input-mode`, and the dum
|
||||
|
||||
## Encoder Path
|
||||
|
||||
### FFmpeg Is The Only Encoder Backend
|
||||
### Jetson Hardware Encode Uses The Jetson Multimedia API Backend
|
||||
|
||||
The public backend surface is:
|
||||
The public backend surface is still:
|
||||
|
||||
- `--encoder-backend auto`
|
||||
- `--encoder-backend ffmpeg`
|
||||
|
||||
Both resolve to the FFmpeg encoder path. The removed GStreamer backend is no longer available.
|
||||
`--encoder-backend ffmpeg` keeps the existing FFmpeg encoder path.
|
||||
`--encoder-backend auto` may now select the in-repo Jetson Multimedia API backend on Jetson builds when hardware encoding is requested.
|
||||
|
||||
### NVENC Is Optional
|
||||
The removed GStreamer backend is still unavailable.
|
||||
|
||||
When `--encoder-device nvidia` is selected, FFmpeg must expose `h264_nvenc` and `hevc_nvenc`.
|
||||
### NVIDIA Device Mode On Jetson No Longer Depends On FFmpeg Hardware Encoders
|
||||
|
||||
Useful local checks:
|
||||
On Jetson builds with `CVMMAP_STREAMER_ENABLE_JETSON_MM` enabled, `--encoder-device nvidia` uses the Jetson Multimedia API encoder directly rather than desktop `*_nvenc` or Jetson FFmpeg `*_v4l2m2m` encoder exposure.
|
||||
|
||||
Selection behavior is now:
|
||||
|
||||
- `--encoder-device software` -> FFmpeg software encode (`libx264`/`libx265`)
|
||||
- `--encoder-device nvidia` -> Jetson Multimedia API backend only; fail if unavailable
|
||||
- `--encoder-device auto` -> try Jetson Multimedia API first on Jetson builds, then fall back to FFmpeg software
|
||||
|
||||
Useful local checks on Jetson:
|
||||
|
||||
```bash
|
||||
ffmpeg -hide_banner -encoders | rg 'nvenc|libx264|libx265'
|
||||
test -e /dev/v4l2-nvenc
|
||||
gst-inspect-1.0 nvv4l2h264enc nvv4l2h265enc
|
||||
```
|
||||
|
||||
If NVENC is unavailable, use:
|
||||
|
||||
```bash
|
||||
--encoder-device software
|
||||
```
|
||||
FFmpeg encoder enumeration is no longer the authoritative Jetson hardware-encode check for this repo.
|
||||
|
||||
### Low-Latency Defaults
|
||||
|
||||
@@ -47,7 +53,7 @@ The current low-latency defaults are:
|
||||
|
||||
- `gop=30`
|
||||
- `b_frames=0`
|
||||
- NVENC preset/tune tuned for low latency
|
||||
- encoder-family-specific low-latency options where FFmpeg exposes them
|
||||
|
||||
This favors immediacy over compression efficiency.
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ Notes:
|
||||
|
||||
- RTMP is Enhanced RTMP only.
|
||||
- The custom RTMP packetizer and domestic mode are removed.
|
||||
- `encoder.backend` remains `auto|ffmpeg`; both resolve to FFmpeg.
|
||||
- `encoder.backend` remains `auto|ffmpeg`; `auto` may select Jetson Multimedia API on Jetson builds, while `ffmpeg` forces the FFmpeg encoder path.
|
||||
|
||||
## Optional Checks (Non-Blocking)
|
||||
|
||||
@@ -60,7 +60,7 @@ Current recording scope:
|
||||
|
||||
| Setting | Value |
|
||||
|---------|-------|
|
||||
| Encoder backend | `auto` -> FFmpeg |
|
||||
| Encoder backend | `auto` -> Jetson MM on Jetson hardware requests, else FFmpeg |
|
||||
| RTMP transport | `libavformat` |
|
||||
| RTMP mode | Enhanced only |
|
||||
| Encoder device | `auto` |
|
||||
|
||||
Reference in New Issue
Block a user