Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/wgpu_room/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ tracing = ["console-subscriber", "tokio/tracing"]
[dependencies]
tokio = { version = "1", features = ["full", "parking_lot"] }
livekit = { workspace = true, features = ["rustls-tls-native-roots"]}
webrtc-sys = { workspace = true, features = [ "use_vaapi", "use_nvidia" ] }
webrtc-sys = { workspace = true }
futures = "0.3"
winit = { version = "0.30.11", features = [ "android-native-activity" ] }
parking_lot = { version = "0.12.1", features = ["deadlock_detection"] }
Expand Down
2 changes: 1 addition & 1 deletion livekit-ffi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ tracing = ["tokio/tracing", "console-subscriber"]

[dependencies]
livekit = { workspace = true }
webrtc-sys = { workspace = true , features = [ "use_vaapi", "use_nvidia" ]}
webrtc-sys = { workspace = true }
soxr-sys = { workspace = true }
imgproc = { workspace = true }
livekit-protocol = { workspace = true }
Expand Down
3 changes: 1 addition & 2 deletions webrtc-sys/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ repository = "https://github.com/livekit/client-sdk-rust"

[features]
default = []
use_vaapi = []
use_nvidia = []

[dependencies]
cxx = "1.0"
Expand All @@ -21,6 +19,7 @@ webrtc-sys-build = { workspace = true }
cxx-build = "1.0"
glob = "0.3"
cc = "1.0"
pkg-config = "0.3.22"

[dev-dependencies]
env_logger = "0.10"
50 changes: 33 additions & 17 deletions webrtc-sys/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,23 +153,38 @@ fn main() {
println!("cargo:rustc-link-lib=dylib=pthread");
println!("cargo:rustc-link-lib=dylib=m");

match target_arch.as_str() {
"x86_64" => {
#[cfg(feature = "use_vaapi")]
builder
.file("src/vaapi/vaapi_display_drm.cpp")
.file("src/vaapi/vaapi_h264_encoder_wrapper.cpp")
.file("src/vaapi/vaapi_encoder_factory.cpp")
.file("src/vaapi/h264_encoder_impl.cpp")
.file("src/vaapi/implib/libva-drm.so.init.c")
.file("src/vaapi/implib/libva-drm.so.tramp.S")
.file("src/vaapi/implib/libva.so.init.c")
.file("src/vaapi/implib/libva.so.tramp.S")
.flag("-DUSE_VAAPI_VIDEO_CODEC=1");

#[cfg(feature = "use_nvidia")]
let x86 = target_arch == "x86_64" || target_arch == "i686";
let arm = target_arch == "aarch64" || target_arch.contains("arm");

if x86 {
// Do not use pkg_config::probe_library because libva is dlopened
// and pkg_config::probe_library would link it.
let libva_include = pkg_config::get_variable("libva", "includedir")
.expect("libva development headers not found");
builder
.include(libva_include)
.file("src/vaapi/vaapi_display_drm.cpp")
.file("src/vaapi/vaapi_h264_encoder_wrapper.cpp")
.file("src/vaapi/vaapi_encoder_factory.cpp")
.file("src/vaapi/h264_encoder_impl.cpp")
.file("src/vaapi/implib/libva-drm.so.init.c")
.file("src/vaapi/implib/libva-drm.so.tramp.S")
.file("src/vaapi/implib/libva.so.init.c")
.file("src/vaapi/implib/libva.so.tramp.S")
.flag("-DUSE_VAAPI_VIDEO_CODEC=1");
}

if x86 || arm {
let cuda_home = PathBuf::from(match env::var("CUDA_HOME") {
Ok(p) => p,
Err(_) => "/usr/local/cuda".to_owned(),
});
let cuda_include_dir = cuda_home.join("include");

// libcuda and libnvcuvid are dlopened, so do not link them.
if cuda_include_dir.join("cuda.h").exists() {
builder
.flag("-I/usr/local/cuda/include")
.include(cuda_include_dir)
.flag("-Isrc/nvidia/NvCodec/include")
.flag("-Isrc/nvidia/NvCodec/NvCodec")
.file("src/nvidia/NvCodec/NvCodec/NvDecoder/NvDecoder.cpp")
Expand All @@ -186,8 +201,9 @@ fn main() {
.file("src/nvidia/implib/libnvcuvid.so.tramp.S")
.flag("-Wno-deprecated-declarations")
.flag("-DUSE_NVIDIA_VIDEO_CODEC=1");
} else {
println!("cargo:warning=cuda.h not found; building without hardware accelerated video codec support for NVidia GPUs");
}
_ => {}
}

builder.flag("-Wno-changes-meaning").flag("-std=c++20");
Expand Down
4 changes: 4 additions & 0 deletions webrtc-sys/src/nvidia/cuda_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,11 @@ bool CudaContext::Initialize() {
cuDeviceGetName(device_name, sizeof(device_name), cu_device));
RTC_LOG(LS_INFO) << "CUDA device name: " << device_name;

#if CUDA_VERSION >= 13000
CUCTX_CUDA_CALL_ERROR(cuCtxCreate(&context, nullptr, 0, cu_device));
#else
CUCTX_CUDA_CALL_ERROR(cuCtxCreate(&context, 0, cu_device));
#endif
if (context == nullptr) {
RTC_LOG(LS_ERROR) << "Failed to create CUDA context.";
return false;
Expand Down