From b8853ca8d351864a2396e0bdf677f61ad166a4b6 Mon Sep 17 00:00:00 2001 From: magjed Date: Tue, 29 Aug 2017 03:57:22 -0700 Subject: [PATCH] ObjC: Add support for injectable native audio and video codecs The native interface is added in the private file webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h. BUG=webrtc:8093 Review-Url: https://codereview.webrtc.org/3012443002 Cr-Commit-Position: refs/heads/master@{#19576} --- webrtc/sdk/BUILD.gn | 4 ++ .../RTCPeerConnectionFactory+Native.h | 49 ++++++++++++++ .../RTCPeerConnectionFactory.mm | 64 ++++++++++++++----- .../Headers/WebRTC/RTCPeerConnectionFactory.h | 3 +- 4 files changed, 101 insertions(+), 19 deletions(-) create mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index cf31fe97ac..77b9d39e8c 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -310,6 +310,7 @@ if (is_ios || is_mac) { rtc_static_library("peerconnectionfactory_objc") { sources = [ + "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm", "objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm", @@ -331,6 +332,8 @@ if (is_ios || is_mac) { ":videotoolbox_objc", ":videotracksource_objc", "../api:video_frame_api", + "../api/audio_codecs:builtin_audio_decoder_factory", + "../api/audio_codecs:builtin_audio_encoder_factory", "../api/video_codecs:video_codecs_api", "../media:rtc_audio_video", "../media:rtc_media_base", @@ -353,6 +356,7 @@ if (is_ios || is_mac) { defines = [ "HAVE_NO_MEDIA" ] sources = [ + "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm", ] diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h new file mode 100644 index 0000000000..fb3068aa8c --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h @@ -0,0 +1,49 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import "WebRTC/RTCPeerConnectionFactory.h" + +#include "webrtc/rtc_base/scoped_ref_ptr.h" + +namespace webrtc { + +class AudioEncoderFactory; +class AudioDecoderFactory; + +} // namespace webrtc + +namespace cricket { + +class WebRtcVideoEncoderFactory; +class WebRtcVideoDecoderFactory; + +} // namespace cricket + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class extension exposes methods that work directly with injectable C++ components. + */ +@interface RTCPeerConnectionFactory () + +/* Initialize object with injectable native audio/video encoder/decoder factories */ +- (instancetype)initWithNativeAudioEncoderFactory: + (rtc::scoped_refptr)audioEncoderFactory + nativeAudioDecoderFactory: + (rtc::scoped_refptr)audioDecoderFactory + nativeVideoEncoderFactory: + (nullable cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory + nativeVideoDecoderFactory: + (nullable cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm index dffacb69c9..48d788f192 100644 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm @@ -8,6 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ +#import "RTCPeerConnectionFactory+Native.h" #import "RTCPeerConnectionFactory+Private.h" #import "NSString+StdString.h" @@ -22,12 +23,16 @@ #import "WebRTC/RTCLogging.h" #import "WebRTC/RTCVideoCodecFactory.h" #ifndef HAVE_NO_MEDIA +#include "VideoToolbox/objc_video_decoder_factory.h" +#include "VideoToolbox/objc_video_encoder_factory.h" #import "WebRTC/RTCVideoCodecH264.h" +// The no-media version PeerConnectionFactory doesn't depend on these files, but the gn check tool +// is not smart enough to take the #ifdef into account. +#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" // nogncheck +#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" // nogncheck #endif #include "Video/objcvideotracksource.h" -#include "VideoToolbox/objc_video_decoder_factory.h" -#include "VideoToolbox/objc_video_encoder_factory.h" #include "webrtc/api/videosourceproxy.h" // Adding the nogncheck to disable the including header check. // The no-media version PeerConnectionFactory doesn't depend on media related @@ -47,15 +52,47 @@ - (instancetype)init { #ifdef HAVE_NO_MEDIA - return [self initWithEncoderFactory:nil decoderFactory:nil]; + return [self initWithNativeAudioEncoderFactory:nil + nativeAudioDecoderFactory:nil + nativeVideoEncoderFactory:nil + nativeVideoDecoderFactory:nil]; #else - return [self initWithEncoderFactory:[[RTCVideoEncoderFactoryH264 alloc] init] - decoderFactory:[[RTCVideoDecoderFactoryH264 alloc] init]]; + return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory() + nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory() + nativeVideoEncoderFactory:new webrtc::ObjCVideoEncoderFactory( + [[RTCVideoEncoderFactoryH264 alloc] init]) + nativeVideoDecoderFactory:new webrtc::ObjCVideoDecoderFactory( + [[RTCVideoDecoderFactoryH264 alloc] init])]; #endif } - (instancetype)initWithEncoderFactory:(nullable id)encoderFactory decoderFactory:(nullable id)decoderFactory { +#ifdef HAVE_NO_MEDIA + return [self initWithNativeAudioEncoderFactory:nil + nativeAudioDecoderFactory:nil + nativeVideoEncoderFactory:nil + nativeVideoDecoderFactory:nil]; +#else + cricket::WebRtcVideoEncoderFactory *native_encoder_factory = + encoderFactory ? new webrtc::ObjCVideoEncoderFactory(encoderFactory) : nullptr; + cricket::WebRtcVideoDecoderFactory *native_decoder_factory = + decoderFactory ? new webrtc::ObjCVideoDecoderFactory(decoderFactory) : nullptr; + return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory() + nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory() + nativeVideoEncoderFactory:native_encoder_factory + nativeVideoDecoderFactory:native_decoder_factory]; +#endif +} + +- (instancetype)initWithNativeAudioEncoderFactory: + (rtc::scoped_refptr)audioEncoderFactory + nativeAudioDecoderFactory: + (rtc::scoped_refptr)audioDecoderFactory + nativeVideoEncoderFactory: + (nullable cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory + nativeVideoDecoderFactory: + (nullable cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory { if (self = [super init]) { _networkThread = rtc::Thread::CreateWithSocketServer(); BOOL result = _networkThread->Start(); @@ -83,23 +120,16 @@ std::unique_ptr(), std::unique_ptr()); #else - cricket::WebRtcVideoEncoderFactory *platform_encoder_factory = nullptr; - cricket::WebRtcVideoDecoderFactory *platform_decoder_factory = nullptr; - if (encoderFactory) { - platform_encoder_factory = new webrtc::ObjCVideoEncoderFactory(encoderFactory); - } - if (decoderFactory) { - platform_decoder_factory = new webrtc::ObjCVideoDecoderFactory(decoderFactory); - } - // Ownership of encoder/decoder factories is passed on to the // peerconnectionfactory, that handles deleting them. _nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(), _workerThread.get(), _signalingThread.get(), - nullptr, - platform_encoder_factory, - platform_decoder_factory); + nullptr, // audio device module + audioEncoderFactory, + audioDecoderFactory, + videoEncoderFactory, + videoDecoderFactory); #endif NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); } diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h index c29b3c97e5..42acbfcd7e 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h @@ -35,8 +35,7 @@ RTC_EXPORT /* Initialize object with injectable video encoder/decoder factories */ - (instancetype)initWithEncoderFactory:(nullable id)encoderFactory - decoderFactory:(nullable id)decoderFactory - NS_DESIGNATED_INITIALIZER; + decoderFactory:(nullable id)decoderFactory; /** Initialize an RTCAudioSource with constraints. */ - (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints;