From 668328144133ea07bb0cc530698f2d4d1673cca8 Mon Sep 17 00:00:00 2001 From: Kazuki Matsumoto Date: Tue, 19 Aug 2025 10:13:42 +0900 Subject: [PATCH 1/6] add patches --- BuildScripts~/build_libwebrtc_android.sh | 5 +++++ BuildScripts~/patches/libaom_av1_encoder.patch | 15 +++++++++++++++ BuildScripts~/patches/libvpx_vp9_encoder.patch | 15 +++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 BuildScripts~/patches/libaom_av1_encoder.patch create mode 100644 BuildScripts~/patches/libvpx_vp9_encoder.patch diff --git a/BuildScripts~/build_libwebrtc_android.sh b/BuildScripts~/build_libwebrtc_android.sh index 61843f663a..8e30af6880 100755 --- a/BuildScripts~/build_libwebrtc_android.sh +++ b/BuildScripts~/build_libwebrtc_android.sh @@ -48,6 +48,11 @@ patch -N "src/build/android/gyp/turbine.py" < "$COMMAND_DIR/patches/downgradeJDK # Fix SetRawImagePlanes() in LibvpxVp8Encoder patch -N "src/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp8_encoder.patch" +patch -N "src/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp9_encoder.patch" + +patch -N "src/modules/video_coding/codecs/av1/libaom_av1_encoder.cc" < "$COMMAND_DIR/patches/libaom_av1_encoder.patch" + + pushd src # Fix AdaptedVideoTrackSource::video_adapter() patch -p1 < "$COMMAND_DIR/patches/fix_adaptedvideotracksource.patch" diff --git a/BuildScripts~/patches/libaom_av1_encoder.patch b/BuildScripts~/patches/libaom_av1_encoder.patch new file mode 100644 index 0000000000..15f8c29444 --- /dev/null +++ b/BuildScripts~/patches/libaom_av1_encoder.patch @@ -0,0 +1,15 @@ +diff --git a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc +index 28a8e5f846..817826d248 100644 +--- a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc ++++ b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc +@@ -603,7 +603,9 @@ int32_t LibaomAv1Encoder::Encode( + // Set frame_for_encode_ data pointers and strides. + MaybeRewrapImgWithFormat(AOM_IMG_FMT_I420); + auto i420_buffer = mapped_buffer->GetI420(); +- RTC_DCHECK(i420_buffer); ++ if (!i420_buffer) { ++ return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE; ++ } + frame_for_encode_->planes[AOM_PLANE_Y] = + const_cast(i420_buffer->DataY()); + frame_for_encode_->planes[AOM_PLANE_U] = diff --git a/BuildScripts~/patches/libvpx_vp9_encoder.patch b/BuildScripts~/patches/libvpx_vp9_encoder.patch new file mode 100644 index 0000000000..bb6a5d0ebf --- /dev/null +++ b/BuildScripts~/patches/libvpx_vp9_encoder.patch @@ -0,0 +1,15 @@ +diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc +index e460625aea..4194e550df 100644 +--- a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc ++++ b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc +@@ -2090,7 +2090,9 @@ rtc::scoped_refptr LibvpxVp9Encoder::PrepareBufferForProfile0( + case VideoFrameBuffer::Type::kI420A: { + MaybeRewrapRawWithFormat(VPX_IMG_FMT_I420); + const I420BufferInterface* i420_buffer = mapped_buffer->GetI420(); +- RTC_DCHECK(i420_buffer); ++ if(!i420_buffer) { ++ return {}; ++ } + raw_->planes[VPX_PLANE_Y] = const_cast(i420_buffer->DataY()); + raw_->planes[VPX_PLANE_U] = const_cast(i420_buffer->DataU()); + raw_->planes[VPX_PLANE_V] = const_cast(i420_buffer->DataV()); From f6c7cc2a464a10b8f62b060b7aa2ddcddc0dc2c6 Mon Sep 17 00:00:00 2001 From: Kazuki Matsumoto Date: Tue, 19 Aug 2025 11:25:09 +0900 Subject: [PATCH 2/6] fix --- Plugin~/WebRTCPlugin/GpuMemoryBuffer.cpp | 2 ++ .../GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/Plugin~/WebRTCPlugin/GpuMemoryBuffer.cpp b/Plugin~/WebRTCPlugin/GpuMemoryBuffer.cpp index 05496264b7..514e462efe 100644 --- a/Plugin~/WebRTCPlugin/GpuMemoryBuffer.cpp +++ b/Plugin~/WebRTCPlugin/GpuMemoryBuffer.cpp @@ -65,8 +65,10 @@ namespace webrtc { // One texture cannot map CUDA memory and CPU memory simultaneously. // Believe there is still room for improvement. +#if CUDA_PLATFORM if (!device_->CopyResourceFromNativeV(texture_.get(), ptr)) return false; +#endif if (!device_->CopyResourceFromNativeV(textureCpuRead_.get(), ptr)) return false; return true; diff --git a/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp b/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp index db8dc79c6b..b2ec943833 100644 --- a/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp +++ b/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp @@ -1,5 +1,6 @@ #include "pch.h" +#include #include #include "GraphicsDevice/GraphicsUtility.h" @@ -107,6 +108,7 @@ namespace webrtc kUnityVulkanResourceAccess_PipelineBarrier, unityVulkanImage.get())) { + RTC_LOG(LS_ERROR) << "UnityGraphicsVulkan::AccessTexture failed."; return nullptr; } return unityVulkanImage; @@ -463,6 +465,13 @@ namespace webrtc m_LastStateCond.wait_until(lock, std::chrono::system_clock::now() + m_syncTimeout, [vulkanTexture, this] { return vulkanTexture->currentFrameNumber <= m_LastState.safeFrameNumber; }); + if (!ret) + { + RTC_LOG(LS_ERROR) << "WaitSync timeout. " + << "texture: " << texture + << "currentFrameNumber: " << vulkanTexture->currentFrameNumber + << ", safeFrameNumber: " << m_LastState.safeFrameNumber; + } return ret; } From 9907b8a72252b4306339163a5130ba8733967a57 Mon Sep 17 00:00:00 2001 From: Kazuki Matsumoto Date: Tue, 19 Aug 2025 13:00:47 +0900 Subject: [PATCH 3/6] Add Vulkan validation layer when debug build. --- BuildScripts~/build_plugin_android.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/BuildScripts~/build_plugin_android.sh b/BuildScripts~/build_plugin_android.sh index 036918fa52..499b5ed564 100755 --- a/BuildScripts~/build_plugin_android.sh +++ b/BuildScripts~/build_plugin_android.sh @@ -16,6 +16,15 @@ curl -L $LIBWEBRTC_DOWNLOAD_URL > webrtc.zip unzip -d $SOLUTION_DIR/webrtc webrtc.zip cp -f $SOLUTION_DIR/webrtc/lib/libwebrtc.aar $PLUGIN_DIR +# If debug build, download android-binaries that contains Vulkan validation layer +if [ "$BUILD_TYPE" = "debug" ]; then + if [ ! -d "$SOLUTION_DIR/android-binaries" ]; then + wget https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download/vulkan-sdk-1.4.321.0/android-binaries-1.4.321.0.zip + unzip -d "$(pwd)" android-binaries-1.4.321.0.zip + mv "$(pwd)/android-binaries-1.4.321.0" $SOLUTION_DIR/android-binaries + fi +fi + # Build UnityRenderStreaming Plugin cd "$SOLUTION_DIR" for ARCH_ABI in "arm64-v8a" "x86_64" @@ -39,7 +48,12 @@ do mkdir -p jni/$ARCH_ABI mv libwebrtc.so jni/$ARCH_ABI zip -g libwebrtc.aar jni/$ARCH_ABI/libwebrtc.so + # If debug build, add Vulkan validation layer + if [ "$BUILD_TYPE" = "debug" ]; then + mv $SOLUTION_DIR/android-binaries/$ARCH_ABI/libVkLayer_khronos_validation.so jni/$ARCH_ABI + zip -g libwebrtc.aar jni/$ARCH_ABI/libVkLayer_khronos_validation.so + fi rm -r jni popd rm -rf build -done +done \ No newline at end of file From 3b95e5357638021d41d3bdf6f7144d6dbb99cf57 Mon Sep 17 00:00:00 2001 From: Kazuki Matsumoto Date: Tue, 19 Aug 2025 14:28:35 +0900 Subject: [PATCH 4/6] format --- .../GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp b/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp index b2ec943833..34064a29fc 100644 --- a/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp +++ b/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp @@ -461,15 +461,14 @@ namespace webrtc const VulkanTexture2D* vulkanTexture = static_cast(texture); std::unique_lock lock(m_LastStateMtx); - bool ret = - m_LastStateCond.wait_until(lock, std::chrono::system_clock::now() + m_syncTimeout, [vulkanTexture, this] { - return vulkanTexture->currentFrameNumber <= m_LastState.safeFrameNumber; - }); + bool ret = m_LastStateCond.wait_until( + lock, + std::chrono::system_clock::now() + m_syncTimeout, + [vulkanTexture, this] { return vulkanTexture->currentFrameNumber <= m_LastState.safeFrameNumber; }); if (!ret) { RTC_LOG(LS_ERROR) << "WaitSync timeout. " - << "texture: " << texture - << "currentFrameNumber: " << vulkanTexture->currentFrameNumber + << "texture: " << texture << "currentFrameNumber: " << vulkanTexture->currentFrameNumber << ", safeFrameNumber: " << m_LastState.safeFrameNumber; } return ret; From bc977792ee714781d6f16f927e0c7e8289d45f09 Mon Sep 17 00:00:00 2001 From: Kazuki Matsumoto Date: Wed, 20 Aug 2025 15:53:06 +0900 Subject: [PATCH 5/6] Update libwebrtc build scripts --- BuildScripts~/build_libwebrtc_ios.sh | 4 ++++ BuildScripts~/build_libwebrtc_linux.sh | 4 ++++ BuildScripts~/build_libwebrtc_macos.sh | 4 ++++ BuildScripts~/build_libwebrtc_win.cmd | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/BuildScripts~/build_libwebrtc_ios.sh b/BuildScripts~/build_libwebrtc_ios.sh index 84ef9c0703..dbaeba3d1c 100755 --- a/BuildScripts~/build_libwebrtc_ios.sh +++ b/BuildScripts~/build_libwebrtc_ios.sh @@ -36,6 +36,10 @@ patch -N "src/sdk/BUILD.gn" < "$COMMAND_DIR/patches/add_objc_deps.patch" # Fix SetRawImagePlanes() in LibvpxVp8Encoder patch -N "src/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp8_encoder.patch" +patch -N "src/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp9_encoder.patch" + +patch -N "src/modules/video_coding/codecs/av1/libaom_av1_encoder.cc" < "$COMMAND_DIR/patches/libaom_av1_encoder.patch" + # use included python export PATH="$(pwd)/depot_tools/bootstrap-3.8.0.chromium.8_bin/python/bin:$PATH" diff --git a/BuildScripts~/build_libwebrtc_linux.sh b/BuildScripts~/build_libwebrtc_linux.sh index 2239939744..60b9461a17 100755 --- a/BuildScripts~/build_libwebrtc_linux.sh +++ b/BuildScripts~/build_libwebrtc_linux.sh @@ -29,6 +29,10 @@ patch -N "src/BUILD.gn" < "$COMMAND_DIR/patches/add_jsoncpp.patch" # Fix SetRawImagePlanes() in LibvpxVp8Encoder patch -N "src/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp8_encoder.patch" +patch -N "src/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp9_encoder.patch" + +patch -N "src/modules/video_coding/codecs/av1/libaom_av1_encoder.cc" < "$COMMAND_DIR/patches/libaom_av1_encoder.patch" + mkdir -p "$ARTIFACTS_DIR/lib" for target_cpu in "x64" diff --git a/BuildScripts~/build_libwebrtc_macos.sh b/BuildScripts~/build_libwebrtc_macos.sh index 25bd429390..2f781af3a2 100755 --- a/BuildScripts~/build_libwebrtc_macos.sh +++ b/BuildScripts~/build_libwebrtc_macos.sh @@ -36,6 +36,10 @@ patch -N "src/sdk/BUILD.gn" < "$COMMAND_DIR/patches/add_objc_deps.patch" # Fix SetRawImagePlanes() in LibvpxVp8Encoder patch -N "src/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp8_encoder.patch" +patch -N "src/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc" < "$COMMAND_DIR/patches/libvpx_vp9_encoder.patch" + +patch -N "src/modules/video_coding/codecs/av1/libaom_av1_encoder.cc" < "$COMMAND_DIR/patches/libaom_av1_encoder.patch" + mkdir -p "$ARTIFACTS_DIR/lib" for is_debug in "true" "false" diff --git a/BuildScripts~/build_libwebrtc_win.cmd b/BuildScripts~/build_libwebrtc_win.cmd index 34dd7b7b78..c84ddde521 100644 --- a/BuildScripts~/build_libwebrtc_win.cmd +++ b/BuildScripts~/build_libwebrtc_win.cmd @@ -39,6 +39,10 @@ patch -N "src\api\task_queue\task_queue_base.h" < "%COMMAND_DIR%\patches\fix_tas rem fix SetRawImagePlanes() in LibvpxVp8Encoder patch -N "src\modules\video_coding\codecs\vp8\libvpx_vp8_encoder.cc" < "%COMMAND_DIR%\patches\libvpx_vp8_encoder.patch" +patch -N "src\modules\video_coding\codecs\vp9\libvpx_vp9_encoder.cc" < "%COMMAND_DIR%\patches\libvpx_vp9_encoder.patch" + +patch -N "src\modules\video_coding\codecs\av1\libaom_av1_encoder.cc" < "%COMMAND_DIR%\patches\libaom_av1_encoder.patch" + mkdir "%ARTIFACTS_DIR%\lib" setlocal enabledelayedexpansion From 68bedc5cc4328b83031abbcf2f0e580f9987d03a Mon Sep 17 00:00:00 2001 From: Kazuki Matsumoto Date: Wed, 20 Aug 2025 16:03:53 +0900 Subject: [PATCH 6/6] format --- .../GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp b/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp index 34064a29fc..8333071110 100644 --- a/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp +++ b/Plugin~/WebRTCPlugin/GraphicsDevice/Vulkan/VulkanGraphicsDevice.cpp @@ -461,10 +461,10 @@ namespace webrtc const VulkanTexture2D* vulkanTexture = static_cast(texture); std::unique_lock lock(m_LastStateMtx); - bool ret = m_LastStateCond.wait_until( - lock, - std::chrono::system_clock::now() + m_syncTimeout, - [vulkanTexture, this] { return vulkanTexture->currentFrameNumber <= m_LastState.safeFrameNumber; }); + bool ret = + m_LastStateCond.wait_until(lock, std::chrono::system_clock::now() + m_syncTimeout, [vulkanTexture, this] { + return vulkanTexture->currentFrameNumber <= m_LastState.safeFrameNumber; + }); if (!ret) { RTC_LOG(LS_ERROR) << "WaitSync timeout. "