diff --git a/webrtc/examples/BUILD.gn b/webrtc/examples/BUILD.gn index 8893a07320..782491d425 100644 --- a/webrtc/examples/BUILD.gn +++ b/webrtc/examples/BUILD.gn @@ -221,6 +221,11 @@ if (is_ios || (is_mac && target_cpu != "x86")) { "objc/AppRTCMobile/ARDRoomServerClient.h", "objc/AppRTCMobile/ARDSDPUtils.h", "objc/AppRTCMobile/ARDSDPUtils.m", + "objc/AppRTCMobile/ARDSettingsModel+Private.h", + "objc/AppRTCMobile/ARDSettingsModel.h", + "objc/AppRTCMobile/ARDSettingsModel.m", + "objc/AppRTCMobile/ARDSettingsStore.h", + "objc/AppRTCMobile/ARDSettingsStore.m", "objc/AppRTCMobile/ARDSignalingChannel.h", "objc/AppRTCMobile/ARDSignalingMessage.h", "objc/AppRTCMobile/ARDSignalingMessage.m", @@ -264,11 +269,6 @@ if (is_ios || (is_mac && target_cpu != "x86")) { "objc/AppRTCMobile/ios/ARDMainView.m", "objc/AppRTCMobile/ios/ARDMainViewController.h", "objc/AppRTCMobile/ios/ARDMainViewController.m", - "objc/AppRTCMobile/ios/ARDSettingsModel+Private.h", - "objc/AppRTCMobile/ios/ARDSettingsModel.h", - "objc/AppRTCMobile/ios/ARDSettingsModel.m", - "objc/AppRTCMobile/ios/ARDSettingsStore.h", - "objc/AppRTCMobile/ios/ARDSettingsStore.m", "objc/AppRTCMobile/ios/ARDSettingsViewController.h", "objc/AppRTCMobile/ios/ARDSettingsViewController.m", "objc/AppRTCMobile/ios/ARDStatsView.h", diff --git a/webrtc/examples/objc/AppRTCMobile/ARDAppClient.h b/webrtc/examples/objc/AppRTCMobile/ARDAppClient.h index 0feb01586a..933dc6b1a0 100644 --- a/webrtc/examples/objc/AppRTCMobile/ARDAppClient.h +++ b/webrtc/examples/objc/AppRTCMobile/ARDAppClient.h @@ -23,6 +23,7 @@ typedef NS_ENUM(NSInteger, ARDAppClientState) { }; @class ARDAppClient; +@class ARDSettingsModel; @class RTCMediaConstraints; // The delegate is informed of pertinent events and will be called on the @@ -60,22 +61,17 @@ typedef NS_ENUM(NSInteger, ARDAppClientState) { @property(nonatomic, weak) id delegate; // Convenience constructor since all expected use cases will need a delegate // in order to receive remote tracks. -- (instancetype)initWithDelegate:(id)delegate - preferVideoCodec:(NSString*)codec; - -// Sets camera constraints. -- (void)setCameraConstraints:(RTCMediaConstraints *)mediaConstraints; - -// Sets maximum bitrate the rtp sender should use. -- (void)setMaxBitrate:(NSNumber *)maxBitrate; +- (instancetype)initWithDelegate:(id)delegate; // Establishes a connection with the AppRTC servers for the given room id. +// |settings| is an object containing settings such as video codec for the call. // If |isLoopback| is true, the call will connect to itself. // If |isAudioOnly| is true, video will be disabled for the call. // If |shouldMakeAecDump| is true, an aecdump will be created for the call. // If |shouldUseLevelControl| is true, the level controller will be used // in the call. - (void)connectToRoomWithId:(NSString *)roomId + settings:(ARDSettingsModel *)settings isLoopback:(BOOL)isLoopback isAudioOnly:(BOOL)isAudioOnly shouldMakeAecDump:(BOOL)shouldMakeAecDump diff --git a/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m b/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m index 497a137b6c..ef38138319 100644 --- a/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m +++ b/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m @@ -23,11 +23,12 @@ #import "WebRTC/RTCTracing.h" #import "ARDAppEngineClient.h" -#import "ARDTURNClient+Internal.h" #import "ARDJoinResponse.h" #import "ARDMessageResponse.h" #import "ARDSDPUtils.h" +#import "ARDSettingsModel.h" #import "ARDSignalingMessage.h" +#import "ARDTURNClient+Internal.h" #import "ARDUtilities.h" #import "ARDWebSocketChannel.h" #import "RTCIceCandidate+JSON.h" @@ -98,9 +99,7 @@ static int const kKbpsMultiplier = 1000; @implementation ARDAppClient { RTCFileLogger *_fileLogger; ARDTimerProxy *_statsTimer; - RTCMediaConstraints *_cameraConstraints; - NSNumber *_maxBitrate; - NSString *_videoCodec; + ARDSettingsModel *_settings; } @synthesize shouldGetStats = _shouldGetStats; @@ -129,15 +128,13 @@ static int const kKbpsMultiplier = 1000; @synthesize shouldUseLevelControl = _shouldUseLevelControl; - (instancetype)init { - return [self initWithDelegate:nil preferVideoCodec:@"H264"]; + return [self initWithDelegate:nil]; } -- (instancetype)initWithDelegate:(id)delegate - preferVideoCodec:(NSString *)codec { +- (instancetype)initWithDelegate:(id)delegate { if (self = [super init]) { _roomServerClient = [[ARDAppEngineClient alloc] init]; _delegate = delegate; - _videoCodec = codec; NSURL *turnRequestURL = [NSURL URLWithString:kARDIceServerRequestUrl]; _turnClient = [[ARDTURNClient alloc] initWithURL:turnRequestURL]; [self configure]; @@ -213,12 +210,14 @@ static int const kKbpsMultiplier = 1000; } - (void)connectToRoomWithId:(NSString *)roomId + settings:(ARDSettingsModel *)settings isLoopback:(BOOL)isLoopback isAudioOnly:(BOOL)isAudioOnly shouldMakeAecDump:(BOOL)shouldMakeAecDump shouldUseLevelControl:(BOOL)shouldUseLevelControl { NSParameterAssert(roomId.length); NSParameterAssert(_state == kARDAppClientStateDisconnected); + _settings = settings; _isLoopback = isLoopback; _isAudioOnly = isAudioOnly; _shouldMakeAecDump = shouldMakeAecDump; @@ -319,14 +318,6 @@ static int const kKbpsMultiplier = 1000; #endif } -- (void)setCameraConstraints:(RTCMediaConstraints *)mediaConstraints { - _cameraConstraints = mediaConstraints; -} - -- (void)setMaxBitrate:(NSNumber *)maxBitrate { - _maxBitrate = maxBitrate; -} - #pragma mark - ARDSignalingChannelDelegate - (void)channel:(id)channel @@ -458,7 +449,7 @@ static int const kKbpsMultiplier = 1000; // Prefer codec from settings if available. RTCSessionDescription *sdpPreferringCodec = [ARDSDPUtils descriptionForDescription:sdp - preferredVideoCodec:_videoCodec]; + preferredVideoCodec:[_settings currentVideoCodecSettingFromStore]]; __weak ARDAppClient *weakSelf = self; [_peerConnection setLocalDescription:sdpPreferringCodec completionHandler:^(NSError *error) { @@ -612,7 +603,7 @@ static int const kKbpsMultiplier = 1000; // Prefer codec from settings if available. RTCSessionDescription *sdpPreferringCodec = [ARDSDPUtils descriptionForDescription:description - preferredVideoCodec:_videoCodec]; + preferredVideoCodec:[_settings currentVideoCodecSettingFromStore]]; __weak ARDAppClient *weakSelf = self; [_peerConnection setRemoteDescription:sdpPreferringCodec completionHandler:^(NSError *error) { @@ -688,7 +679,7 @@ static int const kKbpsMultiplier = 1000; for (RTCRtpSender *sender in _peerConnection.senders) { if (sender.track != nil) { if ([sender.track.kind isEqualToString:kARDVideoTrackKind]) { - [self setMaxBitrate:_maxBitrate forVideoSender:sender]; + [self setMaxBitrate:[_settings currentMaxBitrateSettingFromStore] forVideoSender:sender]; } } } @@ -774,7 +765,10 @@ static int const kKbpsMultiplier = 1000; } - (RTCMediaConstraints *)cameraConstraints { - return _cameraConstraints; + RTCMediaConstraints *cameraConstraints = [[RTCMediaConstraints alloc] + initWithMandatoryConstraints:nil + optionalConstraints:[_settings currentMediaConstraintFromStoreAsRTCDictionary]]; + return cameraConstraints; } - (RTCMediaConstraints *)defaultAnswerConstraints { diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsModel+Private.h b/webrtc/examples/objc/AppRTCMobile/ARDSettingsModel+Private.h similarity index 100% rename from webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsModel+Private.h rename to webrtc/examples/objc/AppRTCMobile/ARDSettingsModel+Private.h diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsModel.h b/webrtc/examples/objc/AppRTCMobile/ARDSettingsModel.h similarity index 100% rename from webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsModel.h rename to webrtc/examples/objc/AppRTCMobile/ARDSettingsModel.h diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsModel.m b/webrtc/examples/objc/AppRTCMobile/ARDSettingsModel.m similarity index 100% rename from webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsModel.m rename to webrtc/examples/objc/AppRTCMobile/ARDSettingsModel.m diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsStore.h b/webrtc/examples/objc/AppRTCMobile/ARDSettingsStore.h similarity index 96% rename from webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsStore.h rename to webrtc/examples/objc/AppRTCMobile/ARDSettingsStore.h index b82ec70e65..b010b7f124 100644 --- a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsStore.h +++ b/webrtc/examples/objc/AppRTCMobile/ARDSettingsStore.h @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN */ @interface ARDSettingsStore : NSObject -@property(nonatomic) NSString* videoCodec; +@property(nonatomic) NSString *videoCodec; /** * Returns current video resolution media constraint string stored in the store. diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsStore.m b/webrtc/examples/objc/AppRTCMobile/ARDSettingsStore.m similarity index 96% rename from webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsStore.m rename to webrtc/examples/objc/AppRTCMobile/ARDSettingsStore.m index c05df4416a..6d9fa5bb26 100644 --- a/webrtc/examples/objc/AppRTCMobile/ios/ARDSettingsStore.m +++ b/webrtc/examples/objc/AppRTCMobile/ARDSettingsStore.m @@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @interface ARDSettingsStore () { NSUserDefaults *_storage; } -@property(nonatomic, strong) NSUserDefaults *storage; +@property(nonatomic, strong, readonly) NSUserDefaults *storage; @end @implementation ARDSettingsStore diff --git a/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m b/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m index f58ee6613c..d1ae3f94e0 100644 --- a/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m +++ b/webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m @@ -45,17 +45,10 @@ delegate:(id)delegate { if (self = [super init]) { ARDSettingsModel *settingsModel = [[ARDSettingsModel alloc] init]; - NSString* videoCodec = [settingsModel currentVideoCodecSettingFromStore]; _delegate = delegate; - _client = [[ARDAppClient alloc] initWithDelegate:self - preferVideoCodec:videoCodec]; - RTCMediaConstraints *cameraConstraints = [[RTCMediaConstraints alloc] - initWithMandatoryConstraints:nil - optionalConstraints:[settingsModel - currentMediaConstraintFromStoreAsRTCDictionary]]; - [_client setMaxBitrate:[settingsModel currentMaxBitrateSettingFromStore]]; - [_client setCameraConstraints:cameraConstraints]; + _client = [[ARDAppClient alloc] initWithDelegate:self]; [_client connectToRoomWithId:room + settings:settingsModel isLoopback:isLoopback isAudioOnly:isAudioOnly shouldMakeAecDump:shouldMakeAecDump diff --git a/webrtc/examples/objc/AppRTCMobile/mac/APPRTCViewController.m b/webrtc/examples/objc/AppRTCMobile/mac/APPRTCViewController.m index bcf26b258e..69c537aad6 100644 --- a/webrtc/examples/objc/AppRTCMobile/mac/APPRTCViewController.m +++ b/webrtc/examples/objc/AppRTCMobile/mac/APPRTCViewController.m @@ -16,6 +16,7 @@ #import "WebRTC/RTCVideoTrack.h" #import "ARDAppClient.h" +#import "ARDSettingsModel.h" static NSUInteger const kContentWidth = 900; static NSUInteger const kRoomFieldWidth = 200; @@ -369,9 +370,9 @@ static NSUInteger const kBottomViewHeight = 200; } [_client disconnect]; - ARDAppClient *client = [[ARDAppClient alloc] initWithDelegate:self - preferVideoCodec:@"H264"]; + ARDAppClient* client = [[ARDAppClient alloc] initWithDelegate:self]; [client connectToRoomWithId:roomId + settings:[[ARDSettingsModel alloc] init] // Use default settings. isLoopback:isLoopback isAudioOnly:NO shouldMakeAecDump:NO diff --git a/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm b/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm index c2cd9e3368..fc7b76822c 100644 --- a/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm +++ b/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm @@ -22,6 +22,7 @@ #import "ARDJoinResponse+Internal.h" #import "ARDMessageResponse+Internal.h" #import "ARDSDPUtils.h" +#import "ARDSettingsModel.h" @interface ARDAppClientTest : XCTestCase @end @@ -209,11 +210,13 @@ // Kick off connection. [caller connectToRoomWithId:roomId + settings:[[ARDSettingsModel alloc] init] isLoopback:NO isAudioOnly:NO shouldMakeAecDump:NO shouldUseLevelControl:NO]; [answerer connectToRoomWithId:roomId + settings:[[ARDSettingsModel alloc] init] isLoopback:NO isAudioOnly:NO shouldMakeAecDump:NO @@ -250,6 +253,7 @@ // Kick off connection. [caller connectToRoomWithId:roomId + settings:[[ARDSettingsModel alloc] init] isLoopback:NO isAudioOnly:NO shouldMakeAecDump:NO