From 20c56d74356c6d77370ef75f46f3c8be3b515a8e Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Fri, 24 Oct 2025 15:15:16 +0800 Subject: [PATCH 01/10] fix: fix unable to locate __arm_tpidr2_save for android ffi. --- webrtc-sys/libwebrtc/build_android.sh | 6 +++++- .../libwebrtc/patches/disable_sme_for_libyuv.patch | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 webrtc-sys/libwebrtc/patches/disable_sme_for_libyuv.patch diff --git a/webrtc-sys/libwebrtc/build_android.sh b/webrtc-sys/libwebrtc/build_android.sh index 1222cfdfb..7018843f4 100755 --- a/webrtc-sys/libwebrtc/build_android.sh +++ b/webrtc-sys/libwebrtc/build_android.sh @@ -72,7 +72,10 @@ git apply "$COMMAND_DIR/patches/ssl_verify_callback_with_native_handle.patch" -v git apply "$COMMAND_DIR/patches/add_deps.patch" -v --ignore-space-change --ignore-whitespace --whitespace=nowarn git apply "$COMMAND_DIR/patches/android_use_libunwind.patch" -v --ignore-space-change --ignore-whitespace --whitespace=nowarn -cd .. +cd third_party/libyuv +git apply "$COMMAND_DIR/patches/disable_sme_for_libyuv.patch" -v --ignore-space-change --ignore-whitespace --whitespace=nowarn + +cd ../../.. mkdir -p "$ARTIFACTS_DIR/lib" @@ -95,6 +98,7 @@ args="is_debug=$debug \ is_component_build=false \ enable_stripping=true \ rtc_use_h264=false \ + rtc_use_h265=true \ rtc_use_pipewire=false \ symbol_level=0 \ enable_iterator_debugging=false \ diff --git a/webrtc-sys/libwebrtc/patches/disable_sme_for_libyuv.patch b/webrtc-sys/libwebrtc/patches/disable_sme_for_libyuv.patch new file mode 100644 index 000000000..adee58a20 --- /dev/null +++ b/webrtc-sys/libwebrtc/patches/disable_sme_for_libyuv.patch @@ -0,0 +1,13 @@ +diff --git a/libyuv.gni b/libyuv.gni +index 3334df70..9859a121 100644 +--- a/libyuv.gni ++++ b/libyuv.gni +@@ -24,7 +24,7 @@ declare_args() { + # errors on Fuchsia, macOS, and compilation errors on Windows. + # TODO: bug 359006069 - Remove the restriction after the linker and + # compilation errors are fixed. +- libyuv_use_sme = current_cpu == "arm64" && (is_linux || is_android) ++ libyuv_use_sme = current_cpu == "arm64" && (is_linux) + libyuv_use_msa = + (current_cpu == "mips64el" || current_cpu == "mipsel") && mips_use_msa + libyuv_use_mmi = From 972e16b001070686563a13da02f4adad6ae49bb3 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Fri, 24 Oct 2025 18:06:31 +0800 Subject: [PATCH 02/10] fix. --- livekit-ffi/Cargo.toml | 1 + webrtc-sys/build.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/livekit-ffi/Cargo.toml b/livekit-ffi/Cargo.toml index 0bee03a93..a54c5ab86 100644 --- a/livekit-ffi/Cargo.toml +++ b/livekit-ffi/Cargo.toml @@ -40,6 +40,7 @@ from_variants = "1.0.2" [target.'cfg(target_os = "android")'.dependencies] jni = "0.21.1" +link-cplusplus = { version = "1", features = ["nothing"] } [build-dependencies] prost-build = "0.14.1" diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index 53df0a114..30f28ac3a 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -252,6 +252,7 @@ fn main() { configure_android_sysroot(&mut builder); + println!("cargo:rustc-link-lib=c++abi"); builder.file("src/android.cpp").flag("-std=c++20").cpp_link_stdlib("c++_static"); } _ => { From 1b96ef328caaa5b8941e6f514e34534f40e87ca6 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Fri, 24 Oct 2025 18:55:29 +0800 Subject: [PATCH 03/10] Add H265 and Simulcast support for iOS/macOS. --- examples/wgpu_room/src/logo_track.rs | 4 ++-- webrtc-sys/src/objc_video_factory.mm | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/examples/wgpu_room/src/logo_track.rs b/examples/wgpu_room/src/logo_track.rs index cda3e4c49..03b1a0ec4 100644 --- a/examples/wgpu_room/src/logo_track.rs +++ b/examples/wgpu_room/src/logo_track.rs @@ -77,8 +77,8 @@ impl LogoTrack { LocalTrack::Video(track.clone()), TrackPublishOptions { source: TrackSource::Camera, - simulcast: false, - video_codec: VideoCodec::H264, + simulcast: true, + video_codec: VideoCodec::H265, ..Default::default() }, ) diff --git a/webrtc-sys/src/objc_video_factory.mm b/webrtc-sys/src/objc_video_factory.mm index 8839b15ef..8f4128a45 100644 --- a/webrtc-sys/src/objc_video_factory.mm +++ b/webrtc-sys/src/objc_video_factory.mm @@ -16,20 +16,23 @@ #include "livekit/objc_video_factory.h" -#import -#import +#import +#import +#import #include "sdk/objc/native/api/video_decoder_factory.h" #include "sdk/objc/native/api/video_encoder_factory.h" namespace livekit { std::unique_ptr CreateObjCVideoEncoderFactory() { - // TODO(theomonnom): Simulcast? - return webrtc::ObjCToNativeVideoEncoderFactory([[RTCVideoEncoderFactoryH264 alloc] init]); + RTCDefaultVideoEncoderFactory* encoderFactory = [[RTCDefaultVideoEncoderFactory alloc] init]; + RTCVideoEncoderFactorySimulcast* simulcastFactory = + [[RTCVideoEncoderFactorySimulcast alloc] initWithPrimary:encoderFactory fallback:encoderFactory]; + return webrtc::ObjCToNativeVideoEncoderFactory(simulcastFactory); } std::unique_ptr CreateObjCVideoDecoderFactory() { - return webrtc::ObjCToNativeVideoDecoderFactory([[RTCVideoDecoderFactoryH264 alloc] init]); + return webrtc::ObjCToNativeVideoDecoderFactory([[RTCDefaultVideoDecoderFactory alloc] init]); } } // namespace livekit From 02dd9266b49cfe1965c851723bcf95eca233e4fd Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Fri, 24 Oct 2025 18:56:44 +0800 Subject: [PATCH 04/10] bump version for libwebrtc. --- webrtc-sys/build/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webrtc-sys/build/src/lib.rs b/webrtc-sys/build/src/lib.rs index 7daedc3ef..bd70caeda 100644 --- a/webrtc-sys/build/src/lib.rs +++ b/webrtc-sys/build/src/lib.rs @@ -27,7 +27,7 @@ use regex::Regex; use reqwest::StatusCode; pub const SCRATH_PATH: &str = "livekit_webrtc"; -pub const WEBRTC_TAG: &str = "webrtc-ebd5a9f"; +pub const WEBRTC_TAG: &str = "webrtc-ebd5a9f-2"; pub const IGNORE_DEFINES: [&str; 2] = ["CR_CLANG_REVISION", "CR_XCODE_VERSION"]; pub fn target_os() -> String { From 312458a7060553342edeaf827efc82b91514673f Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Fri, 24 Oct 2025 20:10:20 +0800 Subject: [PATCH 05/10] Update build.rs --- webrtc-sys/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index 30f28ac3a..b97548674 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -253,6 +253,7 @@ fn main() { configure_android_sysroot(&mut builder); println!("cargo:rustc-link-lib=c++abi"); + println!("cargo:rustc-link-lib=c++_static"); builder.file("src/android.cpp").flag("-std=c++20").cpp_link_stdlib("c++_static"); } _ => { From a2f062dc2533b03822ff6be3f274966bbddd93ad Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Fri, 24 Oct 2025 20:20:41 +0800 Subject: [PATCH 06/10] Remove ndk_arch from Android build configurations Removed ndk_arch entries for Android builds in the workflow. --- .github/workflows/ffi-builds.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/ffi-builds.yml b/.github/workflows/ffi-builds.yml index 0b7d3837d..4f0d8f8a4 100644 --- a/.github/workflows/ffi-builds.yml +++ b/.github/workflows/ffi-builds.yml @@ -89,7 +89,6 @@ jobs: dylib: liblivekit_ffi.so jar: libwebrtc.jar target: aarch64-linux-android - ndk_arch: aarch64-unknown-linux-musl name: ffi-android-arm64 buildargs: --no-default-features --features "rustls-tls-webpki-roots" - os: ubuntu-latest @@ -97,7 +96,6 @@ jobs: dylib: liblivekit_ffi.so jar: libwebrtc.jar target: armv7-linux-androideabi - ndk_arch: arm-unknown-linux-musleabihf name: ffi-android-armv7 buildargs: --no-default-features --features "rustls-tls-webpki-roots" - os: ubuntu-latest @@ -105,7 +103,6 @@ jobs: dylib: liblivekit_ffi.so jar: libwebrtc.jar target: x86_64-linux-android - ndk_arch: x86_64-unknown-linux-musl name: ffi-android-x86_64 buildargs: --no-default-features --features "rustls-tls-webpki-roots" @@ -171,7 +168,6 @@ jobs: if: ${{ matrix.platform == 'android' }} run: | cd livekit-ffi/ - ln -sf $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/lib/${{ matrix.ndk_arch }}/{libunwind.so,libc++abi.a} $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/lib/ cargo install cargo-ndk cargo ndk --target ${{ matrix.target }} build --release ${{ matrix.buildargs }} From b5a60d908f258873614645219bd46cfb3837f360 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Sun, 26 Oct 2025 20:06:02 +0800 Subject: [PATCH 07/10] fix. --- webrtc-sys/build.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index b97548674..e67bc04ae 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -252,9 +252,9 @@ fn main() { configure_android_sysroot(&mut builder); - println!("cargo:rustc-link-lib=c++abi"); + builder.file("src/android.cpp").flag("-std=c++20"); println!("cargo:rustc-link-lib=c++_static"); - builder.file("src/android.cpp").flag("-std=c++20").cpp_link_stdlib("c++_static"); + println!("cargo:rustc-link-lib=c++abi"); } _ => { panic!("Unsupported target, {}", target_os); @@ -341,9 +341,15 @@ fn configure_darwin_sysroot(builder: &mut cc::Build) { } fn configure_android_sysroot(builder: &mut cc::Build) { + let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); let toolchain = webrtc_sys_build::android_ndk_toolchain().unwrap(); - let toolchain_lib = toolchain.join("lib"); - + let ndk_arch = match target_arch.as_str() { + "x86_64" => "x86_64-unknown-linux-musl", + "aarch64" => "aarch64-unknown-linux-musl", + "arm" => "arm-unknown-linux-musleabihf", + _ => panic!("Unsupported target_arch: {}", target_arch), + }; + let toolchain_lib = toolchain.join("lib/").join(ndk_arch); let sysroot = toolchain.join("sysroot").canonicalize().unwrap(); println!("cargo:rustc-link-search={}", toolchain_lib.display()); From a0ba6c7908c5240c31564362803e736cbeb8b4a0 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Sun, 26 Oct 2025 21:22:11 +0800 Subject: [PATCH 08/10] fix --- webrtc-sys/build.rs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index e67bc04ae..76bf201f5 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -249,12 +249,11 @@ fn main() { println!("cargo:rustc-link-lib=EGL"); println!("cargo:rustc-link-lib=OpenSLES"); - - configure_android_sysroot(&mut builder); - - builder.file("src/android.cpp").flag("-std=c++20"); println!("cargo:rustc-link-lib=c++_static"); println!("cargo:rustc-link-lib=c++abi"); + + configure_android_sysroot(&mut builder); + builder.file("src/android.cpp").flag("-std=c++20"); } _ => { panic!("Unsupported target, {}", target_os); @@ -341,17 +340,7 @@ fn configure_darwin_sysroot(builder: &mut cc::Build) { } fn configure_android_sysroot(builder: &mut cc::Build) { - let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); let toolchain = webrtc_sys_build::android_ndk_toolchain().unwrap(); - let ndk_arch = match target_arch.as_str() { - "x86_64" => "x86_64-unknown-linux-musl", - "aarch64" => "aarch64-unknown-linux-musl", - "arm" => "arm-unknown-linux-musleabihf", - _ => panic!("Unsupported target_arch: {}", target_arch), - }; - let toolchain_lib = toolchain.join("lib/").join(ndk_arch); let sysroot = toolchain.join("sysroot").canonicalize().unwrap(); - println!("cargo:rustc-link-search={}", toolchain_lib.display()); - builder.flag(format!("-isysroot{}", sysroot.display()).as_str()); } From 1eacb5e9fe7dad2a9d5a8fbb120de83fb0063855 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Sun, 26 Oct 2025 21:50:47 +0800 Subject: [PATCH 09/10] cargo fmt. --- webrtc-sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webrtc-sys/build.rs b/webrtc-sys/build.rs index 76bf201f5..e40339b75 100644 --- a/webrtc-sys/build.rs +++ b/webrtc-sys/build.rs @@ -251,7 +251,7 @@ fn main() { println!("cargo:rustc-link-lib=OpenSLES"); println!("cargo:rustc-link-lib=c++_static"); println!("cargo:rustc-link-lib=c++abi"); - + configure_android_sysroot(&mut builder); builder.file("src/android.cpp").flag("-std=c++20"); } From de7c6e2499e55b496ef9182fd41324ce6b777fc2 Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Mon, 27 Oct 2025 08:57:56 +0800 Subject: [PATCH 10/10] Update builds.yml --- .github/workflows/builds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index fd161042c..df284c3f5 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -105,4 +105,4 @@ jobs: ln -sf $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/lib/${{ matrix.ndk_arch }}/{libunwind.so,libc++abi.a} $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/lib/ cargo install cargo-ndk # FIXME: wgpu_room does not link on aarch64 - cargo ndk --target ${{ matrix.target }} build --release -p livekit --workspace --exclude wgpu_room -vv + cargo ndk --target ${{ matrix.target }} build --release -p livekit --workspace -vv