Skip to content

Add NVENC AV1 hardware video encoding for WebRTC#2240

Open
larsers wants to merge 1 commit intogoogle:mainfrom
larsers:pr/nvenc-encoding
Open

Add NVENC AV1 hardware video encoding for WebRTC#2240
larsers wants to merge 1 commit intogoogle:mainfrom
larsers:pr/nvenc-encoding

Conversation

@larsers
Copy link

@larsers larsers commented Mar 9, 2026

Add GPU-accelerated video encoding via NVIDIA NVENC to the WebRTC streamer, with a plugin/provider architecture that supports multiple codecs and falls back gracefully to software VP8 when no NVIDIA GPU is available.

Key changes:

Provider/registry framework:

  • Add EncoderProvider/DecoderProvider abstract interfaces with singleton registries and priority-based selection
  • Add CompositeEncoderFactory/CompositeDecoderFactory that query all registered providers at runtime
  • Replace hardcoded VP8-only encoder factory with composite factory

NVENC encoding:

  • Add codec-agnostic NvencVideoEncoder driven by NvencEncoderConfig (codec GUIDs, bitrate limits, per-codec callback hooks)
  • Add AV1 NVENC provider with runtime GPU capability detection
  • Add CudaContext singleton for CUDA device management

Native ARGB/ABGR frame path:

  • Add AbgrBuffer and CvdAbgrVideoFrameBuffer for packed frame formats, eliminating CPU-side I420 conversion when NVENC is used
  • Modify DisplayHandler to pass native ARGB/ABGR frames directly
  • Modify VideoTrackSourceImpl for ABGR routing and monotonic timestamp enforcement

Build system:

  • Add rules_cuda, nv_codec_headers to MODULE.bazel
  • Add override_dh_shlibdeps for CUDA/NVENC shared libs
  • Use alwayslink = True for static initializer registration

Add GPU-accelerated video encoding via NVIDIA NVENC to the WebRTC
streamer, with a plugin/provider architecture that supports multiple
codecs and falls back gracefully to software VP8 when no NVIDIA GPU
is available.

Key changes:

Provider/registry framework:
- Add EncoderProvider/DecoderProvider abstract interfaces with
  singleton registries and priority-based selection
- Add CompositeEncoderFactory/CompositeDecoderFactory that query
  all registered providers at runtime
- Replace hardcoded VP8-only encoder factory with composite factory

NVENC encoding:
- Add codec-agnostic NvencVideoEncoder driven by NvencEncoderConfig
  (codec GUIDs, bitrate limits, per-codec callback hooks)
- Add AV1 NVENC provider with runtime GPU capability detection
- Add CudaContext singleton for CUDA device management

Native ARGB/ABGR frame path:
- Add AbgrBuffer and CvdAbgrVideoFrameBuffer for packed frame
  formats, eliminating CPU-side I420 conversion when NVENC is used
- Modify DisplayHandler to pass native ARGB/ABGR frames directly
- Modify VideoTrackSourceImpl for ABGR routing and monotonic
  timestamp enforcement

Build system:
- Add rules_cuda, nv_codec_headers to MODULE.bazel
- Add override_dh_shlibdeps for CUDA/NVENC shared libs
- Use alwayslink = True for static initializer registration
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants