blob: 0a2bee66e75a9762ea32737c3d5249f99784c6d7 [file] [log] [blame]
denicijad17d5362016-11-02 02:56:09 -07001/*
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
denicija2256e042016-11-09 06:26:18 -080011#import "ARDSettingsModel+Private.h"
12#import "ARDSettingsStore.h"
Anders Carlsson71230292017-06-09 16:06:14 +020013#import "WebRTC/RTCCameraVideoCapturer.h"
denicijad17d5362016-11-02 02:56:09 -070014#import "WebRTC/RTCMediaConstraints.h"
Anders Carlsson1d4c1522017-10-30 13:07:07 +010015#import "WebRTC/RTCVideoCodecFactory.h"
denicijad17d5362016-11-02 02:56:09 -070016
17NS_ASSUME_NONNULL_BEGIN
denicijad17d5362016-11-02 02:56:09 -070018
denicija2256e042016-11-09 06:26:18 -080019@interface ARDSettingsModel () {
20 ARDSettingsStore *_settingsStore;
denicijad17d5362016-11-02 02:56:09 -070021}
22@end
23
denicija2256e042016-11-09 06:26:18 -080024@implementation ARDSettingsModel
denicijad17d5362016-11-02 02:56:09 -070025
sakalc522e752017-04-05 12:17:48 -070026- (NSArray<NSString *> *)availableVideoResolutions {
Anders Carlsson71230292017-06-09 16:06:14 +020027 NSMutableSet<NSArray<NSNumber *> *> *resolutions =
28 [[NSMutableSet<NSArray<NSNumber *> *> alloc] init];
29 for (AVCaptureDevice *device in [RTCCameraVideoCapturer captureDevices]) {
30 for (AVCaptureDeviceFormat *format in
31 [RTCCameraVideoCapturer supportedFormatsForDevice:device]) {
32 CMVideoDimensions resolution =
33 CMVideoFormatDescriptionGetDimensions(format.formatDescription);
34 NSArray<NSNumber *> *resolutionObject = @[ @(resolution.width), @(resolution.height) ];
35 [resolutions addObject:resolutionObject];
36 }
37 }
38
39 NSArray<NSArray<NSNumber *> *> *sortedResolutions =
40 [[resolutions allObjects] sortedArrayUsingComparator:^NSComparisonResult(
41 NSArray<NSNumber *> *obj1, NSArray<NSNumber *> *obj2) {
42 return obj1.firstObject > obj2.firstObject;
43 }];
44
45 NSMutableArray<NSString *> *resolutionStrings = [[NSMutableArray<NSString *> alloc] init];
46 for (NSArray<NSNumber *> *resolution in sortedResolutions) {
47 NSString *resolutionString =
48 [NSString stringWithFormat:@"%@x%@", resolution.firstObject, resolution.lastObject];
49 [resolutionStrings addObject:resolutionString];
50 }
51
52 return [resolutionStrings copy];
denicijad17d5362016-11-02 02:56:09 -070053}
54
sakalc522e752017-04-05 12:17:48 -070055- (NSString *)currentVideoResolutionSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020056 [self registerStoreDefaults];
57 return [[self settingsStore] videoResolution];
denicijad17d5362016-11-02 02:56:09 -070058}
59
sakalc522e752017-04-05 12:17:48 -070060- (BOOL)storeVideoResolutionSetting:(NSString *)resolution {
61 if (![[self availableVideoResolutions] containsObject:resolution]) {
denicijad17d5362016-11-02 02:56:09 -070062 return NO;
63 }
sakalc522e752017-04-05 12:17:48 -070064 [[self settingsStore] setVideoResolution:resolution];
denicijad17d5362016-11-02 02:56:09 -070065 return YES;
66}
67
Anders Carlsson6bf43d22017-10-16 13:51:43 +020068- (NSArray<RTCVideoCodecInfo *> *)availableVideoCodecs {
Anders Carlsson1d4c1522017-10-30 13:07:07 +010069 return [RTCDefaultVideoEncoderFactory supportedCodecs];
sakal68b5df92017-03-17 09:01:59 -070070}
71
Anders Carlsson6bf43d22017-10-16 13:51:43 +020072- (RTCVideoCodecInfo *)currentVideoCodecSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020073 [self registerStoreDefaults];
Anders Carlsson6bf43d22017-10-16 13:51:43 +020074 NSData *codecData = [[self settingsStore] videoCodec];
75 return [NSKeyedUnarchiver unarchiveObjectWithData:codecData];
sakal68b5df92017-03-17 09:01:59 -070076}
77
Anders Carlsson6bf43d22017-10-16 13:51:43 +020078- (BOOL)storeVideoCodecSetting:(RTCVideoCodecInfo *)videoCodec {
sakal68b5df92017-03-17 09:01:59 -070079 if (![[self availableVideoCodecs] containsObject:videoCodec]) {
80 return NO;
81 }
Anders Carlsson6bf43d22017-10-16 13:51:43 +020082 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:videoCodec];
83 [[self settingsStore] setVideoCodec:codecData];
sakal68b5df92017-03-17 09:01:59 -070084 return YES;
85}
86
denicija9af2b602016-11-17 00:43:43 -080087- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020088 [self registerStoreDefaults];
denicija9af2b602016-11-17 00:43:43 -080089 return [[self settingsStore] maxBitrate];
90}
91
92- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
93 [[self settingsStore] setMaxBitrate:bitrate];
94}
95
Anders Carlssone1500582017-06-15 16:05:13 +020096- (BOOL)currentAudioOnlySettingFromStore {
97 return [[self settingsStore] audioOnly];
98}
99
100- (void)storeAudioOnlySetting:(BOOL)audioOnly {
101 [[self settingsStore] setAudioOnly:audioOnly];
102}
103
104- (BOOL)currentCreateAecDumpSettingFromStore {
105 return [[self settingsStore] createAecDump];
106}
107
108- (void)storeCreateAecDumpSetting:(BOOL)createAecDump {
109 [[self settingsStore] setCreateAecDump:createAecDump];
110}
111
112- (BOOL)currentUseLevelControllerSettingFromStore {
113 return [[self settingsStore] useLevelController];
114}
115
116- (void)storeUseLevelControllerSetting:(BOOL)useLevelController {
117 [[self settingsStore] setUseLevelController:useLevelController];
118}
119
120- (BOOL)currentUseManualAudioConfigSettingFromStore {
121 return [[self settingsStore] useManualAudioConfig];
122}
123
124- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig {
125 [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig];
126}
127
denicijad17d5362016-11-02 02:56:09 -0700128#pragma mark - Testable
129
denicija2256e042016-11-09 06:26:18 -0800130- (ARDSettingsStore *)settingsStore {
denicijad17d5362016-11-02 02:56:09 -0700131 if (!_settingsStore) {
denicija2256e042016-11-09 06:26:18 -0800132 _settingsStore = [[ARDSettingsStore alloc] init];
Anders Carlssone1500582017-06-15 16:05:13 +0200133 [self registerStoreDefaults];
denicijad17d5362016-11-02 02:56:09 -0700134 }
135 return _settingsStore;
136}
137
sakalc522e752017-04-05 12:17:48 -0700138- (int)currentVideoResolutionWidthFromStore {
139 NSString *resolution = [self currentVideoResolutionSettingFromStore];
denicijad17d5362016-11-02 02:56:09 -0700140
sakalc522e752017-04-05 12:17:48 -0700141 return [self videoResolutionComponentAtIndex:0 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700142}
143
sakalc522e752017-04-05 12:17:48 -0700144- (int)currentVideoResolutionHeightFromStore {
145 NSString *resolution = [self currentVideoResolutionSettingFromStore];
146 return [self videoResolutionComponentAtIndex:1 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700147}
148
149#pragma mark -
150
sakalc522e752017-04-05 12:17:48 -0700151- (NSString *)defaultVideoResolutionSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200152 return [self availableVideoResolutions].firstObject;
denicijad17d5362016-11-02 02:56:09 -0700153}
154
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200155- (RTCVideoCodecInfo *)defaultVideoCodecSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200156 return [self availableVideoCodecs].firstObject;
Anders Carlssone1500582017-06-15 16:05:13 +0200157}
158
sakalc522e752017-04-05 12:17:48 -0700159- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
denicijad17d5362016-11-02 02:56:09 -0700160 if (index != 0 && index != 1) {
sakalc522e752017-04-05 12:17:48 -0700161 return 0;
denicijad17d5362016-11-02 02:56:09 -0700162 }
sakalc522e752017-04-05 12:17:48 -0700163 NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
denicijad17d5362016-11-02 02:56:09 -0700164 if (components.count != 2) {
sakalc522e752017-04-05 12:17:48 -0700165 return 0;
denicijad17d5362016-11-02 02:56:09 -0700166 }
sakalc522e752017-04-05 12:17:48 -0700167 return components[index].intValue;
denicijad17d5362016-11-02 02:56:09 -0700168}
169
Anders Carlssone1500582017-06-15 16:05:13 +0200170- (void)registerStoreDefaults {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200171 NSString *defaultVideoResolutionSetting = [self defaultVideoResolutionSetting];
172 BOOL audioOnly = (defaultVideoResolutionSetting.length == 0);
173
174// The iOS simulator doesn't provide any sort of camera capture
175// support or emulation (http://goo.gl/rHAnC1) so don't bother
176// trying to open a local stream.
177#if TARGET_IPHONE_SIMULATOR
178 audioOnly = YES;
179#endif
180
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200181 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:[self defaultVideoCodecSetting]];
Anders Carlssone1500582017-06-15 16:05:13 +0200182 [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting]
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200183 videoCodec:codecData
Anders Carlssone1500582017-06-15 16:05:13 +0200184 bitrate:nil
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200185 audioOnly:audioOnly
Anders Carlssone1500582017-06-15 16:05:13 +0200186 createAecDump:NO
187 useLevelController:NO
188 useManualAudioConfig:YES];
sakal68b5df92017-03-17 09:01:59 -0700189}
190
denicijad17d5362016-11-02 02:56:09 -0700191@end
192NS_ASSUME_NONNULL_END