diff --git a/submodules/TgVoipWebrtc/Impl/MediaEngineWebrtc.mm b/submodules/TgVoipWebrtc/Impl/MediaEngineWebrtc.mm index d72078c985..5f82c6cf31 100644 --- a/submodules/TgVoipWebrtc/Impl/MediaEngineWebrtc.mm +++ b/submodules/TgVoipWebrtc/Impl/MediaEngineWebrtc.mm @@ -18,6 +18,8 @@ #include "sdk/objc/components/video_codec/RTCVideoEncoderFactoryH264.h" #include "sdk/objc/components/video_codec/RTCVideoDecoderFactoryH264.h" +#include "sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h" +#include "sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h" #include "sdk/objc/native/api/video_encoder_factory.h" #include "sdk/objc/native/api/video_decoder_factory.h" @@ -67,7 +69,7 @@ static void AddDefaultFeedbackParams(cricket::VideoCodec* codec) { } } -static std::vector AssignPayloadTypesAndDefaultCodecs(std::vector input_formats) { +static std::vector AssignPayloadTypesAndDefaultCodecs(std::vector input_formats, int32_t &outCodecId) { if (input_formats.empty()) return std::vector(); static const int kFirstDynamicPayloadType = 96; @@ -94,6 +96,13 @@ static std::vector AssignPayloadTypesAndDefaultCodecs(std:: codec.id = payload_type; AddDefaultFeedbackParams(&codec); output_codecs.push_back(codec); + + if (codec.name == cricket::kVp9CodecName) { + //outCodecId = codec.id; + } + if (codec.name == cricket::kH264CodecName) { + outCodecId = codec.id; + } // Increment payload type. ++payload_type; @@ -143,11 +152,13 @@ MediaEngineWebrtc::MediaEngineWebrtc(bool outgoing, bool send, bool recv) media_deps.audio_encoder_factory = webrtc::CreateAudioEncoderFactory(); media_deps.audio_decoder_factory = webrtc::CreateAudioDecoderFactory(); - auto video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory([[RTCVideoEncoderFactoryH264 alloc] init]); - std::vector videoCodecs = AssignPayloadTypesAndDefaultCodecs(video_encoder_factory->GetSupportedFormats()); + //auto video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory([[RTCVideoEncoderFactoryH264 alloc] init]); + auto video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory([[RTCDefaultVideoEncoderFactory alloc] init]); + int32_t outCodecId = 96; + std::vector videoCodecs = AssignPayloadTypesAndDefaultCodecs(video_encoder_factory->GetSupportedFormats(), outCodecId); - media_deps.video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory([[RTCVideoEncoderFactoryH264 alloc] init]); - media_deps.video_decoder_factory = webrtc::ObjCToNativeVideoDecoderFactory([[RTCVideoDecoderFactoryH264 alloc] init]); + media_deps.video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory([[RTCDefaultVideoEncoderFactory alloc] init]); + media_deps.video_decoder_factory = webrtc::ObjCToNativeVideoDecoderFactory([[RTCDefaultVideoDecoderFactory alloc] init]); media_deps.audio_processing = webrtc::AudioProcessingBuilder().Create(); media_engine = cricket::CreateMediaEngine(std::move(media_deps)); @@ -169,17 +180,18 @@ MediaEngineWebrtc::MediaEngineWebrtc(bool outgoing, bool send, bool recv) voice_channel->OnReadyToSend(true); voice_channel->SetSend(true); } + if (send) { video_channel->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc_send_video)); for (auto codec : videoCodecs) { - if (codec.id == 96 && codec.name == cricket::kH264CodecName) { + if (codec.id == outCodecId) { rtc::scoped_refptr objCVideoTrackSource(new rtc::RefCountedObject()); _nativeVideoSource = webrtc::VideoTrackSourceProxy::Create(signaling_thread.get(), worker_thread.get(), objCVideoTrackSource); codec.SetParam(cricket::kCodecParamMinBitrate, 32); - codec.SetParam(cricket::kCodecParamStartBitrate, 300); - codec.SetParam(cricket::kCodecParamMaxBitrate, 1000); + codec.SetParam(cricket::kCodecParamStartBitrate, 100); + codec.SetParam(cricket::kCodecParamMaxBitrate, 1500); #if TARGET_IPHONE_SIMULATOR #else @@ -244,7 +256,7 @@ MediaEngineWebrtc::MediaEngineWebrtc(bool outgoing, bool send, bool recv) //send_parameters.options.typing_detection = false; //send_parameters.max_bandwidth_bps = 800000; //send_parameters.rtcp.reduced_size = true; - //send_parameters.rtcp.remote_estimate = true; + send_parameters.rtcp.remote_estimate = true; video_channel->SetSendParameters(send_parameters); video_channel->SetVideoSend(ssrc_send_video, NULL, _nativeVideoSource.get()); @@ -269,7 +281,7 @@ MediaEngineWebrtc::MediaEngineWebrtc(bool outgoing, bool send, bool recv) } if (recv) { for (auto codec : videoCodecs) { - if (codec.id == 96 && codec.name == cricket::kH264CodecName) { + if (codec.id == outCodecId) { codec.SetParam(cricket::kCodecParamMinBitrate, 32); codec.SetParam(cricket::kCodecParamStartBitrate, 300); codec.SetParam(cricket::kCodecParamMaxBitrate, 1000); @@ -278,7 +290,7 @@ MediaEngineWebrtc::MediaEngineWebrtc(bool outgoing, bool send, bool recv) recv_parameters.codecs.emplace_back(codec); recv_parameters.extensions.emplace_back(webrtc::RtpExtension::kTransportSequenceNumberUri, extension_sequence); //recv_parameters.rtcp.reduced_size = true; - //recv_parameters.rtcp.remote_estimate = true; + recv_parameters.rtcp.remote_estimate = true; video_channel->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc_recv_video)); video_channel->SetRecvParameters(recv_parameters); diff --git a/third-party/webrtc/build-webrtc-bazel.sh b/third-party/webrtc/build-webrtc-bazel.sh index 2a9fbebdfe..a0cb411e82 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=true 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_include_builtin_video_codecs=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=false 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=true 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"' ninja -C out/$OUT_DIR framework_objc_static popd