diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index 31f1decf..79572d64 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -47,10 +47,18 @@ runs: server-password: MAVEN_TOKEN - name: Build - run: mvn package -DskipTests + run: | + if [ "${{ inputs.platform-name }}" == "linux_arm" ]; then + mvn package -DskipTests -Plinux-aarch32 + elif [ "${{ inputs.platform-name }}" == "linux_arm64" ]; then + mvn package -DskipTests -Plinux-aarch64 + else + mvn package -DskipTests + fi shell: bash - name: Test + if: ${{ inputs.platform-name != 'linux_arm' && inputs.platform-name != 'linux_arm64' }} run: mvn -B jar:jar surefire:test shell: bash @@ -58,5 +66,12 @@ runs: env: MAVEN_USERNAME: ${{ inputs.maven-username }} MAVEN_TOKEN: ${{ inputs.maven-password }} - run: mvn deploy -DskipTests + run: | + if [ "${{ inputs.platform-name }}" == "linux_arm" ]; then + mvn deploy -DskipTests -Plinux-aarch32 + elif [ "${{ inputs.platform-name }}" == "linux_arm64" ]; then + mvn deploy -DskipTests -Plinux-aarch64 + else + mvn deploy -DskipTests + fi shell: bash diff --git a/.github/actions/prepare-linux/action.yml b/.github/actions/prepare-linux/action.yml index f4faa49a..cda0c25b 100644 --- a/.github/actions/prepare-linux/action.yml +++ b/.github/actions/prepare-linux/action.yml @@ -33,10 +33,12 @@ runs: sudo apt-get update sudo apt-get install -y pulseaudio libpulse-dev libasound2-dev libdbus-1-dev libudev-dev libv4l-dev libx11-dev libxcomposite-dev libxrandr-dev libxfixes-dev binutils cmake git locales lsb-release ninja-build pkg-config python3 python3-setuptools rsync unzip wget xz-utils - # More recent LLVM and Clang. - wget https://apt.llvm.org/llvm.sh - chmod +x llvm.sh - sudo ./llvm.sh ${{ matrix.llvm }} all + # Chromium Clang to be used with the clang toolchain file + #curl -s https://raw.githubusercontent.com/chromium/chromium/main/tools/clang/scripts/update.py | python3 - --output-dir=/opt/clang + # Use a more stable version of Clang + sudo mkdir -p /opt/clang + wget https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-20-init-9764-gb81d8e90-72.tar.xz + sudo tar -xvf clang-llvmorg-20-init-9764-gb81d8e90-72.tar.xz -C /opt/clang # Required for testing #pulseaudio --start @@ -44,3 +46,61 @@ runs: systemctl --user daemon-reload systemctl --user --now enable pipewire{,-pulse}.{socket,service} shell: bash + + - name: Install required packages for arm + if: matrix.platform.name == 'linux_arm' + run: | + sudo apt install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf + + sudo dpkg --add-architecture armhf + + sudo rm /etc/apt/sources.list + + sudo tee -a /etc/apt/sources.list > /dev/null < /dev/null < Linux ✔ - - - - + ✔ armeabi-v7a + ✔ arm64-v8a macOS diff --git a/webrtc-jni/pom.xml b/webrtc-jni/pom.xml index ea99ed9e..dfc5ad4f 100644 --- a/webrtc-jni/pom.xml +++ b/webrtc-jni/pom.xml @@ -154,6 +154,7 @@ -T ClangCL + toolchain/x86_64-windows-clang.cmake @@ -165,7 +166,7 @@ - toolchain/x86_64-linux-gnu.cmake + toolchain/x86_64-linux-clang.cmake @@ -177,7 +178,7 @@ - toolchain/aarch32-linux-gnu.cmake + toolchain/aarch32-linux-clang.cmake @@ -189,7 +190,7 @@ - toolchain/aarch64-linux-gnu.cmake + toolchain/aarch64-linux-clang.cmake diff --git a/webrtc-jni/src/main/cpp/CMakeLists.txt b/webrtc-jni/src/main/cpp/CMakeLists.txt index 7b2d0a7b..2b2e439d 100644 --- a/webrtc-jni/src/main/cpp/CMakeLists.txt +++ b/webrtc-jni/src/main/cpp/CMakeLists.txt @@ -81,12 +81,18 @@ if(APPLE) set_source_files_properties(${SOURCES} PROPERTIES COMPILE_FLAGS "-x objective-c++") target_link_libraries(${PROJECT_NAME} "-framework Foundation" "-framework AVFoundation" "-framework CoreMedia" "-framework CoreAudio" "-framework IOKit") elseif(LINUX) - target_link_libraries(${PROJECT_NAME} -static-libgcc -static-libstdc++ pulse udev) + if(NOT TARGET_CPU MATCHES "^arm") + set(CXX_LIBS "-static-libgcc -stdlib=libc++ -lc++ -lc++abi") + else() + set(CXX_LIBS "-static-libgcc") + endif() + + target_link_libraries(${PROJECT_NAME} ${CXX_LIBS} pulse udev) elseif(WIN32) - target_link_libraries(${PROJECT_NAME} dwmapi.lib mf.lib mfreadwrite.lib mfplat.lib mfuuid.lib shcore.lib) + target_link_libraries(${PROJECT_NAME} c++.lib msvcprt.lib dwmapi.lib mf.lib mfreadwrite.lib mfplat.lib mfuuid.lib shcore.lib) endif() install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} COMPONENT Runtime LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX} COMPONENT Runtime -) \ No newline at end of file +) diff --git a/webrtc-jni/src/main/cpp/dependencies/jni-voithos/CMakeLists.txt b/webrtc-jni/src/main/cpp/dependencies/jni-voithos/CMakeLists.txt index 4144b5ee..19f10cc6 100644 --- a/webrtc-jni/src/main/cpp/dependencies/jni-voithos/CMakeLists.txt +++ b/webrtc-jni/src/main/cpp/dependencies/jni-voithos/CMakeLists.txt @@ -79,3 +79,7 @@ target_include_directories(${PROJECT_NAME} include/jni include/jni/${JNI_PLATFORM} ) + +if(LINUX OR WIN32) + target_link_libraries(${PROJECT_NAME} PRIVATE webrtc) +endif() \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/dependencies/jni-voithos/src/JavaUtils.cpp b/webrtc-jni/src/main/cpp/dependencies/jni-voithos/src/JavaUtils.cpp index 860e6f10..e3b3a940 100644 --- a/webrtc-jni/src/main/cpp/dependencies/jni-voithos/src/JavaUtils.cpp +++ b/webrtc-jni/src/main/cpp/dependencies/jni-voithos/src/JavaUtils.cpp @@ -16,6 +16,7 @@ #include "JavaThreadEnv.h" #include "JavaWrappedException.h" +#include #include bool ExceptionCheck(JNIEnv * env) diff --git a/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt b/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt index 06d95c01..221811e7 100644 --- a/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt +++ b/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt @@ -13,6 +13,12 @@ FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/pseudo.cxx add_library(${PROJECT_NAME} STATIC pseudo.cxx pseudo.hxx) +set(CUSTOM_LIBCXX false) + +if((LINUX AND NOT TARGET_CPU MATCHES "^arm") OR WIN32) + set(CUSTOM_LIBCXX true) +endif() + if(NOT DEFINED TARGET_CPU) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(TARGET_CPU "x86") @@ -20,7 +26,7 @@ if(NOT DEFINED TARGET_CPU) set(TARGET_CPU "x64") endif() - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm.*$") set(TARGET_CPU "${CMAKE_SYSTEM_PROCESSOR}") endif() endif() @@ -82,15 +88,20 @@ endfunction() function(sysroot_install) message(STATUS "Installing sysroot") - set(SCRIPT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/linux/sysroot/install-sysroot.py) + if(EXISTS "${WEBRTC_INSTALL_DIR}/lib/${WEBRTC_LIB}") + set(SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/linux/sysroot") + else() + set(SCRIPT_PATH "${WEBRTC_SRC_DIR}/src/build/linux/sysroot_scripts") + endif() execute_process( - COMMAND ${Python3_EXECUTABLE} ${SCRIPT_PATH} --arch=${TARGET_CPU} - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + COMMAND ${Python3_EXECUTABLE} install-sysroot.py --arch=${TARGET_CPU} + WORKING_DIRECTORY "${SCRIPT_PATH}" OUTPUT_VARIABLE COMMAND_OUTPUT ERROR_VARIABLE COMMAND_ERROR ) + print("Sysroot script path: ${SCRIPT_PATH}") print("${COMMAND_OUTPUT}") print("${COMMAND_ERROR}") endfunction() @@ -98,10 +109,24 @@ endfunction() function(sysroot_link) message(STATUS "Retrieving libm.so from sysroot") - set(SYSROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/linux) + set(SYSROOT_ARCH "amd64") + + if(${TARGET_CPU} STREQUAL "x64") + set(SYSROOT_ARCH "amd64") + elseif(${TARGET_CPU} STREQUAL "arm") + set(SYSROOT_ARCH "armhf") + elseif(${TARGET_CPU} STREQUAL "arm64") + set(SYSROOT_ARCH "arm64") + endif() + + if(EXISTS "${WEBRTC_INSTALL_DIR}/lib/${WEBRTC_LIB}") + set(SYSROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}") + else() + set(SYSROOT_PATH "${WEBRTC_SRC_DIR}/src/build") + endif() execute_process( - COMMAND find ${SYSROOT_PATH} -iname libm-*.so + COMMAND find "${SYSROOT_PATH}/linux/debian_bullseye_${SYSROOT_ARCH}-sysroot" -iname libm-*.so WORKING_DIRECTORY "${WEBRTC_SRC_DIR}" OUTPUT_VARIABLE COMMAND_OUTPUT ERROR_VARIABLE COMMAND_ERROR @@ -122,8 +147,6 @@ set(WEBRTC_BUILD out/${TARGET_CPU}) set(WEBRTC_LIB_PATH ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/${WEBRTC_LIB}) set(WEBRTC_LIB_PATH_INSTALLED ${WEBRTC_INSTALL_DIR}/lib/${WEBRTC_LIB}) -set(WEBRTC_CLANG "true") - file(TO_CMAKE_PATH "${WEBRTC_DIR}" WEBRTC_DIR) file(TO_CMAKE_PATH "${WEBRTC_INSTALL_DIR}" WEBRTC_INSTALL_DIR) file(TO_CMAKE_PATH "${WEBRTC_LIB_PATH}" WEBRTC_LIB_PATH) @@ -133,14 +156,31 @@ message(STATUS "WebRTC checkout path: ${WEBRTC_DIR}") message(STATUS "WebRTC checkout branch: ${WEBRTC_BRANCH}") message(STATUS "WebRTC target: ${SOURCE_TARGET} ${TARGET_CPU}") message(STATUS "WebRTC build type: ${CMAKE_BUILD_TYPE}") +message(STATUS "WebRTC use custom libcxx: ${CUSTOM_LIBCXX}") message(STATUS "WebRTC install path: ${WEBRTC_INSTALL_DIR}") + if(EXISTS "${WEBRTC_LIB_PATH_INSTALLED}") set(TARGET_INC_DIR ${WEBRTC_INSTALL_DIR}/include) set(TARGET_LINK_LIB ${WEBRTC_LIB_PATH_INSTALLED}) + set(TARGET_LIB_DIR ${WEBRTC_INSTALL_DIR}/lib) + set(TARGET_LIBCPP_BUILDTOOLS_INC_DIR ${TARGET_INC_DIR}/third_party/libc++/) + set(TARGET_LIBCPP_INC_DIR ${TARGET_INC_DIR}/third_party/libc++/include) + set(TARGET_LIBCPP_ABI_INC_DIR ${TARGET_INC_DIR}/third_party/libc++abi/include) else() set(TARGET_INC_DIR ${WEBRTC_SRC}) set(TARGET_LINK_LIB ${WEBRTC_LIB_PATH}) + set(TARGET_LIB_DIR ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj) + set(TARGET_LIBCPP_BUILDTOOLS_INC_DIR ${WEBRTC_SRC}/buildtools/third_party/libc++/) + set(TARGET_LIBCPP_INC_DIR ${WEBRTC_SRC}/third_party/libc++/src/include) + set(TARGET_LIBCPP_ABI_INC_DIR ${WEBRTC_SRC}/third_party/libc++abi/src/include) +endif() + +if((LINUX AND NOT TARGET_CPU MATCHES "^arm") OR WIN32) + target_include_directories(${PROJECT_NAME} PUBLIC ${TARGET_LIBCPP_BUILDTOOLS_INC_DIR}) + target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${TARGET_LIBCPP_INC_DIR} ${TARGET_LIBCPP_ABI_INC_DIR}) + + target_link_directories(${PROJECT_NAME} PUBLIC "${TARGET_LIB_DIR}") endif() target_include_directories(${PROJECT_NAME} @@ -155,9 +195,6 @@ if(APPLE) target_compile_definitions(${PROJECT_NAME} PUBLIC WEBRTC_MAC WEBRTC_POSIX) target_link_libraries(${PROJECT_NAME} "-framework Foundation" "-framework AVFoundation" "-framework CoreGraphics" "-framework CoreAudio" "-framework CoreVideo" "-framework ScreenCaptureKit" "-framework AudioToolbox" "-framework IOSurface" "-framework ApplicationServices" "-framework AppKit") elseif(LINUX) - # Due to branch 6998 (m134) build with gcc. Linking webrtc built with clang causes errors. - set(WEBRTC_CLANG "false") - # Find DBus find_package(PkgConfig QUIET REQUIRED) # Include functions provided by PkgConfig module. pkg_check_modules(DBUS REQUIRED dbus-1) @@ -242,7 +279,30 @@ if (PATCHES) endif() message(STATUS "WebRTC: generate") -set(COMPILE_ARGS "target_cpu=\"${TARGET_CPU}\" is_clang=${WEBRTC_CLANG} is_debug=false is_component_build=false treat_warnings_as_errors=false rtc_build_tools=false rtc_use_perfetto=false rtc_use_pipewire=false rtc_enable_protobuf=false rtc_build_examples=false rtc_include_tests=false use_rtti=true rtc_use_h264=true use_custom_libcxx=false symbol_level=0") +set(COMPILE_ARGS "target_cpu=\"${TARGET_CPU}\" \ +use_custom_libcxx=${CUSTOM_LIBCXX} \ +is_clang=true \ +is_debug=false \ +is_component_build=false \ +treat_warnings_as_errors=false \ +rtc_build_tools=false \ +rtc_use_perfetto=false \ +rtc_use_pipewire=false \ +rtc_enable_protobuf=false \ +rtc_build_examples=false \ +rtc_include_tests=false \ +use_rtti=true \ +rtc_use_h264=true \ +symbol_level=0") + +if(LINUX) + if(${TARGET_CPU} STREQUAL "arm") + set(COMPILE_ARGS "${COMPILE_ARGS} custom_toolchain=\"//build/toolchain/linux:clang_arm\"") + elseif(${TARGET_CPU} STREQUAL "arm64") + set(COMPILE_ARGS "${COMPILE_ARGS} custom_toolchain=\"//build/toolchain/linux:clang_arm64\"") + endif() +endif() + execute_command( COMMAND gn gen ${WEBRTC_BUILD} --args=${COMPILE_ARGS} WORKING_DIRECTORY "${WEBRTC_SRC}" @@ -256,6 +316,70 @@ execute_command( if(LINUX) sysroot_link() + + if(LINUX AND NOT TARGET_CPU MATCHES "^arm") + # Collect lib++ objects + file(GLOB_RECURSE LibCPP_OBJS + ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/buildtools/third_party/libc++/libc++/*.o + ) + # Collect lib++abi objects + file(GLOB_RECURSE LibCPP_ABI_OBJS + ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/buildtools/third_party/libc++abi/libc++abi/*.o + ) + # Create static libraries + execute_command( + COMMAND ${CMAKE_AR} rcs ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/libc++.a ${LibCPP_OBJS} + ) + execute_command( + COMMAND ${CMAKE_AR} rcs ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/libc++abi.a ${LibCPP_ABI_OBJS} + ) + # Install libc++ and libc++abi headers and libraries + install( + FILES + "${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/libc++.a" + "${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/libc++abi.a" + DESTINATION + "${WEBRTC_INSTALL_DIR}/lib" + ) + install( + DIRECTORY "${WEBRTC_SRC}/third_party/libc++/src/include" + DESTINATION "${WEBRTC_INSTALL_DIR}/include/third_party/libc++" + ) + install( + DIRECTORY "${WEBRTC_SRC}/buildtools/third_party/libc++/" + DESTINATION "${WEBRTC_INSTALL_DIR}/include/third_party/libc++" + ) + install( + DIRECTORY "${WEBRTC_SRC}/third_party/libc++abi/src/include" + DESTINATION "${WEBRTC_INSTALL_DIR}/include/third_party/libc++abi" + ) + endif() +elseif(WIN32) + # Collect lib++ objects + file(GLOB_RECURSE LibCPP_OBJS + ${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/buildtools/third_party/libc++/libc++/*.obj + ) + + # Create static libraries + execute_command( + COMMAND ${CMAKE_LINKER} /LIB /OUT:${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/c++.lib ${LibCPP_OBJS} + ) + + # Install libc++ headers and libraries + install( + FILES + "${WEBRTC_SRC}/${WEBRTC_BUILD}/obj/c++.lib" + DESTINATION + "${WEBRTC_INSTALL_DIR}/lib" + ) + install( + DIRECTORY "${WEBRTC_SRC}/third_party/libc++/src/include" + DESTINATION "${WEBRTC_INSTALL_DIR}/include/third_party/libc++" + ) + install( + DIRECTORY "${WEBRTC_SRC}/buildtools/third_party/libc++/" + DESTINATION "${WEBRTC_INSTALL_DIR}/include/third_party/libc++" + ) endif() install(FILES "${WEBRTC_LIB_PATH}" DESTINATION "${WEBRTC_INSTALL_DIR}/lib") diff --git a/webrtc-jni/src/main/cpp/include/media/video/VideoTrackDesktopSource.h b/webrtc-jni/src/main/cpp/include/media/video/VideoTrackDesktopSource.h index 4e5189b6..84fe7950 100644 --- a/webrtc-jni/src/main/cpp/include/media/video/VideoTrackDesktopSource.h +++ b/webrtc-jni/src/main/cpp/include/media/video/VideoTrackDesktopSource.h @@ -26,49 +26,49 @@ namespace jni { class VideoTrackDesktopSource : public rtc::AdaptedVideoTrackSource, public webrtc::DesktopCapturer::Callback { - public: - VideoTrackDesktopSource(); - ~VideoTrackDesktopSource(); + public: + VideoTrackDesktopSource(); + ~VideoTrackDesktopSource(); - void setSourceId(webrtc::DesktopCapturer::SourceId source, bool isWindow); - void setFrameRate(const uint16_t frameRate); - void setMaxFrameSize(webrtc::DesktopSize size); - void setFocusSelectedSource(bool focus); + void setSourceId(webrtc::DesktopCapturer::SourceId source, bool isWindow); + void setFrameRate(const uint16_t frameRate); + void setMaxFrameSize(webrtc::DesktopSize size); + void setFocusSelectedSource(bool focus); - void start(); - void stop(); - void terminate(); + void start(); + void stop(); + void terminate(); - // AdaptedVideoTrackSource implementation. - virtual bool is_screencast() const override; - virtual std::optional needs_denoising() const override; - SourceState state() const override; - bool remote() const override; + // AdaptedVideoTrackSource implementation. + virtual bool is_screencast() const override; + virtual std::optional needs_denoising() const override; + SourceState state() const override; + bool remote() const override; - // DesktopCapturer::Callback implementation. - void OnCaptureResult(webrtc::DesktopCapturer::Result result, std::unique_ptr frame) override; + // DesktopCapturer::Callback implementation. + void OnCaptureResult(webrtc::DesktopCapturer::Result result, std::unique_ptr frame) override; - private: - void capture(); - void process(std::unique_ptr& frame); + private: + void capture(); + void process(std::unique_ptr& frame); - private: - uint16_t frameRate; - bool isCapturing; - bool focusSelectedSource; + private: + uint16_t frameRate; + bool isCapturing; + bool focusSelectedSource; - webrtc::DesktopSize maxFrameSize; + webrtc::DesktopSize maxFrameSize; - webrtc::MediaSourceInterface::SourceState sourceState; + webrtc::MediaSourceInterface::SourceState sourceState; - webrtc::DesktopCapturer::SourceId sourceId; - bool sourceIsWindow; + webrtc::DesktopCapturer::SourceId sourceId; + bool sourceIsWindow; - std::unique_ptr lastFrame; + std::unique_ptr lastFrame; - std::unique_ptr captureThread; + std::unique_ptr captureThread; - rtc::scoped_refptr buffer; + rtc::scoped_refptr buffer; }; } diff --git a/webrtc-jni/src/main/cpp/include/media/video/desktop/DesktopCapturer.h b/webrtc-jni/src/main/cpp/include/media/video/desktop/DesktopCapturer.h index 5f5dc000..06a4c2af 100644 --- a/webrtc-jni/src/main/cpp/include/media/video/desktop/DesktopCapturer.h +++ b/webrtc-jni/src/main/cpp/include/media/video/desktop/DesktopCapturer.h @@ -14,15 +14,14 @@ * limitations under the License. */ -#ifndef JNI_WEBRTC_MEDIA_VIDEO_DESKTOP_CAPTURER_H_ -#define JNI_WEBRTC_MEDIA_VIDEO_DESKTOP_CAPTURER_H_ +#ifndef JNI_WEBRTC_MEDIA_DESKTOP_CAPTURER_H_ +#define JNI_WEBRTC_MEDIA_DESKTOP_CAPTURER_H_ #if defined(WEBRTC_WIN) #include "platform/windows/ComInitializer.h" #endif #include "modules/desktop_capture/desktop_capturer.h" -#include "modules/desktop_capture/desktop_and_cursor_composer.h" #include #include @@ -32,16 +31,13 @@ namespace jni class DesktopCapturer { public: - DesktopCapturer(webrtc::DesktopCapturer * capturer); + explicit DesktopCapturer(bool screenCapturer); ~DesktopCapturer(); - DesktopCapturer(const DesktopCapturer &) = delete; - DesktopCapturer & operator=(const DesktopCapturer &) = delete; - // webrtc::DesktopCapturer implementations. void Start(webrtc::DesktopCapturer::Callback * callback); - void SetSharedMemoryFactory(std::unique_ptr factory); void SetMaxFrameRate(uint32_t max_frame_rate); + void SetSharedMemoryFactory(std::unique_ptr factory); void CaptureFrame(); void SetExcludedWindow(webrtc::WindowId window); bool GetSourceList(webrtc::DesktopCapturer::SourceList * sources); diff --git a/webrtc-jni/src/main/cpp/src/JNI_RefCountedObject.cpp b/webrtc-jni/src/main/cpp/src/JNI_RefCountedObject.cpp index 3623032c..74791248 100644 --- a/webrtc-jni/src/main/cpp/src/JNI_RefCountedObject.cpp +++ b/webrtc-jni/src/main/cpp/src/JNI_RefCountedObject.cpp @@ -34,7 +34,7 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_internal_RefCountedObject_release webrtc::RefCountInterface * ref = GetHandle(env, caller); CHECK_HANDLE(ref); - const webrtc::RefCountReleaseStatus status = ref->Release(); + const auto status = ref->Release(); if (status == webrtc::RefCountReleaseStatus::kDroppedLastRef) { SetHandle(env, caller, nullptr); diff --git a/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp b/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp index 185cfc10..957292e8 100644 --- a/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp +++ b/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp @@ -18,24 +18,8 @@ #include "JavaUtils.h" #include "media/video/desktop/DesktopCapturer.h" -#include "modules/desktop_capture/desktop_capturer.h" -#include "modules/desktop_capture/desktop_capture_options.h" -#include "modules/desktop_capture/desktop_and_cursor_composer.h" - JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_ScreenCapturer_initialize (JNIEnv * env, jobject caller) { - auto options = webrtc::DesktopCaptureOptions::CreateDefault(); - // Enable desktop effects. - options.set_disable_effects(false); - -#if defined(WEBRTC_WIN) - options.set_allow_directx_capturer(true); -#endif - - auto capturer = new webrtc::DesktopAndCursorComposer( - webrtc::DesktopCapturer::CreateScreenCapturer(options), - options); - - SetHandle(env, caller, new jni::DesktopCapturer(capturer)); + SetHandle(env, caller, new jni::DesktopCapturer(true)); } \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp b/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp index b5be4004..c08107b0 100644 --- a/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp +++ b/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp @@ -18,24 +18,8 @@ #include "JavaUtils.h" #include "media/video/desktop/DesktopCapturer.h" -#include "modules/desktop_capture/desktop_capturer.h" -#include "modules/desktop_capture/desktop_capture_options.h" -#include "modules/desktop_capture/desktop_and_cursor_composer.h" - JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_WindowCapturer_initialize (JNIEnv * env, jobject caller) { - auto options = webrtc::DesktopCaptureOptions::CreateDefault(); - // Enable desktop effects. - options.set_disable_effects(false); - -#if defined(WEBRTC_WIN) - options.set_allow_directx_capturer(true); -#endif - - auto capturer = new webrtc::DesktopAndCursorComposer( - webrtc::DesktopCapturer::CreateWindowCapturer(options), - options); - - SetHandle(env, caller, new jni::DesktopCapturer(capturer)); + SetHandle(env, caller, new jni::DesktopCapturer(false)); } \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/src/api/VideoFrame.cpp b/webrtc-jni/src/main/cpp/src/api/VideoFrame.cpp index 457fd4a8..cd826102 100644 --- a/webrtc-jni/src/main/cpp/src/api/VideoFrame.cpp +++ b/webrtc-jni/src/main/cpp/src/api/VideoFrame.cpp @@ -27,7 +27,7 @@ namespace jni { webrtc::VideoFrame toNative(JNIEnv * env, const JavaRef & javaFrame) { - const std::shared_ptr javaClass = JavaClasses::get(env); + const auto javaClass = JavaClasses::get(env); JavaObject obj(env, javaFrame); int rotation = obj.getInt(javaClass->rotation); diff --git a/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp b/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp index 57158a96..68a07bea 100644 --- a/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp +++ b/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp @@ -22,10 +22,25 @@ namespace jni { - DesktopCapturer::DesktopCapturer(webrtc::DesktopCapturer * capturer) : + DesktopCapturer::DesktopCapturer(bool screenCapturer) : focusSelectedSource(false) { - this->capturer.reset(capturer); + auto options = webrtc::DesktopCaptureOptions::CreateDefault(); + // Enable desktop effects. + options.set_disable_effects(false); + +#if defined(WEBRTC_WIN) + options.set_allow_directx_capturer(true); +#endif + + if (screenCapturer) { + capturer = std::make_unique( + webrtc::DesktopCapturer::CreateScreenCapturer(options), options); + } + else { + capturer = std::make_unique( + webrtc::DesktopCapturer::CreateWindowCapturer(options), options); + } } DesktopCapturer::~DesktopCapturer() @@ -42,14 +57,14 @@ namespace jni } } - void DesktopCapturer::SetSharedMemoryFactory(std::unique_ptr factory) + void DesktopCapturer::SetMaxFrameRate(uint32_t max_frame_rate) { - capturer->SetSharedMemoryFactory(std::move(factory)); + capturer->SetMaxFrameRate(max_frame_rate); } - void DesktopCapturer::SetMaxFrameRate(uint32_t max_frame_rate) + void DesktopCapturer::SetSharedMemoryFactory(std::unique_ptr factory) { - capturer->SetMaxFrameRate(max_frame_rate); + capturer->SetSharedMemoryFactory(std::move(factory)); } void DesktopCapturer::CaptureFrame() diff --git a/webrtc-jni/src/main/cpp/toolchain/aarch32-linux-clang.cmake b/webrtc-jni/src/main/cpp/toolchain/aarch32-linux-clang.cmake new file mode 100644 index 00000000..0210b7ed --- /dev/null +++ b/webrtc-jni/src/main/cpp/toolchain/aarch32-linux-clang.cmake @@ -0,0 +1,17 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_C_COMPILER /opt/clang/bin/clang) +set(CMAKE_CXX_COMPILER /opt/clang/bin/clang++) +set(CMAKE_AR /opt/clang/bin/llvm-ar) + +set(TARGET_TRIPLE arm-linux-gnueabihf) + +set(CMAKE_C_FLAGS "--target=${TARGET_TRIPLE} -march=armv7-a -mfloat-abi=hard -mfpu=neon") +set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -v -Wl,--verbose") + +foreach(LINKER SHARED_LINKER) + set(CMAKE_${LINKER}_FLAGS "-fuse-ld=lld -Wl,-s -v -Wl,--verbose") +endforeach() + +set(TARGET_CPU "arm") \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-clang.cmake b/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-clang.cmake new file mode 100644 index 00000000..beeb17f4 --- /dev/null +++ b/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-clang.cmake @@ -0,0 +1,17 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(CMAKE_C_COMPILER /opt/clang/bin/clang) +set(CMAKE_CXX_COMPILER /opt/clang/bin/clang++) +set(CMAKE_AR /opt/clang/bin/llvm-ar) + +set(TARGET_TRIPLE aarch64-linux-gnu) + +set(CMAKE_C_FLAGS "--target=${TARGET_TRIPLE}") +set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -v -Wl,--verbose") + +foreach(LINKER SHARED_LINKER) + set(CMAKE_${LINKER}_FLAGS "-fuse-ld=lld -Wl,-s -v -Wl,--verbose") +endforeach() + +set(TARGET_CPU "arm64") \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-gnu.cmake b/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-gnu.cmake index 031f6f8c..e6c3dc64 100644 --- a/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-gnu.cmake +++ b/webrtc-jni/src/main/cpp/toolchain/aarch64-linux-gnu.cmake @@ -1,5 +1,5 @@ set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++) diff --git a/webrtc-jni/src/main/cpp/toolchain/x86_64-linux-clang.cmake b/webrtc-jni/src/main/cpp/toolchain/x86_64-linux-clang.cmake index 4874614a..b942380d 100644 --- a/webrtc-jni/src/main/cpp/toolchain/x86_64-linux-clang.cmake +++ b/webrtc-jni/src/main/cpp/toolchain/x86_64-linux-clang.cmake @@ -1,6 +1,14 @@ set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) -set(CMAKE_C_COMPILER /usr/bin/clang-21) -set(CMAKE_CXX_COMPILER /usr/bin/clang++-21) +set(CMAKE_C_COMPILER /opt/clang/bin/clang) +set(CMAKE_CXX_COMPILER /opt/clang/bin/clang++) +set(CMAKE_AR /opt/clang/bin/llvm-ar) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++ -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -v -Wl,--verbose") + +foreach(LINKER SHARED_LINKER) + set(CMAKE_${LINKER}_FLAGS "-fuse-ld=lld -Wl,-s -v -Wl,--verbose") +endforeach() set(TARGET_CPU "x64") diff --git a/webrtc-jni/src/main/cpp/toolchain/x86_64-windows-clang.cmake b/webrtc-jni/src/main/cpp/toolchain/x86_64-windows-clang.cmake new file mode 100644 index 00000000..785d513d --- /dev/null +++ b/webrtc-jni/src/main/cpp/toolchain/x86_64-windows-clang.cmake @@ -0,0 +1 @@ +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MT /EHsc -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -D_LIBCPP_BUILDING_LIBRARY -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE")