From 06342cfd42c6bf3aff93ca3a1ef6ede2cbe7a600 Mon Sep 17 00:00:00 2001 From: ZCube Date: Mon, 6 Jul 2020 21:28:36 +0900 Subject: [PATCH] Add SteamWebRTC CMake based build scripts. - Add CMake based WebRTC build scripts (Minimalized for ICE transport). - Add Abseil-cpp dependency for WebRTC. - Update travis script to testing steamwebrtc build step. - Add option to build steamwebrtc as static library. - Update IceSession for Turn server configuration. - Add ws2_32, crypt32 dependencies for static OpenSSL library link. - Update WebRTC's rtc_base/system/arch.h for ppc64le, s390x build. - Add HAVE_STRCPY_S definition for check strcpy_s --- .travis/build-cmake.sh | 6 + .travis/install-alpine.sh | 2 + .travis/install-archlinux.sh | 1 + .travis/install-fedora.sh | 2 + .travis/install-ubuntu.sh | 2 +- CMakeLists.txt | 8 + src/CMakeLists.txt | 22 + src/external/steamwebrtc/CMakeLists.txt | 850 ++++++++++++++++++ src/external/steamwebrtc/ice_session.cpp | 95 +- src/external/steamwebrtc/ice_session.h | 8 + .../steamwebrtc/steamwebrtc_internal.h | 31 +- .../clientlib/steamnetworkingsockets_p2p.cpp | 39 +- 12 files changed, 1022 insertions(+), 44 deletions(-) create mode 100644 src/external/steamwebrtc/CMakeLists.txt diff --git a/.travis/build-cmake.sh b/.travis/build-cmake.sh index 314e3bc..718aefc 100755 --- a/.travis/build-cmake.sh +++ b/.travis/build-cmake.sh @@ -69,6 +69,12 @@ fi cmake_configure build-cmake ${CMAKE_ARGS[@]} -DCMAKE_BUILD_TYPE=RelWithDebInfo .. cmake_build build-cmake +# Build binaries with webrtc +if [[ $BUILD_WEBRTC -ne 0 ]]; then + cmake_configure build-cmake-webrtc ${CMAKE_ARGS[@]} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_STEAMWEBRTC=ON -DSTEAMWEBRTC_USE_STATIC_LIBS=OFF .. + cmake_build build-cmake-webrtc +fi + # Build binaries with reference ed25519/curve25519 cmake_configure build-cmake-ref ${CMAKE_ARGS[@]} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_CRYPTO25519=Reference .. cmake_build build-cmake-ref diff --git a/.travis/install-alpine.sh b/.travis/install-alpine.sh index 11db041..f1672bb 100755 --- a/.travis/install-alpine.sh +++ b/.travis/install-alpine.sh @@ -16,6 +16,8 @@ PACKAGES=( cmake meson pkgconf + git + linux-headers ) PACKAGES+=(protobuf-dev) diff --git a/.travis/install-archlinux.sh b/.travis/install-archlinux.sh index 84b52bd..f0302d2 100755 --- a/.travis/install-archlinux.sh +++ b/.travis/install-archlinux.sh @@ -11,6 +11,7 @@ PACKAGES=( clang cmake meson + git ) PACKAGES+=(protobuf) diff --git a/.travis/install-fedora.sh b/.travis/install-fedora.sh index 99895e7..aa3749c 100755 --- a/.travis/install-fedora.sh +++ b/.travis/install-fedora.sh @@ -14,6 +14,8 @@ PACKAGES=( cmake meson pkgconf-pkg-config + git + make ) PACKAGES+=(protobuf-compiler protobuf-devel) diff --git a/.travis/install-ubuntu.sh b/.travis/install-ubuntu.sh index 2cc6e79..b5a6731 100755 --- a/.travis/install-ubuntu.sh +++ b/.travis/install-ubuntu.sh @@ -10,7 +10,7 @@ apt-get update apt-get install -y locales locale-gen en_US.UTF-8 -PACKAGES=(build-essential pkg-config ccache cmake meson clang) +PACKAGES=(build-essential pkg-config ccache cmake meson clang git) PACKAGES+=(libprotobuf-dev protobuf-compiler) PACKAGES+=(libssl-dev) diff --git a/CMakeLists.txt b/CMakeLists.txt index 50d2bc7..38e1176 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,8 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") ) endif() +option(USE_STEAMWEBRTC "Build with a Webrtc library" OFF) +option(STEAMWEBRTC_USE_STATIC_LIBS "Build with a Webrtc as static library" OFF) option(Protobuf_USE_STATIC_LIBS "Build with a static Protobuf library" OFF) option(LIGHT_TESTS "Use smaller/shorter tests for simple integration testing (e.g. Travis)" OFF) option(GAMENETWORKINGSOCKETS_BUILD_EXAMPLES "Build the included example chat program" ON) @@ -95,6 +97,9 @@ if (USE_CRYPTO25519 STREQUAL "OpenSSL" OR USE_CRYPTO STREQUAL "OpenSSL") cmake_push_check_state() set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES OpenSSL::Crypto) + if(WIN32 AND OPENSSL_USE_STATIC_LIBS) + list(APPEND CMAKE_REQUIRED_LIBRARIES ws2_32 crypt32) + endif() check_symbol_exists(EVP_MD_CTX_free openssl/evp.h OPENSSL_NEW_ENOUGH) if (NOT OPENSSL_NEW_ENOUGH) message(FATAL_ERROR "Cannot find EVP_MD_CTX_free in OpenSSL headers/libs for the target architecture. Check that you're using OpenSSL 1.1.0 or later.") @@ -102,6 +107,9 @@ if (USE_CRYPTO25519 STREQUAL "OpenSSL" OR USE_CRYPTO STREQUAL "OpenSSL") cmake_pop_check_state() cmake_push_check_state() set(CMAKE_REQUIRED_LIBRARIES OpenSSL::Crypto) + if(WIN32 AND OPENSSL_USE_STATIC_LIBS) + list(APPEND CMAKE_REQUIRED_LIBRARIES ws2_32 crypt32) + endif() if(USE_CRYPTO25519 STREQUAL "OpenSSL") check_symbol_exists(EVP_PKEY_get_raw_public_key openssl/evp.h OPENSSL_HAS_25519_RAW) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 17ff1f0..4142a63 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -86,6 +86,10 @@ if(USE_CRYPTO25519 STREQUAL "Reference") ) endif() +if(USE_STEAMWEBRTC) + add_subdirectory(external/steamwebrtc) +endif(USE_STEAMWEBRTC) + set(C99_FEATURES c_restrict c_function_prototypes) @@ -165,10 +169,22 @@ macro(gamenetworkingsockets_common GNS_TARGET) Threads::Threads ) + if(USE_STEAMWEBRTC AND STEAMWEBRTC_USE_STATIC_LIBS) + target_compile_definitions(${GNS_TARGET} PRIVATE + STEAMWEBRTC_USE_STATIC_LIBS + ) + target_link_libraries(${GNS_TARGET} PUBLIC + steamwebrtc + ) + endif() + if(USE_CRYPTO STREQUAL "OpenSSL" OR USE_CRYPTO25519 STREQUAL "OpenSSL") target_link_libraries(${GNS_TARGET} PUBLIC OpenSSL::Crypto ) + if(WIN32 AND OPENSSL_USE_STATIC_LIBS) + list(APPEND CMAKE_REQUIRED_LIBRARIES ws2_32 crypt32) + endif() endif() if(USE_CRYPTO STREQUAL "libsodium" OR USE_CRYPTO25519 STREQUAL "libsodium") @@ -218,8 +234,14 @@ macro(gamenetworkingsockets_common GNS_TARGET) endif() if(CMAKE_SYSTEM_NAME MATCHES Linux) + if(USE_STEAMWEBRTC AND NOT STEAMWEBRTC_USE_STATIC_LIBS) + target_link_libraries(${GNS_TARGET} PRIVATE dl) + endif() target_compile_definitions(${GNS_TARGET} PUBLIC POSIX LINUX) elseif(CMAKE_SYSTEM_NAME MATCHES Darwin) + if(USE_STEAMWEBRTC AND NOT STEAMWEBRTC_USE_STATIC_LIBS) + target_link_libraries(${GNS_TARGET} PRIVATE dl) + endif() target_compile_definitions(${GNS_TARGET} PUBLIC POSIX OSX) elseif(CMAKE_SYSTEM_NAME MATCHES Windows) target_compile_definitions(${GNS_TARGET} PUBLIC WIN32) diff --git a/src/external/steamwebrtc/CMakeLists.txt b/src/external/steamwebrtc/CMakeLists.txt new file mode 100644 index 0000000..bab8965 --- /dev/null +++ b/src/external/steamwebrtc/CMakeLists.txt @@ -0,0 +1,850 @@ +include(FetchContent) +include(TestBigEndian) +include(CheckSymbolExists) + +find_package(OpenSSL REQUIRED) +find_package(Protobuf REQUIRED) + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +FetchContent_Declare( + abseil + GIT_REPOSITORY https://github.com/abseil/abseil-cpp + GIT_TAG lts_2020_02_25 #refs/remotes/branch-heads/4180 +) + +FetchContent_GetProperties(abseil) +if(NOT abseil_POPULATED) + FetchContent_Populate(abseil) +endif() +add_subdirectory(${abseil_SOURCE_DIR} ${abseil_BINARY_DIR}) + +FetchContent_Declare( + webrtc + GIT_REPOSITORY https://webrtc.googlesource.com/src + GIT_TAG 30a3e787948dd6cdd541773101d664b85eb332a6 #refs/remotes/branch-heads/4180 +) + +FetchContent_GetProperties(webrtc) +if(NOT webrtc_POPULATED) + FetchContent_Populate(webrtc) +endif() + +include (CheckTypeSize) +CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P) +TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + +# endian and cpu detect : for ppc64le and s390x, else +if(IS_BIG_ENDIAN) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + FILE(WRITE ${webrtc_SOURCE_DIR}/rtc_base/system/arch.h + "#pragma once\n#define WEBRTC_ARCH_BIG_ENDIAN\n#define WEBRTC_ARCH_64_BITS\n" + ) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + FILE(WRITE ${webrtc_SOURCE_DIR}/rtc_base/system/arch.h + "#pragma once\n#define WEBRTC_ARCH_BIG_ENDIAN\n#define WEBRTC_ARCH_32_BITS\n" + ) + endif() +else() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + FILE(WRITE ${webrtc_SOURCE_DIR}/rtc_base/system/arch.h + "#pragma once\n#define WEBRTC_ARCH_LITTLE_ENDIAN\n#define WEBRTC_ARCH_64_BITS\n" + ) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + FILE(WRITE ${webrtc_SOURCE_DIR}/rtc_base/system/arch.h + "#pragma once\n#define WEBRTC_ARCH_LITTLE_ENDIAN\n#define WEBRTC_ARCH_32_BITS\n" + ) + endif() +endif() + +if(WIN32) + add_definitions( + -DWEBRTC_WIN + -DNOMINMAX + -DWIN32_LEAN_AND_MEAN + -D_WINSOCKAPI_ + ) +else(WIN32) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined ") + add_definitions( + -DWEBRTC_POSIX + -DWEBRTC_LINUX + ) +endif(WIN32) + +add_library(webrtc-lite STATIC + ${webrtc_SOURCE_DIR}/api/adaptation/resource.cc + ${webrtc_SOURCE_DIR}/api/adaptation/resource.h + ${webrtc_SOURCE_DIR}/api/array_view.h + ${webrtc_SOURCE_DIR}/api/async_resolver_factory.h + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_codec_pair_id.cc + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_codec_pair_id.h + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_decoder_factory.h + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_decoder.cc + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_decoder.h + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_encoder_factory.h + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_encoder.cc + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_encoder.h + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_format.cc + ${webrtc_SOURCE_DIR}/api/audio_codecs/audio_format.h + ${webrtc_SOURCE_DIR}/api/audio_options.cc + ${webrtc_SOURCE_DIR}/api/audio_options.h + ${webrtc_SOURCE_DIR}/api/audio/audio_frame.cc + ${webrtc_SOURCE_DIR}/api/audio/audio_frame.h + ${webrtc_SOURCE_DIR}/api/audio/audio_mixer.h + ${webrtc_SOURCE_DIR}/api/audio/channel_layout.cc + ${webrtc_SOURCE_DIR}/api/audio/channel_layout.h + ${webrtc_SOURCE_DIR}/api/audio/echo_canceller3_config.cc + ${webrtc_SOURCE_DIR}/api/audio/echo_canceller3_config.h + ${webrtc_SOURCE_DIR}/api/audio/echo_control.h + ${webrtc_SOURCE_DIR}/api/call/audio_sink.h + ${webrtc_SOURCE_DIR}/api/call/bitrate_allocation.h + ${webrtc_SOURCE_DIR}/api/call/transport.cc + ${webrtc_SOURCE_DIR}/api/call/transport.h + ${webrtc_SOURCE_DIR}/api/candidate.cc + ${webrtc_SOURCE_DIR}/api/candidate.h + ${webrtc_SOURCE_DIR}/api/crypto_params.h + ${webrtc_SOURCE_DIR}/api/crypto/crypto_options.cc + ${webrtc_SOURCE_DIR}/api/crypto/crypto_options.h + ${webrtc_SOURCE_DIR}/api/crypto/frame_decryptor_interface.h + ${webrtc_SOURCE_DIR}/api/crypto/frame_encryptor_interface.h + ${webrtc_SOURCE_DIR}/api/dtls_transport_interface.cc + ${webrtc_SOURCE_DIR}/api/dtls_transport_interface.h + ${webrtc_SOURCE_DIR}/api/dtmf_sender_interface.h + ${webrtc_SOURCE_DIR}/api/fec_controller_override.h + ${webrtc_SOURCE_DIR}/api/fec_controller.h + ${webrtc_SOURCE_DIR}/api/frame_transformer_interface.h + ${webrtc_SOURCE_DIR}/api/function_view.h + ${webrtc_SOURCE_DIR}/api/ice_transport_interface.h + ${webrtc_SOURCE_DIR}/api/jsep_ice_candidate.cc + ${webrtc_SOURCE_DIR}/api/jsep_ice_candidate.cc + ${webrtc_SOURCE_DIR}/api/jsep_ice_candidate.h + ${webrtc_SOURCE_DIR}/api/jsep_session_description.h + ${webrtc_SOURCE_DIR}/api/jsep.cc + ${webrtc_SOURCE_DIR}/api/jsep.h + ${webrtc_SOURCE_DIR}/api/media_stream_interface.cc + ${webrtc_SOURCE_DIR}/api/media_stream_interface.h + ${webrtc_SOURCE_DIR}/api/media_types.cc + ${webrtc_SOURCE_DIR}/api/media_types.h + ${webrtc_SOURCE_DIR}/api/neteq/neteq_factory.h + ${webrtc_SOURCE_DIR}/api/neteq/neteq.cc + ${webrtc_SOURCE_DIR}/api/neteq/neteq.h + ${webrtc_SOURCE_DIR}/api/network_state_predictor.h + ${webrtc_SOURCE_DIR}/api/packet_socket_factory.h + ${webrtc_SOURCE_DIR}/api/priority.h + ${webrtc_SOURCE_DIR}/api/proxy.cc + ${webrtc_SOURCE_DIR}/api/proxy.h + ${webrtc_SOURCE_DIR}/api/ref_counted_base.h + ${webrtc_SOURCE_DIR}/api/rtc_error.cc + ${webrtc_SOURCE_DIR}/api/rtc_error.h + ${webrtc_SOURCE_DIR}/api/rtc_event_log_output.h + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event_log_factory_interface.h + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event_log_factory.cc + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event_log_factory.cc + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event_log_factory.h + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event_log.cc + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event_log.h + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event.cc + ${webrtc_SOURCE_DIR}/api/rtc_event_log/rtc_event.h + ${webrtc_SOURCE_DIR}/api/rtp_headers.cc + ${webrtc_SOURCE_DIR}/api/rtp_headers.h + ${webrtc_SOURCE_DIR}/api/rtp_packet_info.cc + ${webrtc_SOURCE_DIR}/api/rtp_packet_info.h + ${webrtc_SOURCE_DIR}/api/rtp_packet_infos.h + ${webrtc_SOURCE_DIR}/api/rtp_parameters.cc + ${webrtc_SOURCE_DIR}/api/rtp_parameters.h + ${webrtc_SOURCE_DIR}/api/rtp_receiver_interface.cc + ${webrtc_SOURCE_DIR}/api/rtp_receiver_interface.h + ${webrtc_SOURCE_DIR}/api/rtp_sender_interface.cc + ${webrtc_SOURCE_DIR}/api/rtp_sender_interface.h + ${webrtc_SOURCE_DIR}/api/rtp_transceiver_direction.h + ${webrtc_SOURCE_DIR}/api/rtp_transceiver_interface.cc + ${webrtc_SOURCE_DIR}/api/rtp_transceiver_interface.h + ${webrtc_SOURCE_DIR}/api/scoped_refptr.h + ${webrtc_SOURCE_DIR}/api/task_queue/default_task_queue_factory.h + ${webrtc_SOURCE_DIR}/api/task_queue/queued_task.h + ${webrtc_SOURCE_DIR}/api/task_queue/task_queue_base.cc + ${webrtc_SOURCE_DIR}/api/task_queue/task_queue_base.h + ${webrtc_SOURCE_DIR}/api/task_queue/task_queue_factory.h + ${webrtc_SOURCE_DIR}/api/transport/bitrate_settings.cc + ${webrtc_SOURCE_DIR}/api/transport/bitrate_settings.h + ${webrtc_SOURCE_DIR}/api/transport/data_channel_transport_interface.h + ${webrtc_SOURCE_DIR}/api/transport/enums.h + ${webrtc_SOURCE_DIR}/api/transport/network_control.h + ${webrtc_SOURCE_DIR}/api/transport/network_types.cc + ${webrtc_SOURCE_DIR}/api/transport/network_types.h + ${webrtc_SOURCE_DIR}/api/transport/rtp/dependency_descriptor.cc + ${webrtc_SOURCE_DIR}/api/transport/rtp/dependency_descriptor.h + ${webrtc_SOURCE_DIR}/api/transport/rtp/rtp_source.h + ${webrtc_SOURCE_DIR}/api/transport/stun.cc + ${webrtc_SOURCE_DIR}/api/transport/stun.h + ${webrtc_SOURCE_DIR}/api/transport/webrtc_key_value_config.h + ${webrtc_SOURCE_DIR}/api/turn_customizer.h + ${webrtc_SOURCE_DIR}/api/units/data_rate.cc + ${webrtc_SOURCE_DIR}/api/units/data_rate.h + ${webrtc_SOURCE_DIR}/api/units/data_size.cc + ${webrtc_SOURCE_DIR}/api/units/data_size.h + ${webrtc_SOURCE_DIR}/api/units/frequency.cc + ${webrtc_SOURCE_DIR}/api/units/frequency.h + ${webrtc_SOURCE_DIR}/api/units/time_delta.cc + ${webrtc_SOURCE_DIR}/api/units/time_delta.h + ${webrtc_SOURCE_DIR}/api/units/timestamp.cc + ${webrtc_SOURCE_DIR}/api/units/timestamp.h + ${webrtc_SOURCE_DIR}/api/video_codecs/sdp_video_format.cc + ${webrtc_SOURCE_DIR}/api/video_codecs/sdp_video_format.h + ${webrtc_SOURCE_DIR}/api/video_codecs/video_codec.cc + ${webrtc_SOURCE_DIR}/api/video_codecs/video_codec.h + ${webrtc_SOURCE_DIR}/api/video_codecs/video_decoder.cc + ${webrtc_SOURCE_DIR}/api/video_codecs/video_decoder.h + ${webrtc_SOURCE_DIR}/api/video_codecs/video_encoder_config.cc + ${webrtc_SOURCE_DIR}/api/video_codecs/video_encoder_config.h + ${webrtc_SOURCE_DIR}/api/video_codecs/video_encoder_factory.h + ${webrtc_SOURCE_DIR}/api/video_codecs/video_encoder.cc + ${webrtc_SOURCE_DIR}/api/video_codecs/video_encoder.h + ${webrtc_SOURCE_DIR}/api/video/color_space.cc + ${webrtc_SOURCE_DIR}/api/video/color_space.h + ${webrtc_SOURCE_DIR}/api/video/encoded_frame.cc + ${webrtc_SOURCE_DIR}/api/video/encoded_frame.h + ${webrtc_SOURCE_DIR}/api/video/encoded_image.cc + ${webrtc_SOURCE_DIR}/api/video/encoded_image.h + ${webrtc_SOURCE_DIR}/api/video/hdr_metadata.cc + ${webrtc_SOURCE_DIR}/api/video/hdr_metadata.h + ${webrtc_SOURCE_DIR}/api/video/recordable_encoded_frame.h + ${webrtc_SOURCE_DIR}/api/video/video_bitrate_allocation.cc + ${webrtc_SOURCE_DIR}/api/video/video_bitrate_allocation.h + ${webrtc_SOURCE_DIR}/api/video/video_bitrate_allocator_factory.h + ${webrtc_SOURCE_DIR}/api/video/video_bitrate_allocator.cc + ${webrtc_SOURCE_DIR}/api/video/video_bitrate_allocator.h + ${webrtc_SOURCE_DIR}/api/video/video_codec_constants.h + ${webrtc_SOURCE_DIR}/api/video/video_codec_type.h + ${webrtc_SOURCE_DIR}/api/video/video_content_type.cc + ${webrtc_SOURCE_DIR}/api/video/video_content_type.h + ${webrtc_SOURCE_DIR}/api/video/video_frame_buffer.cc + ${webrtc_SOURCE_DIR}/api/video/video_frame_buffer.h + ${webrtc_SOURCE_DIR}/api/video/video_frame_metadata.cc + ${webrtc_SOURCE_DIR}/api/video/video_frame_metadata.h + ${webrtc_SOURCE_DIR}/api/video/video_frame_type.h + ${webrtc_SOURCE_DIR}/api/video/video_frame.cc + ${webrtc_SOURCE_DIR}/api/video/video_frame.h + ${webrtc_SOURCE_DIR}/api/video/video_rotation.h + ${webrtc_SOURCE_DIR}/api/video/video_sink_interface.h + ${webrtc_SOURCE_DIR}/api/video/video_source_interface.cc + ${webrtc_SOURCE_DIR}/api/video/video_source_interface.h + ${webrtc_SOURCE_DIR}/api/video/video_stream_encoder_settings.h + ${webrtc_SOURCE_DIR}/api/video/video_timing.cc + ${webrtc_SOURCE_DIR}/api/video/video_timing.h + ${webrtc_SOURCE_DIR}/call/audio_receive_stream.cc + ${webrtc_SOURCE_DIR}/call/audio_receive_stream.h + #${webrtc_SOURCE_DIR}/call/audio_send_stream.cc + #${webrtc_SOURCE_DIR}/call/audio_send_stream.h + ${webrtc_SOURCE_DIR}/call/audio_sender.h + ${webrtc_SOURCE_DIR}/call/audio_state.cc + ${webrtc_SOURCE_DIR}/call/audio_state.h + #${webrtc_SOURCE_DIR}/call/call_config.cc + #${webrtc_SOURCE_DIR}/call/call_config.h + #${webrtc_SOURCE_DIR}/call/call.cc + #${webrtc_SOURCE_DIR}/call/call.h + ${webrtc_SOURCE_DIR}/call/flexfec_receive_stream.cc + ${webrtc_SOURCE_DIR}/call/flexfec_receive_stream.h + ${webrtc_SOURCE_DIR}/call/packet_receiver.h + ${webrtc_SOURCE_DIR}/call/rtp_config.cc + ${webrtc_SOURCE_DIR}/call/rtp_config.h + ${webrtc_SOURCE_DIR}/call/rtp_demuxer.cc + ${webrtc_SOURCE_DIR}/call/rtp_demuxer.h + ${webrtc_SOURCE_DIR}/call/rtp_packet_sink_interface.h + ${webrtc_SOURCE_DIR}/call/rtp_rtcp_demuxer_helper.cc + ${webrtc_SOURCE_DIR}/call/rtp_rtcp_demuxer_helper.h + ${webrtc_SOURCE_DIR}/call/rtp_transport_controller_send_interface.h + ${webrtc_SOURCE_DIR}/call/ssrc_binding_observer.h + ${webrtc_SOURCE_DIR}/call/video_receive_stream.cc + ${webrtc_SOURCE_DIR}/call/video_receive_stream.h + ${webrtc_SOURCE_DIR}/call/video_send_stream.cc + ${webrtc_SOURCE_DIR}/call/video_send_stream.h + ${webrtc_SOURCE_DIR}/common_types.h + ${webrtc_SOURCE_DIR}/common_video/generic_frame_descriptor/generic_frame_info.cc + ${webrtc_SOURCE_DIR}/common_video/generic_frame_descriptor/generic_frame_info.h + ${webrtc_SOURCE_DIR}/common_video/include/quality_limitation_reason.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_dtls_transport_state.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_dtls_transport_state.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_dtls_writable_state.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_dtls_writable_state.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/ice_logger.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/ice_logger.h + ${webrtc_SOURCE_DIR}/media/base/codec.cc + ${webrtc_SOURCE_DIR}/media/base/codec.h + ${webrtc_SOURCE_DIR}/media/base/delayable.h + ${webrtc_SOURCE_DIR}/media/base/h264_profile_level_id.cc + ${webrtc_SOURCE_DIR}/media/base/h264_profile_level_id.h + ${webrtc_SOURCE_DIR}/media/base/media_channel.cc + ${webrtc_SOURCE_DIR}/media/base/media_channel.h + ${webrtc_SOURCE_DIR}/media/base/media_config.h + ${webrtc_SOURCE_DIR}/media/base/media_constants.cc + ${webrtc_SOURCE_DIR}/media/base/media_constants.h + ${webrtc_SOURCE_DIR}/media/base/media_engine.cc + ${webrtc_SOURCE_DIR}/media/base/media_engine.h + ${webrtc_SOURCE_DIR}/media/base/rid_description.cc + ${webrtc_SOURCE_DIR}/media/base/rid_description.cc + ${webrtc_SOURCE_DIR}/media/base/rid_description.h + ${webrtc_SOURCE_DIR}/media/base/rtp_utils.cc + ${webrtc_SOURCE_DIR}/media/base/rtp_utils.h + ${webrtc_SOURCE_DIR}/media/base/stream_params.cc + ${webrtc_SOURCE_DIR}/media/base/stream_params.h + ${webrtc_SOURCE_DIR}/media/base/turn_utils.cc + ${webrtc_SOURCE_DIR}/media/base/turn_utils.cc + ${webrtc_SOURCE_DIR}/media/base/turn_utils.h + ${webrtc_SOURCE_DIR}/media/base/video_common.cc + ${webrtc_SOURCE_DIR}/media/base/video_common.h + ${webrtc_SOURCE_DIR}/media/base/vp9_profile.cc + ${webrtc_SOURCE_DIR}/media/base/vp9_profile.h + ${webrtc_SOURCE_DIR}/modules/audio_device/include/audio_device_defines.h + ${webrtc_SOURCE_DIR}/modules/audio_device/include/audio_device.h + ${webrtc_SOURCE_DIR}/modules/audio_processing/include/audio_processing_statistics.cc + ${webrtc_SOURCE_DIR}/modules/audio_processing/include/audio_processing_statistics.h + ${webrtc_SOURCE_DIR}/modules/audio_processing/include/audio_processing.cc + ${webrtc_SOURCE_DIR}/modules/audio_processing/include/audio_processing.h + ${webrtc_SOURCE_DIR}/modules/audio_processing/include/config.cc + ${webrtc_SOURCE_DIR}/modules/audio_processing/include/config.h + ${webrtc_SOURCE_DIR}/modules/include/module_common_types.cc + ${webrtc_SOURCE_DIR}/modules/include/module_common_types.h + ${webrtc_SOURCE_DIR}/modules/include/module_fec_types.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/report_block_data.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/report_block_data.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/rtcp_statistics.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/rtp_header_extension_map.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/rtp_packet_sender.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/rtp_rtcp_defines.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/include/rtp_rtcp_defines.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/byte_io.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet/app.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet/app.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet/common_header.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet/common_header.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet/remote_estimate.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtcp_packet/remote_estimate.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_generic_frame_descriptor.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_header_extension_map.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_header_extensions.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_header_extensions.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_packet_received.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_packet_received.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_packet_to_send.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_packet_to_send.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_packet.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_packet.h + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_video_header.cc + ${webrtc_SOURCE_DIR}/modules/rtp_rtcp/source/rtp_video_header.h + ${webrtc_SOURCE_DIR}/modules/utility/include/process_thread.h + ${webrtc_SOURCE_DIR}/modules/video_coding/codecs/h264/include/h264_globals.h + ${webrtc_SOURCE_DIR}/modules/video_coding/codecs/interface/common_constants.h + ${webrtc_SOURCE_DIR}/modules/video_coding/codecs/vp8/include/vp8_globals.h + ${webrtc_SOURCE_DIR}/modules/video_coding/codecs/vp9/include/vp9_globals.h + ${webrtc_SOURCE_DIR}/modules/video_coding/encoded_frame.cc + ${webrtc_SOURCE_DIR}/modules/video_coding/encoded_frame.h + ${webrtc_SOURCE_DIR}/modules/video_coding/include/video_codec_interface.cc + ${webrtc_SOURCE_DIR}/modules/video_coding/include/video_codec_interface.h + ${webrtc_SOURCE_DIR}/modules/video_coding/include/video_coding_defines.h + ${webrtc_SOURCE_DIR}/modules/video_coding/include/video_error_codes.h + ${webrtc_SOURCE_DIR}/p2p/base/async_stun_tcp_socket.cc + ${webrtc_SOURCE_DIR}/p2p/base/async_stun_tcp_socket.h + ${webrtc_SOURCE_DIR}/p2p/base/basic_ice_controller.cc + ${webrtc_SOURCE_DIR}/p2p/base/basic_ice_controller.h + ${webrtc_SOURCE_DIR}/p2p/base/basic_packet_socket_factory.cc + ${webrtc_SOURCE_DIR}/p2p/base/basic_packet_socket_factory.cc + ${webrtc_SOURCE_DIR}/p2p/base/basic_packet_socket_factory.h + ${webrtc_SOURCE_DIR}/p2p/base/candidate_pair_interface.h + ${webrtc_SOURCE_DIR}/p2p/base/connection_info.cc + ${webrtc_SOURCE_DIR}/p2p/base/connection_info.h + ${webrtc_SOURCE_DIR}/p2p/base/connection.cc + ${webrtc_SOURCE_DIR}/p2p/base/connection.h + ${webrtc_SOURCE_DIR}/p2p/base/dtls_transport_internal.cc + ${webrtc_SOURCE_DIR}/p2p/base/dtls_transport_internal.h + ${webrtc_SOURCE_DIR}/p2p/base/dtls_transport.cc + ${webrtc_SOURCE_DIR}/p2p/base/dtls_transport.h + ${webrtc_SOURCE_DIR}/p2p/base/ice_controller_factory_interface.h + ${webrtc_SOURCE_DIR}/p2p/base/ice_controller_interface.cc + ${webrtc_SOURCE_DIR}/p2p/base/ice_controller_interface.h + ${webrtc_SOURCE_DIR}/p2p/base/ice_credentials_iterator.cc + ${webrtc_SOURCE_DIR}/p2p/base/ice_credentials_iterator.h + ${webrtc_SOURCE_DIR}/p2p/base/ice_transport_internal.cc + ${webrtc_SOURCE_DIR}/p2p/base/ice_transport_internal.h + ${webrtc_SOURCE_DIR}/p2p/base/p2p_constants.cc + ${webrtc_SOURCE_DIR}/p2p/base/p2p_constants.h + ${webrtc_SOURCE_DIR}/p2p/base/p2p_transport_channel_ice_field_trials.h + ${webrtc_SOURCE_DIR}/p2p/base/p2p_transport_channel.cc + ${webrtc_SOURCE_DIR}/p2p/base/p2p_transport_channel.cc + ${webrtc_SOURCE_DIR}/p2p/base/p2p_transport_channel.h + ${webrtc_SOURCE_DIR}/p2p/base/packet_transport_internal.cc + ${webrtc_SOURCE_DIR}/p2p/base/packet_transport_internal.h + ${webrtc_SOURCE_DIR}/p2p/base/port_allocator.cc + ${webrtc_SOURCE_DIR}/p2p/base/port_allocator.h + ${webrtc_SOURCE_DIR}/p2p/base/port_interface.cc + ${webrtc_SOURCE_DIR}/p2p/base/port_interface.h + ${webrtc_SOURCE_DIR}/p2p/base/port.cc + ${webrtc_SOURCE_DIR}/p2p/base/port.h + ${webrtc_SOURCE_DIR}/p2p/base/regathering_controller.cc + ${webrtc_SOURCE_DIR}/p2p/base/regathering_controller.h + ${webrtc_SOURCE_DIR}/p2p/base/stun_port.cc + ${webrtc_SOURCE_DIR}/p2p/base/stun_port.h + ${webrtc_SOURCE_DIR}/p2p/base/stun_request.cc + ${webrtc_SOURCE_DIR}/p2p/base/stun_request.h + ${webrtc_SOURCE_DIR}/p2p/base/tcp_port.cc + ${webrtc_SOURCE_DIR}/p2p/base/tcp_port.h + ${webrtc_SOURCE_DIR}/p2p/base/transport_description_factory.cc + ${webrtc_SOURCE_DIR}/p2p/base/transport_description_factory.h + ${webrtc_SOURCE_DIR}/p2p/base/transport_description.cc + ${webrtc_SOURCE_DIR}/p2p/base/transport_description.h + ${webrtc_SOURCE_DIR}/p2p/base/transport_info.h + ${webrtc_SOURCE_DIR}/p2p/base/turn_port.cc + ${webrtc_SOURCE_DIR}/p2p/base/turn_port.h + ${webrtc_SOURCE_DIR}/p2p/base/udp_port.h + ${webrtc_SOURCE_DIR}/p2p/client/basic_port_allocator.cc + ${webrtc_SOURCE_DIR}/p2p/client/basic_port_allocator.cc + ${webrtc_SOURCE_DIR}/p2p/client/basic_port_allocator.h + ${webrtc_SOURCE_DIR}/p2p/client/relay_port_factory_interface.h + ${webrtc_SOURCE_DIR}/p2p/client/turn_port_factory.cc + ${webrtc_SOURCE_DIR}/p2p/client/turn_port_factory.h + ${webrtc_SOURCE_DIR}/pc/channel_interface.h + ${webrtc_SOURCE_DIR}/pc/channel_manager.cc + ${webrtc_SOURCE_DIR}/pc/channel_manager.cc + ${webrtc_SOURCE_DIR}/pc/channel_manager.h + ${webrtc_SOURCE_DIR}/pc/channel.cc + ${webrtc_SOURCE_DIR}/pc/channel.h + ${webrtc_SOURCE_DIR}/pc/composite_data_channel_transport.cc + ${webrtc_SOURCE_DIR}/pc/composite_data_channel_transport.h + ${webrtc_SOURCE_DIR}/pc/composite_rtp_transport.cc + ${webrtc_SOURCE_DIR}/pc/composite_rtp_transport.h + ${webrtc_SOURCE_DIR}/pc/dtls_transport.cc + ${webrtc_SOURCE_DIR}/pc/dtls_transport.h + ${webrtc_SOURCE_DIR}/pc/ice_transport.cc + ${webrtc_SOURCE_DIR}/pc/ice_transport.h + ${webrtc_SOURCE_DIR}/pc/jsep_ice_candidate.cc + ${webrtc_SOURCE_DIR}/pc/jsep_session_description.cc + #${webrtc_SOURCE_DIR}/pc/jsep_transport.cc + #${webrtc_SOURCE_DIR}/pc/jsep_transport.h + ${webrtc_SOURCE_DIR}/pc/media_protocol_names.cc + ${webrtc_SOURCE_DIR}/pc/media_protocol_names.h + ${webrtc_SOURCE_DIR}/pc/media_session.cc + ${webrtc_SOURCE_DIR}/pc/media_session.h + ${webrtc_SOURCE_DIR}/pc/rtp_media_utils.cc + ${webrtc_SOURCE_DIR}/pc/rtp_media_utils.h + ${webrtc_SOURCE_DIR}/pc/rtp_transport_internal.h + ${webrtc_SOURCE_DIR}/pc/rtp_transport.cc + ${webrtc_SOURCE_DIR}/pc/rtp_transport.h + #${webrtc_SOURCE_DIR}/pc/sctp_data_channel_transport.cc + #${webrtc_SOURCE_DIR}/pc/sctp_data_channel_transport.h + ${webrtc_SOURCE_DIR}/pc/sdp_serializer.cc + ${webrtc_SOURCE_DIR}/pc/sdp_serializer.h + ${webrtc_SOURCE_DIR}/pc/session_description.cc + ${webrtc_SOURCE_DIR}/pc/session_description.h + ${webrtc_SOURCE_DIR}/pc/simulcast_description.cc + ${webrtc_SOURCE_DIR}/pc/simulcast_description.h + ${webrtc_SOURCE_DIR}/pc/transport_stats.cc + ${webrtc_SOURCE_DIR}/pc/transport_stats.h + ${webrtc_SOURCE_DIR}/pc/used_ids.h + ${webrtc_SOURCE_DIR}/pc/webrtc_sdp.cc + ${webrtc_SOURCE_DIR}/pc/webrtc_sdp.h + ${webrtc_SOURCE_DIR}/rtc_base/arraysize.h + ${webrtc_SOURCE_DIR}/rtc_base/async_invoker_inl.h + ${webrtc_SOURCE_DIR}/rtc_base/async_invoker.cc + ${webrtc_SOURCE_DIR}/rtc_base/async_invoker.h + ${webrtc_SOURCE_DIR}/rtc_base/async_packet_socket.cc + ${webrtc_SOURCE_DIR}/rtc_base/async_packet_socket.h + ${webrtc_SOURCE_DIR}/rtc_base/async_resolver_interface.cc + ${webrtc_SOURCE_DIR}/rtc_base/async_resolver_interface.h + ${webrtc_SOURCE_DIR}/rtc_base/async_socket.cc + ${webrtc_SOURCE_DIR}/rtc_base/async_socket.h + ${webrtc_SOURCE_DIR}/rtc_base/async_tcp_socket.cc + ${webrtc_SOURCE_DIR}/rtc_base/async_tcp_socket.h + ${webrtc_SOURCE_DIR}/rtc_base/async_udp_socket.cc + ${webrtc_SOURCE_DIR}/rtc_base/async_udp_socket.h + ${webrtc_SOURCE_DIR}/rtc_base/atomic_ops.h + ${webrtc_SOURCE_DIR}/rtc_base/bind.h + ${webrtc_SOURCE_DIR}/rtc_base/bit_buffer.cc + ${webrtc_SOURCE_DIR}/rtc_base/buffer_queue.cc + ${webrtc_SOURCE_DIR}/rtc_base/buffer_queue.h + ${webrtc_SOURCE_DIR}/rtc_base/buffer.h + ${webrtc_SOURCE_DIR}/rtc_base/byte_buffer.cc + ${webrtc_SOURCE_DIR}/rtc_base/byte_buffer.h + ${webrtc_SOURCE_DIR}/rtc_base/byte_order.h + ${webrtc_SOURCE_DIR}/rtc_base/callback.h + ${webrtc_SOURCE_DIR}/rtc_base/checks.cc + ${webrtc_SOURCE_DIR}/rtc_base/checks.h + ${webrtc_SOURCE_DIR}/rtc_base/constructor_magic.h + ${webrtc_SOURCE_DIR}/rtc_base/copy_on_write_buffer.cc + ${webrtc_SOURCE_DIR}/rtc_base/copy_on_write_buffer.h + ${webrtc_SOURCE_DIR}/rtc_base/crc32.cc + ${webrtc_SOURCE_DIR}/rtc_base/crc32.h + ${webrtc_SOURCE_DIR}/rtc_base/critical_section.cc + ${webrtc_SOURCE_DIR}/rtc_base/critical_section.h + ${webrtc_SOURCE_DIR}/rtc_base/crypt_string.cc + ${webrtc_SOURCE_DIR}/rtc_base/crypt_string.h + ${webrtc_SOURCE_DIR}/rtc_base/deprecated/signal_thread.cc + ${webrtc_SOURCE_DIR}/rtc_base/deprecated/signal_thread.h + ${webrtc_SOURCE_DIR}/rtc_base/deprecation.h + ${webrtc_SOURCE_DIR}/rtc_base/dscp.h + ${webrtc_SOURCE_DIR}/rtc_base/event_tracer.cc + ${webrtc_SOURCE_DIR}/rtc_base/event_tracer.cc + ${webrtc_SOURCE_DIR}/rtc_base/event_tracer.h + ${webrtc_SOURCE_DIR}/rtc_base/event.cc + ${webrtc_SOURCE_DIR}/rtc_base/event.h + ${webrtc_SOURCE_DIR}/rtc_base/experiments/field_trial_parser.cc + ${webrtc_SOURCE_DIR}/rtc_base/experiments/field_trial_parser.h + ${webrtc_SOURCE_DIR}/rtc_base/experiments/field_trial_units.cc + ${webrtc_SOURCE_DIR}/rtc_base/experiments/field_trial_units.h + ${webrtc_SOURCE_DIR}/rtc_base/experiments/struct_parameters_parser.cc + ${webrtc_SOURCE_DIR}/rtc_base/experiments/struct_parameters_parser.h + ${webrtc_SOURCE_DIR}/rtc_base/helpers.cc + ${webrtc_SOURCE_DIR}/rtc_base/helpers.h + ${webrtc_SOURCE_DIR}/rtc_base/http_common.cc + ${webrtc_SOURCE_DIR}/rtc_base/http_common.cc + ${webrtc_SOURCE_DIR}/rtc_base/http_common.h + ${webrtc_SOURCE_DIR}/rtc_base/ip_address.cc + ${webrtc_SOURCE_DIR}/rtc_base/ip_address.h + ${webrtc_SOURCE_DIR}/rtc_base/location.cc + ${webrtc_SOURCE_DIR}/rtc_base/location.h + ${webrtc_SOURCE_DIR}/rtc_base/logging.cc + ${webrtc_SOURCE_DIR}/rtc_base/logging.h + ${webrtc_SOURCE_DIR}/rtc_base/mdns_responder_interface.h + ${webrtc_SOURCE_DIR}/rtc_base/message_digest.cc + ${webrtc_SOURCE_DIR}/rtc_base/message_digest.h + ${webrtc_SOURCE_DIR}/rtc_base/message_handler.cc + ${webrtc_SOURCE_DIR}/rtc_base/message_handler.h + ${webrtc_SOURCE_DIR}/rtc_base/net_helper.cc + ${webrtc_SOURCE_DIR}/rtc_base/net_helper.h + ${webrtc_SOURCE_DIR}/rtc_base/net_helpers.cc + ${webrtc_SOURCE_DIR}/rtc_base/net_helpers.h + ${webrtc_SOURCE_DIR}/rtc_base/network_constants.cc + ${webrtc_SOURCE_DIR}/rtc_base/network_constants.h + ${webrtc_SOURCE_DIR}/rtc_base/network_monitor.cc + ${webrtc_SOURCE_DIR}/rtc_base/network_monitor.h + ${webrtc_SOURCE_DIR}/rtc_base/network_route.cc + ${webrtc_SOURCE_DIR}/rtc_base/network_route.h + ${webrtc_SOURCE_DIR}/rtc_base/network.cc + ${webrtc_SOURCE_DIR}/rtc_base/network.h + ${webrtc_SOURCE_DIR}/rtc_base/network/sent_packet.cc + ${webrtc_SOURCE_DIR}/rtc_base/network/sent_packet.h + ${webrtc_SOURCE_DIR}/rtc_base/null_socket_server.cc + ${webrtc_SOURCE_DIR}/rtc_base/null_socket_server.h + ${webrtc_SOURCE_DIR}/rtc_base/numerics/event_based_exponential_moving_average.cc + ${webrtc_SOURCE_DIR}/rtc_base/numerics/event_based_exponential_moving_average.h + ${webrtc_SOURCE_DIR}/rtc_base/numerics/safe_compare.h + ${webrtc_SOURCE_DIR}/rtc_base/numerics/safe_conversions_impl.h + ${webrtc_SOURCE_DIR}/rtc_base/numerics/safe_conversions.h + ${webrtc_SOURCE_DIR}/rtc_base/numerics/safe_minmax.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_adapter.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_adapter.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_certificate.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_certificate.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_digest.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_digest.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_identity.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_identity.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_session_cache.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_session_cache.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_stream_adapter.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_stream_adapter.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl_utility.cc + ${webrtc_SOURCE_DIR}/rtc_base/openssl_utility.h + ${webrtc_SOURCE_DIR}/rtc_base/openssl.h + ${webrtc_SOURCE_DIR}/rtc_base/physical_socket_server.cc + ${webrtc_SOURCE_DIR}/rtc_base/physical_socket_server.h + ${webrtc_SOURCE_DIR}/rtc_base/platform_thread_types.cc + ${webrtc_SOURCE_DIR}/rtc_base/platform_thread_types.h + ${webrtc_SOURCE_DIR}/rtc_base/platform_thread.cc + ${webrtc_SOURCE_DIR}/rtc_base/platform_thread.cc + ${webrtc_SOURCE_DIR}/rtc_base/platform_thread.h + ${webrtc_SOURCE_DIR}/rtc_base/proxy_info.cc + ${webrtc_SOURCE_DIR}/rtc_base/proxy_info.h + ${webrtc_SOURCE_DIR}/rtc_base/rate_tracker.cc + ${webrtc_SOURCE_DIR}/rtc_base/rate_tracker.h + ${webrtc_SOURCE_DIR}/rtc_base/ref_count.h + ${webrtc_SOURCE_DIR}/rtc_base/ref_counted_object.h + ${webrtc_SOURCE_DIR}/rtc_base/ref_counter.h + ${webrtc_SOURCE_DIR}/rtc_base/rtc_certificate.cc + ${webrtc_SOURCE_DIR}/rtc_base/rtc_certificate.h + ${webrtc_SOURCE_DIR}/rtc_base/sanitizer.h + ${webrtc_SOURCE_DIR}/rtc_base/signal_thread.h + ${webrtc_SOURCE_DIR}/rtc_base/socket_adapters.cc + ${webrtc_SOURCE_DIR}/rtc_base/socket_adapters.h + ${webrtc_SOURCE_DIR}/rtc_base/socket_address.cc + ${webrtc_SOURCE_DIR}/rtc_base/socket_address.h + ${webrtc_SOURCE_DIR}/rtc_base/socket_factory.h + ${webrtc_SOURCE_DIR}/rtc_base/socket_server.h + ${webrtc_SOURCE_DIR}/rtc_base/socket.cc + ${webrtc_SOURCE_DIR}/rtc_base/socket.h + ${webrtc_SOURCE_DIR}/rtc_base/ssl_adapter.cc + ${webrtc_SOURCE_DIR}/rtc_base/ssl_adapter.h + ${webrtc_SOURCE_DIR}/rtc_base/ssl_certificate.cc + ${webrtc_SOURCE_DIR}/rtc_base/ssl_certificate.h + ${webrtc_SOURCE_DIR}/rtc_base/ssl_fingerprint.cc + ${webrtc_SOURCE_DIR}/rtc_base/ssl_fingerprint.h + ${webrtc_SOURCE_DIR}/rtc_base/ssl_identity.cc + ${webrtc_SOURCE_DIR}/rtc_base/ssl_identity.h + ${webrtc_SOURCE_DIR}/rtc_base/ssl_roots.h + ${webrtc_SOURCE_DIR}/rtc_base/ssl_stream_adapter.cc + ${webrtc_SOURCE_DIR}/rtc_base/ssl_stream_adapter.h + ${webrtc_SOURCE_DIR}/rtc_base/stream.cc + ${webrtc_SOURCE_DIR}/rtc_base/stream.h + ${webrtc_SOURCE_DIR}/rtc_base/string_encode.cc + ${webrtc_SOURCE_DIR}/rtc_base/string_encode.h + ${webrtc_SOURCE_DIR}/rtc_base/string_to_number.cc + ${webrtc_SOURCE_DIR}/rtc_base/string_to_number.h + ${webrtc_SOURCE_DIR}/rtc_base/string_utils.cc + ${webrtc_SOURCE_DIR}/rtc_base/string_utils.h + ${webrtc_SOURCE_DIR}/rtc_base/stringize_macros.h + ${webrtc_SOURCE_DIR}/rtc_base/strings/string_builder.cc + ${webrtc_SOURCE_DIR}/rtc_base/strings/string_builder.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/mutex_critical_section.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/mutex.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/mutex.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/rw_lock_wrapper.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/rw_lock_wrapper.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/sequence_checker.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/sequence_checker.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/yield_policy.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/yield_policy.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/yield_policy.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/yield.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/yield.h + ${webrtc_SOURCE_DIR}/rtc_base/system/arch.h + ${webrtc_SOURCE_DIR}/rtc_base/system/file_wrapper.cc + ${webrtc_SOURCE_DIR}/rtc_base/system/file_wrapper.h + ${webrtc_SOURCE_DIR}/rtc_base/system/inline.h + ${webrtc_SOURCE_DIR}/rtc_base/system/rtc_export.h + ${webrtc_SOURCE_DIR}/rtc_base/system/unused.h + ${webrtc_SOURCE_DIR}/rtc_base/system/warn_current_thread_is_deadlocked.h + ${webrtc_SOURCE_DIR}/rtc_base/task_queue.cc + ${webrtc_SOURCE_DIR}/rtc_base/task_queue.h + ${webrtc_SOURCE_DIR}/rtc_base/task_utils/pending_task_safety_flag.cc + ${webrtc_SOURCE_DIR}/rtc_base/task_utils/pending_task_safety_flag.h + ${webrtc_SOURCE_DIR}/rtc_base/task_utils/to_queued_task.h + ${webrtc_SOURCE_DIR}/rtc_base/third_party/base64/base64.cc + ${webrtc_SOURCE_DIR}/rtc_base/third_party/base64/base64.h + ${webrtc_SOURCE_DIR}/rtc_base/third_party/sigslot/sigslot.cc + ${webrtc_SOURCE_DIR}/rtc_base/third_party/sigslot/sigslot.h + ${webrtc_SOURCE_DIR}/rtc_base/thread_annotations.h + ${webrtc_SOURCE_DIR}/rtc_base/thread_checker.h + ${webrtc_SOURCE_DIR}/rtc_base/thread_message.h + ${webrtc_SOURCE_DIR}/rtc_base/thread.cc + ${webrtc_SOURCE_DIR}/rtc_base/thread.h + ${webrtc_SOURCE_DIR}/rtc_base/time_utils.cc + ${webrtc_SOURCE_DIR}/rtc_base/time_utils.h + ${webrtc_SOURCE_DIR}/rtc_base/trace_event.h + ${webrtc_SOURCE_DIR}/rtc_base/type_traits.h + ${webrtc_SOURCE_DIR}/rtc_base/unique_id_generator.cc + ${webrtc_SOURCE_DIR}/rtc_base/unique_id_generator.h + ${webrtc_SOURCE_DIR}/rtc_base/units/unit_base.h + ${webrtc_SOURCE_DIR}/rtc_base/weak_ptr.cc + ${webrtc_SOURCE_DIR}/rtc_base/weak_ptr.h + ${webrtc_SOURCE_DIR}/rtc_base/zero_memory.cc + ${webrtc_SOURCE_DIR}/rtc_base/zero_memory.h + ${webrtc_SOURCE_DIR}/system_wrappers/include/clock.h + ${webrtc_SOURCE_DIR}/system_wrappers/include/field_trial.h + ${webrtc_SOURCE_DIR}/system_wrappers/include/metrics.h + ${webrtc_SOURCE_DIR}/system_wrappers/include/ntp_time.h + ${webrtc_SOURCE_DIR}/system_wrappers/source/clock.cc + ${webrtc_SOURCE_DIR}/system_wrappers/source/field_trial.cc + ${webrtc_SOURCE_DIR}/system_wrappers/source/metrics.cc +) + +if(WIN32) + target_sources(webrtc-lite PRIVATE + ${webrtc_SOURCE_DIR}/api/task_queue/default_task_queue_factory_stdlib.cc + ${webrtc_SOURCE_DIR}/rtc_base/task_queue_stdlib.cc + ${webrtc_SOURCE_DIR}/rtc_base/task_queue_stdlib.h + ${webrtc_SOURCE_DIR}/rtc_base/win32.cc + ${webrtc_SOURCE_DIR}/rtc_base/win32.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/rw_lock_win.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/rw_lock_win.h + ) + FILE(WRITE ${webrtc_SOURCE_DIR}/base/third_party/libevent/event.h + "#pragma once\n#include \n" + ) + target_link_libraries(webrtc-lite + ws2_32 + crypt32 + winmm + Secur32 + Iphlpapi + ) +else(WIN32) + target_sources(webrtc-lite PRIVATE + ${webrtc_SOURCE_DIR}/api/task_queue/default_task_queue_factory_stdlib.cc + ${webrtc_SOURCE_DIR}/rtc_base/task_queue_stdlib.cc + ${webrtc_SOURCE_DIR}/rtc_base/task_queue_stdlib.h + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/rw_lock_posix.cc + ${webrtc_SOURCE_DIR}/rtc_base/synchronization/rw_lock_posix.h + ${webrtc_SOURCE_DIR}/rtc_base/ifaddrs_converter.cc + ) + target_link_libraries(webrtc-lite + pthread + ) +endif(WIN32) + + +protobuf_generate_cpp(WEBRTC_LITE_PROTO_SRCS WEBRTC_LITE_PROTO_HDRS + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log.proto + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log2.proto +) + +target_compile_definitions(webrtc-lite PUBLIC WEBRTC_ENABLE_RTC_EVENT_LOG) +target_sources(webrtc-lite PRIVATE + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log.proto + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log2.proto + ${WEBRTC_LITE_PROTO_SRCS} ${WEBRTC_LITE_PROTO_HDRS} + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/blob_encoding.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/blob_encoding.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/delta_encoding.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/delta_encoding.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/var_int.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/var_int.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/rtc_event_log_encoder_common.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/rtc_event_log_encoder_common.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log_impl.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log_impl.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/rtc_event_log_encoder_legacy.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/rtc_event_log_encoder_legacy.cc + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.h + ${webrtc_SOURCE_DIR}/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.cc +) + +file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${webrtc_SOURCE_DIR}) +file(WRITE "${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log.pb.h" + "#pragma once\n#include \"steamwebrtc/rtc_event_log.pb.h\"\n" +) +file(WRITE "${webrtc_SOURCE_DIR}/logging/rtc_event_log/rtc_event_log2.pb.h" + "#pragma once\n#include \"steamwebrtc/rtc_event_log2.pb.h\"\n" +) +#file(COPY "${CMAKE_CURRENT_BINARY_DIR}/rtc_event_log.pb.h" DESTINATION "${webrtc_SOURCE_DIR}/logging/rtc_event_log") +#file(COPY "${CMAKE_CURRENT_BINARY_DIR}/rtc_event_log2.pb.h" DESTINATION "${webrtc_SOURCE_DIR}/logging/rtc_event_log") + +set_source_files_properties(${WEBRTC_LITE_PROTO_SRCS} ${WEBRTC_LITE_PROTO_HDRS} PROPERTIES GENERATED TRUE) + +# webrtc can't build as shared library. +#target_compile_definitions(webrtc-lite PUBLIC WEBRTC_ENABLE_SYMBOL_EXPORT) +#target_compile_definitions(webrtc-lite PRIVATE WEBRTC_LIBRARY_IMPL) + +target_link_directories(webrtc-lite PUBLIC + ${CONAN_ABSEIL_ROOT}/lib +) + +target_include_directories(webrtc-lite PUBLIC + ${webrtc_SOURCE_DIR} + ${webrtc_BUILD_DIR} + ${Protobuf_INCLUDE_DIRS} + ${CMAKE_CURRENT_BINARY_DIR}/.. + ${CMAKE_CURRENT_BINARY_DIR} +) + +target_link_libraries(webrtc-lite + #protobuf::libprotobuf + ${PROTOBUF_LIBRARIES} + OpenSSL::Crypto + OpenSSL::SSL + absl_time_zone + absl_time + absl_throw_delegate + absl_synchronization + absl_symbolize + absl_strings_internal + absl_strings + absl_str_format_internal + absl_status + absl_stacktrace + absl_spinlock_wait + absl_scoped_set_env + absl_raw_logging_internal + absl_raw_hash_set + absl_random_seed_sequences + absl_random_seed_gen_exception + absl_random_internal_seed_material + absl_random_internal_randen_slow + absl_random_internal_randen_hwaes_impl + absl_random_internal_randen_hwaes + absl_random_internal_randen + absl_random_internal_pool_urbg + absl_random_internal_distribution_test_util + absl_random_distributions + absl_periodic_sampler + absl_malloc_internal + absl_log_severity + absl_leak_check_disable + absl_leak_check + absl_int128 + absl_hashtablez_sampler + absl_hash + absl_graphcycles_internal + absl_flags_usage_internal + absl_flags_usage + absl_flags_registry + absl_flags_program_name + absl_flags_parse + absl_flags_marshalling + absl_flags_internal + absl_flags_config + absl_flags + absl_failure_signal_handler + absl_exponential_biased + absl_examine_stack + absl_dynamic_annotations + absl_demangle_internal + absl_debugging_internal + absl_cord + absl_civil_time + absl_city + absl_base + absl_bad_variant_access + absl_bad_optional_access + absl_bad_any_cast_impl +) + +set_target_properties(webrtc-lite PROPERTIES + CXX_STANDARD 14 +) + +set_property(TARGET webrtc-lite PROPERTY POSITION_INDEPENDENT_CODE ON) + +include_directories( + ${webrtc_SOURCE_DIR}/include/webrtc +) + +set(STEAMWEBRTC_BUILD_TYPE SHARED) + +if(STEAMWEBRTC_USE_STATIC_LIBS) + set(STEAMWEBRTC_BUILD_TYPE STATIC) +endif() + +add_library(steamwebrtc ${STEAMWEBRTC_BUILD_TYPE} + "ice_session.h" + "steamwebrtc_internal.h" + "ice_session.cpp" +) + +target_link_libraries(steamwebrtc + webrtc-lite +) + +set_target_properties(steamwebrtc PROPERTIES + CXX_STANDARD 14 +) + +check_symbol_exists(strcpy_s "string.h" HAVE_STRCPY_S) + +if(HAVE_STRCPY_S) + target_compile_definitions(steamwebrtc PRIVATE HAVE_STRCPY_S=1) +endif() + +set_property(TARGET steamwebrtc PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/src/external/steamwebrtc/ice_session.cpp b/src/external/steamwebrtc/ice_session.cpp index 7566fcd..790335b 100644 --- a/src/external/steamwebrtc/ice_session.cpp +++ b/src/external/steamwebrtc/ice_session.cpp @@ -3,31 +3,28 @@ #include "steamwebrtc_internal.h" #include +#include -#include "rtc_base.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#ifdef WEBRTC_ANDROID #include #include -#else -#include -#include -#endif #include -#include -#ifdef WEBRTC_ANDROID #include #include #include -#else -#include -#include -#include -#endif -#include +#include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -41,18 +38,11 @@ #define strncasecmp _strnicmp #endif -#ifdef WEBRTC_ANDROID -namespace rtc -{ - typedef int64_t PacketTime; -} -#endif - extern "C" { - extern void (*g_fnWriteEvent_setsockopt)( int slevel, int sopt, int value ); - extern void (*g_fnWriteEvent_send)( int length ); - extern void (*g_fnWriteEvent_sendto)( void *addr, int length ); + static void (*g_fnWriteEvent_setsockopt)( int slevel, int sopt, int value ) = nullptr; + static void (*g_fnWriteEvent_send)( int length ) = nullptr; + static void (*g_fnWriteEvent_sendto)( void *addr, int length ) = nullptr; } extern "C" @@ -103,6 +93,7 @@ private: bool m_bShuttingDown = false; IICESessionDelegate *m_pDelegate = nullptr; std::unique_ptr ice_transport_; + std::unique_ptr task_queue_factory; std::unique_ptr event_log_factory_; std::unique_ptr event_log_; std::unique_ptr default_network_manager_; @@ -120,7 +111,7 @@ private: rtc::PacketTransportInternal* transport, const char* data, size_t size, - const rtc::PacketTime& packet_time, + const int64_t& packet_time, int flags); void OnSentPacket(rtc::PacketTransportInternal* transport, const rtc::SentPacket& sent_packet); void OnReadyToSend(rtc::PacketTransportInternal* transport); @@ -157,7 +148,8 @@ rtc::PhysicalSocketServer *CICESession::s_pSocketServer = nullptr; // Constructor //----------------------------------------------------------------------------- CICESession::CICESession( IICESessionDelegate *pDelegate ) : - m_pDelegate( pDelegate ) + m_pDelegate( pDelegate ), + task_queue_factory(webrtc::CreateDefaultTaskQueueFactory()) { s_mutex.lock(); if ( ++s_nInstaneCount == 1 ) @@ -226,7 +218,7 @@ bool CICESession::BInitializeOnSocketThread( const ICESessionConfig &cfg ) m_nAllowedCandidateTypes = cfg.m_nCandidateTypes; - event_log_factory_ = webrtc::CreateRtcEventLogFactory(); + event_log_factory_ = absl::make_unique(task_queue_factory.get()); // Uhhhhhhh auto encoding_type = webrtc::RtcEventLog::EncodingType::Legacy; @@ -234,7 +226,7 @@ bool CICESession::BInitializeOnSocketThread( const ICESessionConfig &cfg ) // encoding_type = RtcEventLog::EncodingType::NewFormat; event_log_ = event_log_factory_ ? event_log_factory_->CreateRtcEventLog(encoding_type) - : absl::make_unique(); + : absl::make_unique(); default_network_manager_.reset(new rtc::BasicNetworkManager()); default_socket_factory_.reset( @@ -301,7 +293,44 @@ bool CICESession::BInitializeOnSocketThread( const ICESessionConfig &cfg ) std::vector turn_servers; if ( cfg.m_nCandidateTypes & (k_EICECandidate_Any_Reflexive|k_EICECandidate_Any_Relay) ) { - // FIXME list of turn servers here + candidate_filter |= cricket::CF_REFLEXIVE | cricket::CF_RELAY; + for ( int i = 0 ; i < cfg.m_nTurnServers ; ++i ) + { + const ICESessionConfig::TurnServer *pTurn = &cfg.m_pTurnServers[i]; + + if ( !pTurn || !pTurn->m_pszHost || !pTurn->m_pszPwd || !pTurn->m_pszUsername ) { + continue; + } + + const char *pszTurn = pTurn->m_pszHost; + + // Skip "turn:" prefix, if present + if ( strncasecmp( pszTurn, "turn:", 5 ) == 0 ) + pszTurn += 5; + + rtc::SocketAddress address; + if ( !address.FromString( std::string( pszTurn ) ) ) + { + m_pDelegate->Log( IICESessionDelegate::k_ELogPriorityError, "Invalid Turn server address '%s'\n", pszTurn ); + return false; + } + if ( address.port() == 0 ) + address.SetPort( 3478 ); // default STUN port + + switch( pTurn->m_protocolType ) { + case k_EProtocolTypeUDP: + case k_EProtocolTypeTCP: + case k_EProtocolTypeSSLTCP: + case k_EProtocolTypeTLS: + default: + m_pDelegate->Log( IICESessionDelegate::k_ELogPriorityError, "Invalid Turn server protocol type '%d'\n", (int) pTurn->m_protocolType ); + return false; + } + + cricket::RelayServerConfig turn(address.hostname(), address.port(), + pTurn->m_pszUsername, pTurn->m_pszPwd, (cricket::ProtocolType) pTurn->m_protocolType); + turn_servers.push_back( turn ); + } } port_allocator_->set_flags(port_allocator_flags_); @@ -559,7 +588,11 @@ bool CICESession::GetRoute( EICECandidateType &eLocalCandidate, EICECandidateTyp eLocalCandidate = GetICECandidateType( conn->local_candidate() ); eRemoteCandidate = GetICECandidateType( conn->remote_candidate() ); std::string remote_addr = conn->remote_candidate().address().ToString(); +#ifdef HAVE_STRCPY_S strcpy_s( szRemoteAddress, sizeof(CandidateAddressString), remote_addr.c_str() ); +#else + strncpy( szRemoteAddress, remote_addr.c_str(), std::min(sizeof(CandidateAddressString) -1, remote_addr.size()) ); +#endif return eLocalCandidate != k_EICECandidate_Invalid && eRemoteCandidate != k_EICECandidate_Invalid && szRemoteAddress[0] != '\0'; } @@ -612,7 +645,7 @@ void CICESession::OnReadPacket( rtc::PacketTransportInternal* transport, const char* data, size_t size, - const rtc::PacketTime& packet_time, + const int64_t& packet_time, int flags ) { m_pDelegate->OnData( data, size ); diff --git a/src/external/steamwebrtc/ice_session.h b/src/external/steamwebrtc/ice_session.h index 10a1293..7d2a560 100644 --- a/src/external/steamwebrtc/ice_session.h +++ b/src/external/steamwebrtc/ice_session.h @@ -40,6 +40,13 @@ enum EICECandidateType : int k_EICECandidate_IPv6_Reflexive = 0x800, }; +enum EProtocolType { + k_EProtocolTypeUDP, + k_EProtocolTypeTCP, + k_EProtocolTypeSSLTCP, // Pseudo-TLS. + k_EProtocolTypeTLS, +}; + constexpr int k_EICECandidate_Any_Relay = k_EICECandidate_IPv4_Relay | k_EICECandidate_IPv6_Relay; constexpr int k_EICECandidate_Any_HostPrivate = k_EICECandidate_IPv4_HostPrivate | k_EICECandidate_IPv6_HostPrivate_Unsupported; constexpr int k_EICECandidate_Any_HostPublic = k_EICECandidate_IPv4_HostPublic | k_EICECandidate_IPv6_HostPublic; @@ -122,6 +129,7 @@ struct ICESessionConfig const char *m_pszHost = nullptr; const char *m_pszUsername = nullptr; const char *m_pszPwd = nullptr; + const EProtocolType m_protocolType = k_EProtocolTypeUDP; }; EICERole m_eRole = k_EICERole_Unknown; diff --git a/src/external/steamwebrtc/steamwebrtc_internal.h b/src/external/steamwebrtc/steamwebrtc_internal.h index 3b575b7..d1d6021 100644 --- a/src/external/steamwebrtc/steamwebrtc_internal.h +++ b/src/external/steamwebrtc/steamwebrtc_internal.h @@ -1,13 +1,32 @@ //===================== Copyright (c) Valve Corporation. All Rights Reserved. ====================== #pragma once -#if defined(_WIN32) -# define STEAMWEBRTC_DECLSPEC __declspec(dllexport) -# else -# if defined(__GNUC__) && __GNUC__ >= 4 -# define STEAMWEBRTC_DECLSPEC __attribute__ ((visibility("default"))) +#if defined(STEAMWEBRTC_USE_STATIC_LIBS) +# define STEAMWEBRTC_DECLSPEC +#else +# if defined(_WIN32) +# define STEAMWEBRTC_DECLSPEC __declspec(dllexport) # else -# define STEAMWEBRTC_DECLSPEC +# if defined(__GNUC__) && __GNUC__ >= 4 +# define STEAMWEBRTC_DECLSPEC __attribute__ ((visibility("default"))) +# else +# define STEAMWEBRTC_DECLSPEC +# endif # endif #endif +#ifdef WIN32 +# define WEBRTC_WIN 1 +#elif __linux__ +# define WEBRTC_LINUX 1 +# define WEBRTC_POSIX 1 +#elif __APPLE__ +# include "TargetConditionals.h" +# if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR +# define WEBRTC_MAC 1 +# elif TARGET_OS_IPHONE +# define WEBRTC_MAC 1 +# else +# define WEBRTC_MAC 1 +# endif +#endif diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp index d788031..2261d4f 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp @@ -443,6 +443,9 @@ void CSteamNetworkConnectionP2P::CheckInitICE() return; } +#ifdef STEAMWEBRTC_USE_STATIC_LIBS + g_SteamNetworkingSockets_CreateICESessionFunc = (CreateICESession_t)CreateWebRTCICESession; +#else // No ICE factory? if ( !g_SteamNetworkingSockets_CreateICESessionFunc ) { @@ -454,18 +457,41 @@ void CSteamNetworkConnectionP2P::CheckInitICE() tried = true; SteamDatagramTransportLock::SetLongLockWarningThresholdMS( "LoadICEDll", 500 ); + #if defined( _WIN32 ) HMODULE h = ::LoadLibraryA( "steamwebrtc.dll" ); if ( h != NULL ) { g_SteamNetworkingSockets_CreateICESessionFunc = (CreateICESession_t)::GetProcAddress( h, "CreateWebRTCICESession" ); } - //#elif defined( OSX ) || defined( IOS ) || defined( TVOS ) - // pszModule = "libsteamwebrtc.dylib"; - //#elif defined( LINUX ) || defined( ANDROID ) - // pszModule = "libsteamwebrtc.so"; - //#else - // #error Need steamwebrtc for this platform + #elif defined( OSX ) || defined( IOS ) || defined( TVOS ) + const char* pszModule = "libsteamwebrtc.dylib"; + void* h = dlopen(pszModule, RTLD_LAZY); + if ( h != NULL ) + { + g_SteamNetworkingSockets_CreateICESessionFunc = (CreateICESession_t)dlsym( h, "CreateWebRTCICESession" ); + } + if ( h == NULL ) + { + SteamNetworkingErrMsg errMsg; + V_sprintf_safe( errMsg, "ICE not enabled. Failed to open shared object : %s", dlerror() ); + ICEFailed( k_nICECloseCode_Local_NotCompiled, errMsg ); + } + #elif defined( LINUX ) || defined( ANDROID ) + const char* pszModule = "libsteamwebrtc.dylib"; + void* h = dlopen(pszModule, RTLD_LAZY); + if ( h != NULL ) + { + g_SteamNetworkingSockets_CreateICESessionFunc = (CreateICESession_t)dlsym( h, "CreateWebRTCICESession" ); + } + if ( h == NULL ) + { + SteamNetworkingErrMsg errMsg; + V_sprintf_safe( errMsg, "ICE not enabled. Failed to open shared object : %s", dlerror() ); + ICEFailed( k_nICECloseCode_Local_NotCompiled, errMsg ); + } + #else + #error Need steamwebrtc for this platform #endif } #endif @@ -475,6 +501,7 @@ void CSteamNetworkConnectionP2P::CheckInitICE() return; } } +#endif SteamNetworkingMicroseconds usecNow = SteamNetworkingSockets_GetLocalTimestamp();