diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 3809aa112c..33797ce29d 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -310,9 +310,15 @@ if (is_ios || is_mac) { rtc_static_library("objc_peerconnectionfactory") { sources = [ + "objc/Framework/Classes/PeerConnection/RTCBuiltinAudioDecoderFactory.mm", + "objc/Framework/Classes/PeerConnection/RTCBuiltinAudioEncoderFactory.mm", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm", "objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm", + "objc/Framework/Headers/WebRTC/RTCAudioDecoderFactory.h", + "objc/Framework/Headers/WebRTC/RTCAudioEncoderFactory.h", + "objc/Framework/Headers/WebRTC/RTCBuiltinAudioDecoderFactory.h", + "objc/Framework/Headers/WebRTC/RTCBuiltinAudioEncoderFactory.h", ] public_configs = [ ":objc_common_config" ] @@ -331,6 +337,8 @@ if (is_ios || is_mac) { ":objc_videotoolbox", ":objc_videotracksource", "../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", @@ -569,15 +577,16 @@ if (is_ios || is_mac) { ios_framework_bundle("objc_framework") { info_plist = "objc/Framework/Info.plist" output_name = "WebRTC" - common_objc_headers = [ - "objc/Framework/Headers/WebRTC/RTCAudioSession.h", - "objc/Framework/Headers/WebRTC/RTCVideoCodec.h", - "objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h", - "objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h", "objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h", + "objc/Framework/Headers/WebRTC/RTCAudioDecoderFactory.h", + "objc/Framework/Headers/WebRTC/RTCAudioEncoderFactory.h", + "objc/Framework/Headers/WebRTC/RTCAudioSession.h", + "objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h", "objc/Framework/Headers/WebRTC/RTCAudioSource.h", "objc/Framework/Headers/WebRTC/RTCAudioTrack.h", + "objc/Framework/Headers/WebRTC/RTCBuiltinAudioDecoderFactory.h", + "objc/Framework/Headers/WebRTC/RTCBuiltinAudioEncoderFactory.h", "objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h", "objc/Framework/Headers/WebRTC/RTCCameraPreviewView.h", "objc/Framework/Headers/WebRTC/RTCConfiguration.h", @@ -609,6 +618,8 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCSessionDescription.h", "objc/Framework/Headers/WebRTC/RTCTracing.h", "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h", + "objc/Framework/Headers/WebRTC/RTCVideoCodec.h", + "objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h", "objc/Framework/Headers/WebRTC/RTCVideoFrame.h", "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h", "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h", diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCBuiltinAudioDecoderFactory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCBuiltinAudioDecoderFactory.mm new file mode 100644 index 0000000000..e64fa09fd5 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCBuiltinAudioDecoderFactory.mm @@ -0,0 +1,27 @@ +/* + * 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/RTCBuiltinAudioDecoderFactory.h" + +#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" +#include "webrtc/rtc_base/scoped_ref_ptr.h" + +@implementation RTCBuiltinAudioDecoderFactory { + rtc::scoped_refptr _nativeAudioDecoderFactory; +} + +- (rtc::scoped_refptr)nativeAudioDecoderFactory { + if (_nativeAudioDecoderFactory == nullptr) { + _nativeAudioDecoderFactory = webrtc::CreateBuiltinAudioDecoderFactory(); + } + return _nativeAudioDecoderFactory; +} + +@end diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCBuiltinAudioEncoderFactory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCBuiltinAudioEncoderFactory.mm new file mode 100644 index 0000000000..0242c4ed75 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCBuiltinAudioEncoderFactory.mm @@ -0,0 +1,27 @@ +/* + * 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/RTCBuiltinAudioEncoderFactory.h" + +#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" +#include "webrtc/rtc_base/scoped_ref_ptr.h" + +@implementation RTCBuiltinAudioEncoderFactory { + rtc::scoped_refptr _nativeAudioEncoderFactory; +} + +- (rtc::scoped_refptr)nativeAudioEncoderFactory { + if (_nativeAudioEncoderFactory == nullptr) { + _nativeAudioEncoderFactory = webrtc::CreateBuiltinAudioEncoderFactory(); + } + return _nativeAudioEncoderFactory; +} + +@end diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm index dffacb69c9..20fa86d067 100644 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm @@ -19,9 +19,13 @@ #import "RTCPeerConnection+Private.h" #import "RTCVideoSource+Private.h" #import "RTCVideoTrack+Private.h" +#import "WebRTC/RTCAudioDecoderFactory.h" +#import "WebRTC/RTCAudioEncoderFactory.h" #import "WebRTC/RTCLogging.h" #import "WebRTC/RTCVideoCodecFactory.h" #ifndef HAVE_NO_MEDIA +#import "WebRTC/RTCBuiltinAudioDecoderFactory.h" +#import "WebRTC/RTCBuiltinAudioEncoderFactory.h" #import "WebRTC/RTCVideoCodecH264.h" #endif @@ -47,15 +51,22 @@ - (instancetype)init { #ifdef HAVE_NO_MEDIA - return [self initWithEncoderFactory:nil decoderFactory:nil]; + return [self initWithAudioEncoderFactory:nil + audioDecoderFactory:nil + videoEncoderFactory:nil + videoDecoderFactory:nil]; #else - return [self initWithEncoderFactory:[[RTCVideoEncoderFactoryH264 alloc] init] - decoderFactory:[[RTCVideoDecoderFactoryH264 alloc] init]]; + return [self initWithAudioEncoderFactory:[[RTCBuiltinAudioEncoderFactory alloc] init] + audioDecoderFactory:[[RTCBuiltinAudioDecoderFactory alloc] init] + videoEncoderFactory:[[RTCVideoEncoderFactoryH264 alloc] init] + videoDecoderFactory:[[RTCVideoDecoderFactoryH264 alloc] init]]; #endif } -- (instancetype)initWithEncoderFactory:(nullable id)encoderFactory - decoderFactory:(nullable id)decoderFactory { +- (instancetype)initWithAudioEncoderFactory:(id)audioEncoderFactory + audioDecoderFactory:(id)audioDecoderFactory + videoEncoderFactory:(id)videoEncoderFactory + videoDecoderFactory:(id)videoDecoderFactory { if (self = [super init]) { _networkThread = rtc::Thread::CreateWithSocketServer(); BOOL result = _networkThread->Start(); @@ -83,13 +94,21 @@ 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); + rtc::scoped_refptr platform_audio_encoder_factory = nullptr; + rtc::scoped_refptr platform_audio_decoder_factory = nullptr; + if (audioEncoderFactory) { + platform_audio_encoder_factory = [audioEncoderFactory nativeAudioEncoderFactory]; } - if (decoderFactory) { - platform_decoder_factory = new webrtc::ObjCVideoDecoderFactory(decoderFactory); + if (audioDecoderFactory) { + platform_audio_decoder_factory = [audioDecoderFactory nativeAudioDecoderFactory]; + } + cricket::WebRtcVideoEncoderFactory *platform_video_encoder_factory = nullptr; + cricket::WebRtcVideoDecoderFactory *platform_video_decoder_factory = nullptr; + if (videoEncoderFactory) { + platform_video_encoder_factory = new webrtc::ObjCVideoEncoderFactory(videoEncoderFactory); + } + if (videoDecoderFactory) { + platform_video_decoder_factory = new webrtc::ObjCVideoDecoderFactory(videoDecoderFactory); } // Ownership of encoder/decoder factories is passed on to the @@ -97,9 +116,11 @@ _nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(), _workerThread.get(), _signalingThread.get(), - nullptr, - platform_encoder_factory, - platform_decoder_factory); + nullptr, // audio device module + platform_audio_encoder_factory, + platform_audio_decoder_factory, + platform_video_encoder_factory, + platform_video_decoder_factory); #endif NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); } @@ -121,15 +142,12 @@ return [self audioTrackWithSource:audioSource trackId:trackId]; } -- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source - trackId:(NSString *)trackId { - return [[RTCAudioTrack alloc] initWithFactory:self - source:source - trackId:trackId]; +- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source trackId:(NSString *)trackId { + return [[RTCAudioTrack alloc] initWithFactory:self source:source trackId:trackId]; } - (RTCAVFoundationVideoSource *)avFoundationVideoSourceWithConstraints: - (nullable RTCMediaConstraints *)constraints { + (nullable RTCMediaConstraints *)constraints { #ifdef HAVE_NO_MEDIA return nil; #else @@ -146,32 +164,25 @@ objcVideoTrackSource)]; } -- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source - trackId:(NSString *)trackId { - return [[RTCVideoTrack alloc] initWithFactory:self - source:source - trackId:trackId]; +- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source trackId:(NSString *)trackId { + return [[RTCVideoTrack alloc] initWithFactory:self source:source trackId:trackId]; } - (RTCMediaStream *)mediaStreamWithStreamId:(NSString *)streamId { - return [[RTCMediaStream alloc] initWithFactory:self - streamId:streamId]; + return [[RTCMediaStream alloc] initWithFactory:self streamId:streamId]; } -- (RTCPeerConnection *)peerConnectionWithConfiguration: - (RTCConfiguration *)configuration - constraints: - (RTCMediaConstraints *)constraints +- (RTCPeerConnection *)peerConnectionWithConfiguration:(RTCConfiguration *)configuration + constraints:(RTCMediaConstraints *)constraints delegate: - (nullable id)delegate { + (nullable id)delegate { return [[RTCPeerConnection alloc] initWithFactory:self configuration:configuration constraints:constraints delegate:delegate]; } -- (BOOL)startAecDumpWithFilePath:(NSString *)filePath - maxSizeInBytes:(int64_t)maxSizeInBytes { +- (BOOL)startAecDumpWithFilePath:(NSString *)filePath maxSizeInBytes:(int64_t)maxSizeInBytes { RTC_DCHECK(filePath.length); RTC_DCHECK_GT(maxSizeInBytes, 0); diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioDecoderFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioDecoderFactory.h new file mode 100644 index 0000000000..b6ad6d1672 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioDecoderFactory.h @@ -0,0 +1,33 @@ +/* + * 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 + +namespace rtc +{ + template + class scoped_refptr; +}; + +namespace webrtc +{ + class AudioDecoderFactory; +}; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RTCAudioDecoderFactory + +@property(nonatomic, readonly) rtc::scoped_refptr + nativeAudioDecoderFactory; + +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioEncoderFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioEncoderFactory.h new file mode 100644 index 0000000000..956332ab3f --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioEncoderFactory.h @@ -0,0 +1,33 @@ +/* + * 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 + +namespace rtc +{ + template + class scoped_refptr; +}; + +namespace webrtc +{ + class AudioEncoderFactory; +}; + +NS_ASSUME_NONNULL_BEGIN + +@protocol RTCAudioEncoderFactory + +@property(nonatomic, readonly) rtc::scoped_refptr + nativeAudioEncoderFactory; + +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCBuiltinAudioDecoderFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCBuiltinAudioDecoderFactory.h new file mode 100644 index 0000000000..ba15c57615 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCBuiltinAudioDecoderFactory.h @@ -0,0 +1,20 @@ +/* + * 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 + +#import "WebRTC/RTCAudioDecoderFactory.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCBuiltinAudioDecoderFactory : NSObject +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCBuiltinAudioEncoderFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCBuiltinAudioEncoderFactory.h new file mode 100644 index 0000000000..979933d117 --- /dev/null +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCBuiltinAudioEncoderFactory.h @@ -0,0 +1,20 @@ +/* + * 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 + +#import "WebRTC/RTCAudioEncoderFactory.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCBuiltinAudioEncoderFactory : NSObject +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h index c29b3c97e5..634e1ca86e 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h @@ -23,6 +23,8 @@ NS_ASSUME_NONNULL_BEGIN @class RTCPeerConnection; @class RTCVideoSource; @class RTCVideoTrack; +@protocol RTCAudioEncoderFactory; +@protocol RTCAudioDecoderFactory; @protocol RTCPeerConnectionDelegate; @protocol RTCVideoDecoderFactory; @protocol RTCVideoEncoderFactory; @@ -30,38 +32,40 @@ NS_ASSUME_NONNULL_BEGIN RTC_EXPORT @interface RTCPeerConnectionFactory : NSObject -/* Initialize object with default H264 video encoder/decoder factories */ +/* Initialize object with default audio and H264 video encoder/decoder factories + */ - (instancetype)init; -/* Initialize object with injectable video encoder/decoder factories */ -- (instancetype)initWithEncoderFactory:(nullable id)encoderFactory - decoderFactory:(nullable id)decoderFactory +/* Initialize object with injectable audio/video encoder/decoder factories */ +- (instancetype)initWithAudioEncoderFactory:(nullable id)audioEncoderFactory + audioDecoderFactory:(nullable id)audioDecoderFactory + videoEncoderFactory:(nullable id)videoEncoderFactory + videoDecoderFactory:(nullable id)videoDecoderFactory NS_DESIGNATED_INITIALIZER; /** Initialize an RTCAudioSource with constraints. */ - (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints; -/** Initialize an RTCAudioTrack with an id. Convenience ctor to use an audio source with no - * constraints. +/** Initialize an RTCAudioTrack with an id. Convenience ctor to use an audio + * source with no constraints. */ - (RTCAudioTrack *)audioTrackWithTrackId:(NSString *)trackId; /** Initialize an RTCAudioTrack with a source and an id. */ -- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source - trackId:(NSString *)trackId; +- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source trackId:(NSString *)trackId; /** Initialize an RTCAVFoundationVideoSource with constraints. */ - (RTCAVFoundationVideoSource *)avFoundationVideoSourceWithConstraints: - (nullable RTCMediaConstraints *)constraints; + (nullable RTCMediaConstraints *)constraints; -/** Initialize a generic RTCVideoSource. The RTCVideoSource should be passed to a RTCVideoCapturer - * implementation, e.g. RTCCameraVideoCapturer, in order to produce frames. +/** Initialize a generic RTCVideoSource. The RTCVideoSource should be passed to + * a RTCVideoCapturer implementation, e.g. RTCCameraVideoCapturer, in order to + * produce frames. */ - (RTCVideoSource *)videoSource; /** Initialize an RTCVideoTrack with a source and an id. */ -- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source - trackId:(NSString *)trackId; +- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source trackId:(NSString *)trackId; /** Initialize an RTCMediaStream with an id. */ - (RTCMediaStream *)mediaStreamWithStreamId:(NSString *)streamId; @@ -69,16 +73,14 @@ RTC_EXPORT /** Initialize an RTCPeerConnection with a configuration, constraints, and * delegate. */ -- (RTCPeerConnection *)peerConnectionWithConfiguration: - (RTCConfiguration *)configuration - constraints: - (RTCMediaConstraints *)constraints +- (RTCPeerConnection *)peerConnectionWithConfiguration:(RTCConfiguration *)configuration + constraints:(RTCMediaConstraints *)constraints delegate: - (nullable id)delegate; + (nullable id)delegate; -/** Start an AecDump recording. This API call will likely change in the future. */ -- (BOOL)startAecDumpWithFilePath:(NSString *)filePath - maxSizeInBytes:(int64_t)maxSizeInBytes; +/** Start an AecDump recording. This API call will likely change in the future. + */ +- (BOOL)startAecDumpWithFilePath:(NSString *)filePath maxSizeInBytes:(int64_t)maxSizeInBytes; /* Stop an active AecDump recording */ - (void)stopAecDump; diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h index 64ca544288..3012cf8154 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h @@ -9,12 +9,16 @@ */ #import +#import +#import #if TARGET_OS_IPHONE #import #import #endif #import #import +#import +#import #import #import #if TARGET_OS_IPHONE