diff --git a/examples/wgpu_room/Cargo.toml b/examples/wgpu_room/Cargo.toml index e3f93cad5..8c9c0b73f 100644 --- a/examples/wgpu_room/Cargo.toml +++ b/examples/wgpu_room/Cargo.toml @@ -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"] } diff --git a/livekit-ffi/Cargo.toml b/livekit-ffi/Cargo.toml index 709983596..1ce330c76 100644 --- a/livekit-ffi/Cargo.toml +++ b/livekit-ffi/Cargo.toml @@ -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 } diff --git a/webrtc-sys/Cargo.toml b/webrtc-sys/Cargo.toml index f34c155ab..3bb541962 100644 --- a/webrtc-sys/Cargo.toml +++ b/webrtc-sys/Cargo.toml @@ -9,8 +9,6 @@ repository = "https://github.com/livekit/client-sdk-rust" [features] default = [] -use_vaapi = [] -use_nvidia = [] [dependencies] cxx = "1.0" @@ -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" diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index 0f5d4d2bd..db65563ed 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -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") @@ -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"); diff --git a/webrtc-sys/src/nvidia/cuda_context.cpp b/webrtc-sys/src/nvidia/cuda_context.cpp index 006e15519..f3a51ba45 100644 --- a/webrtc-sys/src/nvidia/cuda_context.cpp +++ b/webrtc-sys/src/nvidia/cuda_context.cpp @@ -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;