diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 27fb4adada..e445cdc90f 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -1066,6 +1066,7 @@ if (is_ios || is_mac) { ":videotoolbox_objc", "../api:dtmf_sender_interface", "../api:enable_media", + "../api:field_trials_view", "../api:libjingle_peerconnection_api", "../api:media_stream_interface", "../api:rtc_event_log_output_file", @@ -1075,6 +1076,7 @@ if (is_ios || is_mac) { "../api:scoped_refptr", "../api/audio:audio_device", "../api/audio:audio_processing", + "../api/audio:builtin_audio_processing_builder", "../api/audio_codecs:audio_codecs_api", "../api/audio_codecs:builtin_audio_decoder_factory", "../api/audio_codecs:builtin_audio_encoder_factory", @@ -1091,7 +1093,6 @@ if (is_ios || is_mac) { "../common_video", "../media:media_constants", "../media:rtc_media_base", - "../modules/audio_processing", "../modules/video_coding:video_codec_interface", "../pc:peer_connection_factory", "../pc:webrtc_sdp", diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory+Native.h b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory+Native.h index 52b99ff6ab..8a49d03525 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory+Native.h +++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory+Native.h @@ -14,17 +14,12 @@ #include "api/audio/audio_processing.h" #include "api/audio_codecs/audio_decoder_factory.h" #include "api/audio_codecs/audio_encoder_factory.h" +#include "api/peer_connection_interface.h" #include "api/scoped_refptr.h" #include "api/transport/network_control.h" #include "api/video_codecs/video_decoder_factory.h" #include "api/video_codecs/video_encoder_factory.h" -namespace webrtc { - -struct PeerConnectionDependencies; - -} // namespace webrtc - NS_ASSUME_NONNULL_BEGIN /** @@ -33,11 +28,13 @@ NS_ASSUME_NONNULL_BEGIN @interface RTC_OBJC_TYPE (RTCPeerConnectionFactory) () - - (instancetype)initNative NS_DESIGNATED_INITIALIZER; - /* Initializer used when WebRTC is compiled with no media support */ - (instancetype)initWithNoMedia; +/* Initialize object with provided dependencies and with media support. */ +- (instancetype)initWithMediaAndDependencies: + (webrtc::PeerConnectionFactoryDependencies)dependencies; + /* Initialize object with injectable native audio/video encoder/decoder factories */ - (instancetype)initWithNativeAudioEncoderFactory: (rtc::scoped_refptr)audioEncoderFactory diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm index 826561c267..fa1a024716 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm +++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm @@ -29,10 +29,10 @@ #include "rtc_base/checks.h" #include "sdk/objc/native/api/network_monitor_factory.h" #include "sdk/objc/native/api/ssl_certificate_verifier.h" -#include "system_wrappers/include/field_trial.h" #include "api/audio/audio_device.h" #include "api/audio/audio_processing.h" +#include "api/audio/builtin_audio_processing_builder.h" #include "api/audio_codecs/builtin_audio_decoder_factory.h" #include "api/audio_codecs/builtin_audio_encoder_factory.h" #include "api/enable_media.h" @@ -71,15 +71,15 @@ } - (instancetype)init { - return [self - initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory() - nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory() - nativeVideoEncoderFactory:webrtc::ObjCToNativeVideoEncoderFactory([[RTC_OBJC_TYPE( - RTCVideoEncoderFactoryH264) alloc] init]) - nativeVideoDecoderFactory:webrtc::ObjCToNativeVideoDecoderFactory([[RTC_OBJC_TYPE( - RTCVideoDecoderFactoryH264) alloc] init]) - audioDeviceModule:[self audioDeviceModule].get() - audioProcessingModule:nullptr]; + webrtc::PeerConnectionFactoryDependencies dependencies; + dependencies.audio_encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory(); + dependencies.audio_decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory(); + dependencies.video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory( + [[RTC_OBJC_TYPE(RTCVideoEncoderFactoryH264) alloc] init]); + dependencies.video_decoder_factory = webrtc::ObjCToNativeVideoDecoderFactory( + [[RTC_OBJC_TYPE(RTCVideoDecoderFactoryH264) alloc] init]); + dependencies.adm = [self audioDeviceModule]; + return [self initWithMediaAndDependencies:std::move(dependencies)]; } - (instancetype) @@ -95,30 +95,25 @@ #ifdef HAVE_NO_MEDIA return [self initWithNoMedia]; #else - std::unique_ptr native_encoder_factory; - std::unique_ptr native_decoder_factory; + webrtc::PeerConnectionFactoryDependencies dependencies; + dependencies.audio_encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory(); + dependencies.audio_decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory(); if (encoderFactory) { - native_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory(encoderFactory); + dependencies.video_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory(encoderFactory); } if (decoderFactory) { - native_decoder_factory = webrtc::ObjCToNativeVideoDecoderFactory(decoderFactory); + dependencies.video_decoder_factory = webrtc::ObjCToNativeVideoDecoderFactory(decoderFactory); } - rtc::scoped_refptr audio_device_module; if (audioDevice) { - audio_device_module = webrtc::CreateAudioDeviceModule(audioDevice); + dependencies.adm = webrtc::CreateAudioDeviceModule(audioDevice); } else { - audio_device_module = [self audioDeviceModule]; + dependencies.adm = [self audioDeviceModule]; } - return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory() - nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory() - nativeVideoEncoderFactory:std::move(native_encoder_factory) - nativeVideoDecoderFactory:std::move(native_decoder_factory) - audioDeviceModule:audio_device_module.get() - audioProcessingModule:nullptr]; + return [self initWithMediaAndDependencies:std::move(dependencies)]; #endif } -- (instancetype)initNative { +- (instancetype)initWithNativeDependencies:(webrtc::PeerConnectionFactoryDependencies)dependencies { self = [super init]; if (self) { _networkThread = rtc::Thread::CreateWithSocketServer(); @@ -135,24 +130,27 @@ _signalingThread->SetName("signaling_thread", _signalingThread.get()); result = _signalingThread->Start(); RTC_DCHECK(result) << "Failed to start signaling thread."; + + // Set fields that are relevant both to 'no media' and 'with media' scenarios. + dependencies.network_thread = _networkThread.get(); + dependencies.worker_thread = _workerThread.get(); + dependencies.signaling_thread = _signalingThread.get(); + if (dependencies.trials == nullptr) { + dependencies.trials = std::make_unique(); + } + if (dependencies.network_monitor_factory == nullptr && + dependencies.trials->IsEnabled("WebRTC-Network-UseNWPathMonitor")) { + dependencies.network_monitor_factory = webrtc::CreateNetworkMonitorFactory(); + } + + _nativeFactory = webrtc::CreateModularPeerConnectionFactory(std::move(dependencies)); + NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); } return self; } - (instancetype)initWithNoMedia { - self = [self initNative]; - if (self) { - webrtc::PeerConnectionFactoryDependencies dependencies; - dependencies.network_thread = _networkThread.get(); - dependencies.worker_thread = _workerThread.get(); - dependencies.signaling_thread = _signalingThread.get(); - if (webrtc::field_trial::IsEnabled("WebRTC-Network-UseNWPathMonitor")) { - dependencies.network_monitor_factory = webrtc::CreateNetworkMonitorFactory(); - } - _nativeFactory = webrtc::CreateModularPeerConnectionFactory(std::move(dependencies)); - NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); - } - return self; + return [self initWithNativeDependencies:webrtc::PeerConnectionFactoryDependencies()]; } - (instancetype)initWithNativeAudioEncoderFactory: @@ -166,14 +164,18 @@ audioDeviceModule:(webrtc::AudioDeviceModule *)audioDeviceModule audioProcessingModule: (rtc::scoped_refptr)audioProcessingModule { - return [self initWithNativeAudioEncoderFactory:audioEncoderFactory - nativeAudioDecoderFactory:audioDecoderFactory - nativeVideoEncoderFactory:std::move(videoEncoderFactory) - nativeVideoDecoderFactory:std::move(videoDecoderFactory) - audioDeviceModule:audioDeviceModule - audioProcessingModule:audioProcessingModule - networkControllerFactory:nullptr]; + webrtc::PeerConnectionFactoryDependencies dependencies; + dependencies.audio_encoder_factory = std::move(audioEncoderFactory); + dependencies.audio_decoder_factory = std::move(audioDecoderFactory); + dependencies.video_encoder_factory = std::move(videoEncoderFactory); + dependencies.video_decoder_factory = std::move(videoDecoderFactory); + dependencies.adm = std::move(audioDeviceModule); + if (audioProcessingModule != nullptr) { + dependencies.audio_processing_builder = CustomAudioProcessing(std::move(audioProcessingModule)); + } + return [self initWithMediaAndDependencies:std::move(dependencies)]; } + - (instancetype)initWithNativeAudioEncoderFactory: (rtc::scoped_refptr)audioEncoderFactory nativeAudioDecoderFactory: @@ -188,35 +190,34 @@ networkControllerFactory: (std::unique_ptr) networkControllerFactory { - self = [self initNative]; - if (self) { - webrtc::PeerConnectionFactoryDependencies dependencies; - dependencies.network_thread = _networkThread.get(); - dependencies.worker_thread = _workerThread.get(); - dependencies.signaling_thread = _signalingThread.get(); - if (webrtc::field_trial::IsEnabled("WebRTC-Network-UseNWPathMonitor")) { - dependencies.network_monitor_factory = webrtc::CreateNetworkMonitorFactory(); - } - dependencies.trials = std::make_unique(); - dependencies.task_queue_factory = - webrtc::CreateDefaultTaskQueueFactory(dependencies.trials.get()); - dependencies.adm = std::move(audioDeviceModule); - dependencies.audio_encoder_factory = std::move(audioEncoderFactory); - dependencies.audio_decoder_factory = std::move(audioDecoderFactory); - dependencies.video_encoder_factory = std::move(videoEncoderFactory); - dependencies.video_decoder_factory = std::move(videoDecoderFactory); - if (audioProcessingModule) { - dependencies.audio_processing = std::move(audioProcessingModule); - } else { - dependencies.audio_processing = webrtc::AudioProcessingBuilder().Create(); - } - webrtc::EnableMedia(dependencies); - dependencies.event_log_factory = std::make_unique(); - dependencies.network_controller_factory = std::move(networkControllerFactory); - _nativeFactory = webrtc::CreateModularPeerConnectionFactory(std::move(dependencies)); - NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); + webrtc::PeerConnectionFactoryDependencies dependencies; + dependencies.adm = std::move(audioDeviceModule); + dependencies.audio_encoder_factory = std::move(audioEncoderFactory); + dependencies.audio_decoder_factory = std::move(audioDecoderFactory); + dependencies.video_encoder_factory = std::move(videoEncoderFactory); + dependencies.video_decoder_factory = std::move(videoDecoderFactory); + if (audioProcessingModule != nullptr) { + dependencies.audio_processing_builder = CustomAudioProcessing(std::move(audioProcessingModule)); } - return self; + dependencies.network_controller_factory = std::move(networkControllerFactory); + return [self initWithMediaAndDependencies:std::move(dependencies)]; +} + +- (instancetype)initWithMediaAndDependencies: + (webrtc::PeerConnectionFactoryDependencies)dependencies { + // audio_processing_builder should be used instead in new code. + RTC_CHECK(dependencies.audio_processing == nullptr); +#ifndef WEBRTC_EXCLUDE_AUDIO_PROCESSING_MODULE + if (dependencies.audio_processing_builder == nullptr) { + dependencies.audio_processing_builder = + std::make_unique(); + } +#endif + if (dependencies.event_log_factory == nullptr) { + dependencies.event_log_factory = std::make_unique(); + } + webrtc::EnableMedia(dependencies); + return [self initWithNativeDependencies:std::move(dependencies)]; } - (RTC_OBJC_TYPE(RTCRtpCapabilities) *)rtpSenderCapabilitiesForKind:(NSString *)kind { diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.h b/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.h index 64c2be35b2..5902ac3cd8 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.h +++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.h @@ -14,6 +14,7 @@ #include "api/audio/audio_processing.h" #include "api/audio_codecs/audio_decoder_factory.h" #include "api/audio_codecs/audio_encoder_factory.h" +#include "api/field_trials_view.h" #include "api/scoped_refptr.h" #include "api/video_codecs/video_decoder_factory.h" #include "api/video_codecs/video_encoder_factory.h" @@ -26,6 +27,8 @@ NS_ASSUME_NONNULL_BEGIN - (RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)createPeerConnectionFactory; +- (void)setFieldTrials:(std::unique_ptr)fieldTrials; + - (void)setVideoEncoderFactory:(std::unique_ptr)videoEncoderFactory; - (void)setVideoDecoderFactory:(std::unique_ptr)videoDecoderFactory; @@ -38,6 +41,9 @@ NS_ASSUME_NONNULL_BEGIN - (void)setAudioProcessingModule:(rtc::scoped_refptr)audioProcessingModule; +- (void)setAudioProcessingBuilder: + (std::unique_ptr)audioProcessingBuilder; + @end NS_ASSUME_NONNULL_END diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm b/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm index 28ded10035..b3a9f8651a 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm +++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactoryBuilder.mm @@ -19,12 +19,7 @@ #include "api/video_codecs/video_encoder_factory.h" @implementation RTCPeerConnectionFactoryBuilder { - std::unique_ptr _videoEncoderFactory; - std::unique_ptr _videoDecoderFactory; - rtc::scoped_refptr _audioEncoderFactory; - rtc::scoped_refptr _audioDecoderFactory; - rtc::scoped_refptr _audioDeviceModule; - rtc::scoped_refptr _audioProcessingModule; + webrtc::PeerConnectionFactoryDependencies _dependencies; } + (RTCPeerConnectionFactoryBuilder *)builder { @@ -32,41 +27,44 @@ } - (RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)createPeerConnectionFactory { - RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory = - [RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc]; - return [factory initWithNativeAudioEncoderFactory:_audioEncoderFactory - nativeAudioDecoderFactory:_audioDecoderFactory - nativeVideoEncoderFactory:std::move(_videoEncoderFactory) - nativeVideoDecoderFactory:std::move(_videoDecoderFactory) - audioDeviceModule:_audioDeviceModule.get() - audioProcessingModule:_audioProcessingModule]; + return [[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] + initWithMediaAndDependencies:std::move(_dependencies)]; +} + +- (void)setFieldTrials:(std::unique_ptr)fieldTrials { + _dependencies.trials = std::move(fieldTrials); } - (void)setVideoEncoderFactory:(std::unique_ptr)videoEncoderFactory { - _videoEncoderFactory = std::move(videoEncoderFactory); + _dependencies.video_encoder_factory = std::move(videoEncoderFactory); } - (void)setVideoDecoderFactory:(std::unique_ptr)videoDecoderFactory { - _videoDecoderFactory = std::move(videoDecoderFactory); + _dependencies.video_decoder_factory = std::move(videoDecoderFactory); } - (void)setAudioEncoderFactory: (rtc::scoped_refptr)audioEncoderFactory { - _audioEncoderFactory = audioEncoderFactory; + _dependencies.audio_encoder_factory = std::move(audioEncoderFactory); } - (void)setAudioDecoderFactory: (rtc::scoped_refptr)audioDecoderFactory { - _audioDecoderFactory = audioDecoderFactory; + _dependencies.audio_decoder_factory = std::move(audioDecoderFactory); } - (void)setAudioDeviceModule:(rtc::scoped_refptr)audioDeviceModule { - _audioDeviceModule = audioDeviceModule; + _dependencies.adm = std::move(audioDeviceModule); } - (void)setAudioProcessingModule: (rtc::scoped_refptr)audioProcessingModule { - _audioProcessingModule = audioProcessingModule; + _dependencies.audio_processing_builder = CustomAudioProcessing(std::move(audioProcessingModule)); +} + +- (void)setAudioProcessingBuilder: + (std::unique_ptr)audioProcessingBuilder { + _dependencies.audio_processing_builder = std::move(audioProcessingBuilder); } @end diff --git a/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm b/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm index 807c5501db..9accfd855f 100644 --- a/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm +++ b/sdk/objc/unittests/RTCPeerConnectionFactoryBuilderTest.mm @@ -40,12 +40,7 @@ extern "C" { id factoryMock = OCMStrictClassMock([RTC_OBJC_TYPE(RTCPeerConnectionFactory) class]); OCMExpect([factoryMock alloc]).andReturn(factoryMock); RTC_UNUSED([[[[factoryMock expect] andReturn:factoryMock] ignoringNonObjectArgs] - initWithNativeAudioEncoderFactory:nullptr - nativeAudioDecoderFactory:nullptr - nativeVideoEncoderFactory:nullptr - nativeVideoDecoderFactory:nullptr - audioDeviceModule:nullptr - audioProcessingModule:nullptr]); + initWithMediaAndDependencies:webrtc::PeerConnectionFactoryDependencies()]); RTCPeerConnectionFactoryBuilder* builder = [[RTCPeerConnectionFactoryBuilder alloc] init]; RTC_OBJC_TYPE(RTCPeerConnectionFactory)* peerConnectionFactory = [builder createPeerConnectionFactory]; @@ -57,12 +52,7 @@ extern "C" { id factoryMock = OCMStrictClassMock([RTC_OBJC_TYPE(RTCPeerConnectionFactory) class]); OCMExpect([factoryMock alloc]).andReturn(factoryMock); RTC_UNUSED([[[[factoryMock expect] andReturn:factoryMock] ignoringNonObjectArgs] - initWithNativeAudioEncoderFactory:nullptr - nativeAudioDecoderFactory:nullptr - nativeVideoEncoderFactory:nullptr - nativeVideoDecoderFactory:nullptr - audioDeviceModule:nullptr - audioProcessingModule:nullptr]); + initWithMediaAndDependencies:webrtc::PeerConnectionFactoryDependencies()]); RTCPeerConnectionFactoryBuilder* builder = [RTCPeerConnectionFactoryBuilder defaultBuilder]; RTC_OBJC_TYPE(RTCPeerConnectionFactory)* peerConnectionFactory = [builder createPeerConnectionFactory];