Skip to content

Commit 0067e10

Browse files
NVENC AV1 support (#1191)
- enable Nvidia GPU NVENC AV1 encoding --------- Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent cdcb5df commit 0067e10

16 files changed

Lines changed: 843 additions & 49 deletions

.changeset/nvenc-av1-encoding.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
webrtc-sys: patch
3+
libwebrtc: patch
4+
livekit: patch
5+
livekit-ffi: patch
6+
---
7+
8+
Add NVIDIA NVENC AV1 encoding when the GPU reports AV1 encode support.

README.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Use this SDK to add realtime video, audio and data features to your Rust app. By
3030
- [x] Dynacast
3131
- [x] Hardware video enc/dec
3232
- [x] H.264, H.265 using VideoToolbox (MacOS/iOS)
33-
- [x] H.264, H.265 on NVidia discrete GPUs (Linux)
33+
- [x] H.264, H.265, AV1 on NVidia discrete GPUs (Linux)
3434
- [x] H.264, H.265 on AMD CPUs & GPUs (Linux)
3535
- [x] H.264, H.265, AV1 on NVidia Jetson (Linux)
3636
- Supported Platforms
@@ -172,6 +172,29 @@ match event {
172172

173173
## Building
174174

175+
### Linux
176+
177+
Building on Ubuntu 24 x86_64:
178+
179+
```
180+
# install required libs
181+
sudo apt install -y \
182+
libglib2.0-dev build-essential clang \
183+
libclang-dev libc6-dev pkg-config libjpeg-turbo8-dev
184+
185+
# install cuda-toolkit if you have an Nvidia GPU and want to use NVENC for video encoding
186+
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
187+
sudo dpkg -i cuda-keyring_1.1-1_all.deb
188+
sudo apt update
189+
sudo apt install -y cuda-toolkit
190+
191+
# ensure CUDA_HOME env var is set
192+
export CUDA_HOME="$(dirname "$(dirname "$(sudo find /usr/local /usr -path '*/include/cuda.h' -print 2>/dev/null | grep -v '/linux/' | sort -V | tail -1)")")"
193+
194+
cargo build
195+
196+
```
197+
175198
### MacOS
176199

177200
When building on MacOS, `-ObjC` linker flag is needed. LiveKit's WebRTC implementation make use of ObjectiveC libraries on the Mac. You may get the following error if the app isn't linked with ObjC:

webrtc-sys/build.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ fn main() {
9696
"src/prohibit_libsrtp_initialization.cpp",
9797
"src/apm.cpp",
9898
"src/audio_mixer.cpp",
99+
"src/av1_bitstream.cpp",
99100
"src/packet_trailer.cpp",
100101
"src/packet_trailer_av1.cpp",
101-
"src/jetson/jetson_av1_bitstream.cpp",
102102
]);
103103

104104
if is_desktop {
@@ -289,6 +289,7 @@ fn main() {
289289
.file("src/nvidia/NvCodec/NvCodec/NvEncoder/NvEncoderCuda.cpp")
290290
.file("src/nvidia/h264_encoder_impl.cpp")
291291
.file("src/nvidia/h265_encoder_impl.cpp")
292+
.file("src/nvidia/av1_encoder_impl.cpp")
292293
.file("src/nvidia/h264_decoder_impl.cpp")
293294
.file("src/nvidia/h265_decoder_impl.cpp")
294295
.file("src/nvidia/nvidia_decoder_factory.cpp")

webrtc-sys/src/jetson/jetson_av1_bitstream.cpp renamed to webrtc-sys/src/av1_bitstream.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
#include "jetson_av1_bitstream.h"
17+
#include "av1_bitstream.h"
1818

1919
#include <algorithm>
2020

webrtc-sys/src/jetson/jetson_av1_bitstream.h renamed to webrtc-sys/src/av1_bitstream.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17-
#ifndef WEBRTC_JETSON_AV1_BITSTREAM_H_
18-
#define WEBRTC_JETSON_AV1_BITSTREAM_H_
17+
#ifndef WEBRTC_AV1_BITSTREAM_H_
18+
#define WEBRTC_AV1_BITSTREAM_H_
1919

2020
#include <cstddef>
2121
#include <cstdint>
@@ -70,4 +70,4 @@ bool IsWebRtcParseable(const uint8_t* data, size_t len);
7070
} // namespace av1
7171
} // namespace livekit
7272

73-
#endif // WEBRTC_JETSON_AV1_BITSTREAM_H_
73+
#endif // WEBRTC_AV1_BITSTREAM_H_

webrtc-sys/src/jetson/av1_encoder_impl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include "api/video/video_codec_constants.h"
2727
#include "api/video_codecs/scalability_mode.h"
2828
#include "common_video/libyuv/include/webrtc_libyuv.h"
29-
#include "jetson_av1_bitstream.h"
29+
#include "../av1_bitstream.h"
3030
#include "livekit/dmabuf_video_frame_buffer.h"
3131
#include "modules/video_coding/include/video_codec_interface.h"
3232
#include "modules/video_coding/include/video_error_codes.h"

webrtc-sys/src/nvidia/NvCodec/NvCodec/NvEncoder/NvEncoder.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,38 @@ bool NvEncoder::Reconfigure(
683683
return true;
684684
}
685685

686+
bool NvEncoder::SetRates(uint32_t frameRate, uint32_t averageBitrate) {
687+
if (!IsHWEncoderInitialized()) {
688+
return false;
689+
}
690+
if (frameRate == 0) {
691+
frameRate = 1;
692+
}
693+
694+
NV_ENC_RECONFIGURE_PARAMS reconfigureParams = {};
695+
reconfigureParams.version = NV_ENC_RECONFIGURE_PARAMS_VER;
696+
697+
NV_ENC_CONFIG encodeConfig = {};
698+
encodeConfig.version = NV_ENC_CONFIG_VER;
699+
reconfigureParams.reInitEncodeParams.version = NV_ENC_INITIALIZE_PARAMS_VER;
700+
reconfigureParams.reInitEncodeParams.encodeConfig = &encodeConfig;
701+
702+
GetInitializeParams(&reconfigureParams.reInitEncodeParams);
703+
704+
reconfigureParams.reInitEncodeParams.frameRateNum = frameRate;
705+
reconfigureParams.reInitEncodeParams.frameRateDen = 1;
706+
707+
encodeConfig.rcParams.averageBitRate = averageBitrate;
708+
encodeConfig.rcParams.vbvBufferSize = (averageBitrate / frameRate) * 5;
709+
encodeConfig.rcParams.vbvInitialDelay = encodeConfig.rcParams.vbvBufferSize;
710+
711+
try {
712+
return Reconfigure(&reconfigureParams);
713+
} catch (const NVENCException&) {
714+
return false;
715+
}
716+
}
717+
686718
NV_ENC_REGISTERED_PTR NvEncoder::RegisterResource(
687719
void* pBuffer,
688720
NV_ENC_INPUT_RESOURCE_TYPE eResourceType,

webrtc-sys/src/nvidia/NvCodec/NvCodec/NvEncoder/NvEncoder.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ class NvEncoder {
114114
*/
115115
bool Reconfigure(const NV_ENC_RECONFIGURE_PARAMS* pReconfigureParams);
116116

117+
/**
118+
* @brief Dynamically updates the encode bitrate and framerate on the live
119+
* session. Returns false if the encoder is not initialized or reconfigure
120+
* fails.
121+
*/
122+
bool SetRates(uint32_t frameRate, uint32_t averageBitrate);
123+
117124
/**
118125
* @brief This function is used to get the next available input buffer.
119126
* Applications must call this function to obtain a pointer to the next

0 commit comments

Comments
 (0)