diff --git a/submodules/TelegramVoip/Sources/OngoingCallContext.swift b/submodules/TelegramVoip/Sources/OngoingCallContext.swift index 5b7943953e..103b0e7c37 100644 --- a/submodules/TelegramVoip/Sources/OngoingCallContext.swift +++ b/submodules/TelegramVoip/Sources/OngoingCallContext.swift @@ -514,11 +514,13 @@ public final class OngoingCallContext { } })) - self.signalingDataDisposable = (callSessionManager.callSignalingData(internalId: internalId) - |> deliverOn(self.queue)).start(next: { [weak self] data in - self?.withContext { context in - if let context = context as? OngoingCallThreadLocalContextWebrtc { - context.addSignaling(data) + self.signalingDataDisposable = (callSessionManager.callSignalingData(internalId: internalId)).start(next: { [weak self] data in + print("data received") + queue.async { + self?.withContext { context in + if let context = context as? OngoingCallThreadLocalContextWebrtc { + context.addSignaling(data) + } } } }) diff --git a/submodules/TgVoipWebrtc/Impl/CodecsApple.mm b/submodules/TgVoipWebrtc/Impl/CodecsApple.mm index a1656fca70..05312359d9 100644 --- a/submodules/TgVoipWebrtc/Impl/CodecsApple.mm +++ b/submodules/TgVoipWebrtc/Impl/CodecsApple.mm @@ -91,7 +91,7 @@ return nil; } - [_videoCapturer startCaptureWithDevice:frontCamera format:bestFormat fps:27]; + [_videoCapturer startCaptureWithDevice:frontCamera format:bestFormat fps:30]; } return self; } diff --git a/submodules/TgVoipWebrtc/Impl/Manager.cpp b/submodules/TgVoipWebrtc/Impl/Manager.cpp index bd329bb4a8..c7840430e9 100644 --- a/submodules/TgVoipWebrtc/Impl/Manager.cpp +++ b/submodules/TgVoipWebrtc/Impl/Manager.cpp @@ -51,13 +51,13 @@ Manager::~Manager() { void Manager::start() { auto weakThis = std::weak_ptr(shared_from_this()); - _networkManager.reset(new ThreadLocalObject(getNetworkThread(), [encryptionKey = _encryptionKey, enableP2P = _enableP2P, thread = _thread, weakThis]() { + _networkManager.reset(new ThreadLocalObject(getNetworkThread(), [encryptionKey = _encryptionKey, enableP2P = _enableP2P, thread = _thread, weakThis, signalingDataEmitted = _signalingDataEmitted]() { return new NetworkManager( getNetworkThread(), encryptionKey, enableP2P, [thread, weakThis](const NetworkManager::State &state) { - thread->Invoke(RTC_FROM_HERE, [weakThis, state]() { + thread->PostTask(RTC_FROM_HERE, [weakThis, state]() { auto strongThis = weakThis.lock(); if (strongThis == nullptr) { return; @@ -86,14 +86,8 @@ void Manager::start() { }); }); }, - [thread, weakThis](const std::vector &data) { - thread->PostTask(RTC_FROM_HERE, [weakThis, data]() { - auto strongThis = weakThis.lock(); - if (strongThis == nullptr) { - return; - } - strongThis->_signalingDataEmitted(data); - }); + [signalingDataEmitted](const std::vector &data) { + signalingDataEmitted(data); } ); })); diff --git a/submodules/TgVoipWebrtc/Impl/MediaManager.cpp b/submodules/TgVoipWebrtc/Impl/MediaManager.cpp index 9418e7a5e9..57b03fc0da 100644 --- a/submodules/TgVoipWebrtc/Impl/MediaManager.cpp +++ b/submodules/TgVoipWebrtc/Impl/MediaManager.cpp @@ -73,9 +73,6 @@ static std::vector AssignPayloadTypesAndDefaultCodecs(std:: input_formats.push_back(flexfec_format); }*/ - bool found = false; - bool useVP9 = true; - std::vector output_codecs; for (const webrtc::SdpVideoFormat& format : input_formats) { cricket::VideoCodec codec(format); @@ -83,19 +80,6 @@ static std::vector AssignPayloadTypesAndDefaultCodecs(std:: AddDefaultFeedbackParams(&codec); output_codecs.push_back(codec); - if (useVP9 && codec.name == cricket::kVp9CodecName) { - if (!found) { - outCodecId = codec.id; - found = true; - } - } - if (!useVP9 && codec.name == cricket::kH264CodecName) { - if (!found) { - outCodecId = codec.id; - found = true; - } - } - // Increment payload type. ++payload_type; if (payload_type > kLastDynamicPayloadType) { @@ -122,18 +106,24 @@ static std::vector AssignPayloadTypesAndDefaultCodecs(std:: static absl::optional selectVideoCodec(std::vector &codecs) { bool useVP9 = false; + bool useH265 = true; for (auto &codec : codecs) { if (useVP9) { if (codec.name == cricket::kVp9CodecName) { return absl::optional(codec); } + } else if (useH265) { + if (codec.name == cricket::kH265CodecName) { + return absl::optional(codec); + } } else { if (codec.name == cricket::kH264CodecName) { return absl::optional(codec); } } } + return absl::optional(); } @@ -210,7 +200,7 @@ _taskQueueFactory(webrtc::CreateDefaultTaskQueueFactory()) { const uint8_t opusMaxBitrateKbps = 32; const uint8_t opusStartBitrateKbps = 6; const uint8_t opusPTimeMs = 120; - const int opusExtensionSequence = 1; + const int extensionSequenceOne = 1; cricket::AudioCodec opusCodec(opusSdpPayload, opusSdpName, opusClockrate, opusSdpBitrate, opusSdpChannels); opusCodec.AddFeedbackParam(cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc)); @@ -222,7 +212,7 @@ _taskQueueFactory(webrtc::CreateDefaultTaskQueueFactory()) { cricket::AudioSendParameters audioSendPrameters; audioSendPrameters.codecs.push_back(opusCodec); - audioSendPrameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, opusExtensionSequence); + audioSendPrameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, extensionSequenceOne); audioSendPrameters.options.echo_cancellation = false; //audioSendPrameters.options.experimental_ns = false; audioSendPrameters.options.noise_suppression = false; @@ -237,7 +227,7 @@ _taskQueueFactory(webrtc::CreateDefaultTaskQueueFactory()) { cricket::AudioRecvParameters audioRecvParameters; audioRecvParameters.codecs.emplace_back(opusSdpPayload, opusSdpName, opusClockrate, opusSdpBitrate, opusSdpChannels); - audioRecvParameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, opusExtensionSequence); + audioRecvParameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, extensionSequenceOne); audioRecvParameters.rtcp.reduced_size = true; audioRecvParameters.rtcp.remote_estimate = true; _audioChannel->AddRecvStream(cricket::StreamParams::CreateLegacy(_ssrcAudio.incoming)); @@ -253,15 +243,14 @@ _taskQueueFactory(webrtc::CreateDefaultTaskQueueFactory()) { auto codec = videoCodec.value(); codec.SetParam(cricket::kCodecParamMinBitrate, 64); - codec.SetParam(cricket::kCodecParamStartBitrate, 256); + codec.SetParam(cricket::kCodecParamStartBitrate, 512); codec.SetParam(cricket::kCodecParamMaxBitrate, 2500); _videoCapturer = makeVideoCapturer(_nativeVideoSource); cricket::VideoSendParameters videoSendParameters; videoSendParameters.codecs.push_back(codec); - const int videoExtensionSequence = 1; - videoSendParameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, videoExtensionSequence); + videoSendParameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, extensionSequenceOne); //send_parameters.max_bandwidth_bps = 800000; //send_parameters.rtcp.reduced_size = true; videoSendParameters.rtcp.remote_estimate = true; @@ -273,7 +262,7 @@ _taskQueueFactory(webrtc::CreateDefaultTaskQueueFactory()) { cricket::VideoRecvParameters videoRecvParameters; videoRecvParameters.codecs.emplace_back(codec); - videoRecvParameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, videoExtensionSequence); + videoRecvParameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, extensionSequenceOne); //recv_parameters.rtcp.reduced_size = true; videoRecvParameters.rtcp.remote_estimate = true; _videoChannel->AddRecvStream(cricket::StreamParams::CreateLegacy(_ssrcVideo.incoming)); diff --git a/submodules/TgVoipWebrtc/Impl/ThreadLocalObject.h b/submodules/TgVoipWebrtc/Impl/ThreadLocalObject.h index a8c4bf031d..fbaee62e2d 100644 --- a/submodules/TgVoipWebrtc/Impl/ThreadLocalObject.h +++ b/submodules/TgVoipWebrtc/Impl/ThreadLocalObject.h @@ -21,48 +21,31 @@ private: public: ThreadLocalObject(rtc::Thread *thread, std::function generator) : - _thread(thread) { + _thread(thread), + _valueHolder(new ThreadLocalObject::ValueHolder()) { assert(_thread != nullptr); - _valueHolder = new ThreadLocalObject::ValueHolder(); - //ValueHolder *valueHolder = _valueHolder; - _thread->Invoke(RTC_FROM_HERE, [this, generator](){ - this->_valueHolder->_value.reset(generator()); + _thread->PostTask(RTC_FROM_HERE, [valueHolder = _valueHolder, generator](){ + valueHolder->_value.reset(generator()); }); } ~ThreadLocalObject() { - ValueHolder *valueHolder = _valueHolder; - _thread->Invoke(RTC_FROM_HERE, [this](){ - this->_valueHolder->_value.reset(); + _thread->PostTask(RTC_FROM_HERE, [valueHolder = _valueHolder](){ + valueHolder->_value.reset(); }); - delete valueHolder; } template void perform(FunctorT&& functor) { - //ValueHolder *valueHolder = _valueHolder; - /*_thread->PostTask(RTC_FROM_HERE, [valueHolder, f = std::forward>(f)](){ - T *value = valueHolder->_value; - assert(value != nullptr); - f(*value); - });*/ - _thread->Invoke(RTC_FROM_HERE, [this, f = std::forward(functor)](){ - assert(_valueHolder->_value != nullptr); - f(_valueHolder->_value.get()); - }); - } - - template - void performSync(FunctorT&& functor) { - _thread->Invoke(RTC_FROM_HERE, [this, f = std::forward(functor)](){ - assert(_valueHolder->_value != nullptr); - f(_valueHolder->_value.get()); + _thread->PostTask(RTC_FROM_HERE, [valueHolder = _valueHolder, f = std::forward(functor)](){ + assert(valueHolder->_value != nullptr); + f(valueHolder->_value.get()); }); } private: rtc::Thread *_thread; - ValueHolder *_valueHolder; + std::shared_ptr> _valueHolder; }; #ifdef TGVOIP_NAMESPACE diff --git a/third-party/webrtc/build-webrtc-bazel.sh b/third-party/webrtc/build-webrtc-bazel.sh index 0e076ccb1d..8974ad0823 100755 --- a/third-party/webrtc/build-webrtc-bazel.sh +++ b/third-party/webrtc/build-webrtc-bazel.sh @@ -23,7 +23,7 @@ if [ "$ARCH" == "x64" ]; then OUT_DIR="ios_sim" fi -gn gen out/$OUT_DIR --args="use_xcode_clang=true "" target_cpu=\"$ARCH\""' target_os="ios" is_debug=false is_component_build=false rtc_include_tests=false use_rtti=true rtc_use_x11=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_build_ssl=false rtc_build_examples=false rtc_build_tools=false ios_deployment_target="9.0" ios_enable_code_signing=false is_unsafe_developer_build=false rtc_enable_protobuf=false rtc_include_builtin_video_codecs=true rtc_build_libvpx=true rtc_libvpx_build_vp9=true rtc_use_gtk=false rtc_use_metal_rendering=true rtc_ssl_root="//openssl"' +gn gen out/$OUT_DIR --args="use_xcode_clang=true "" target_cpu=\"$ARCH\""' target_os="ios" is_debug=false is_component_build=false rtc_include_tests=false use_rtti=true rtc_use_x11=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_build_ssl=false rtc_build_examples=false rtc_build_tools=false ios_deployment_target="9.0" ios_enable_code_signing=false is_unsafe_developer_build=false rtc_enable_protobuf=false rtc_include_builtin_video_codecs=true rtc_build_libvpx=true rtc_libvpx_build_vp9=true rtc_use_gtk=false rtc_use_metal_rendering=true' ninja -C out/$OUT_DIR framework_objc_static popd diff --git a/third-party/webrtc/build-webrtc-buck.sh b/third-party/webrtc/build-webrtc-buck.sh index 8859551f05..16b7c82078 100755 --- a/third-party/webrtc/build-webrtc-buck.sh +++ b/third-party/webrtc/build-webrtc-buck.sh @@ -27,7 +27,7 @@ if [ "$ARCH" == "x64" ]; then OUT_DIR="ios_sim" fi -buildtools/mac/gn gen out/$OUT_DIR --args="use_xcode_clang=true "" target_cpu=\"$ARCH\""' target_os="ios" is_debug=false is_component_build=false rtc_include_tests=false use_rtti=true rtc_use_x11=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_build_ssl=false rtc_build_examples=false rtc_build_tools=false ios_deployment_target="9.0" ios_enable_code_signing=false is_unsafe_developer_build=false rtc_enable_protobuf=false rtc_include_builtin_video_codecs=true rtc_build_libvpx=true rtc_libvpx_build_vp9=true rtc_use_gtk=false rtc_use_metal_rendering=true rtc_ssl_root="//openssl"' +buildtools/mac/gn gen out/$OUT_DIR --args="use_xcode_clang=true "" target_cpu=\"$ARCH\""' target_os="ios" is_debug=false is_component_build=false rtc_include_tests=false use_rtti=true rtc_use_x11=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_build_ssl=false rtc_build_examples=false rtc_build_tools=false ios_deployment_target="9.0" ios_enable_code_signing=false is_unsafe_developer_build=false rtc_enable_protobuf=false rtc_include_builtin_video_codecs=true rtc_build_libvpx=true rtc_libvpx_build_vp9=true rtc_use_gtk=false rtc_use_metal_rendering=true' ninja -C out/$OUT_DIR framework_objc_static popd diff --git a/third-party/webrtc/webrtc-ios b/third-party/webrtc/webrtc-ios index 625c777c8a..cf2c8a8364 160000 --- a/third-party/webrtc/webrtc-ios +++ b/third-party/webrtc/webrtc-ios @@ -1 +1 @@ -Subproject commit 625c777c8ad260cbc4bf9a6409d5b4382d92914b +Subproject commit cf2c8a8364b4cfda7ea9eb448671033351851130