blob: ac265c8296104fa1fb73780595f6f0d66c88601c [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 Carlsson6bf43d22017-10-16 13:51:43 +020013#import "ARDVideoEncoderFactory.h"
Anders Carlsson71230292017-06-09 16:06:14 +020014#import "WebRTC/RTCCameraVideoCapturer.h"
denicijad17d5362016-11-02 02:56:09 -070015#import "WebRTC/RTCMediaConstraints.h"
16
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 {
69 NSArray<RTCVideoCodecInfo *> *supportedCodecs =
70 [[[ARDVideoEncoderFactory alloc] init] supportedCodecs];
71 return supportedCodecs;
sakal68b5df92017-03-17 09:01:59 -070072}
73
Anders Carlsson6bf43d22017-10-16 13:51:43 +020074- (RTCVideoCodecInfo *)currentVideoCodecSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020075 [self registerStoreDefaults];
Anders Carlsson6bf43d22017-10-16 13:51:43 +020076 NSData *codecData = [[self settingsStore] videoCodec];
77 return [NSKeyedUnarchiver unarchiveObjectWithData:codecData];
sakal68b5df92017-03-17 09:01:59 -070078}
79
Anders Carlsson6bf43d22017-10-16 13:51:43 +020080- (BOOL)storeVideoCodecSetting:(RTCVideoCodecInfo *)videoCodec {
sakal68b5df92017-03-17 09:01:59 -070081 if (![[self availableVideoCodecs] containsObject:videoCodec]) {
82 return NO;
83 }
Anders Carlsson6bf43d22017-10-16 13:51:43 +020084 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:videoCodec];
85 [[self settingsStore] setVideoCodec:codecData];
sakal68b5df92017-03-17 09:01:59 -070086 return YES;
87}
88
denicija9af2b602016-11-17 00:43:43 -080089- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020090 [self registerStoreDefaults];
denicija9af2b602016-11-17 00:43:43 -080091 return [[self settingsStore] maxBitrate];
92}
93
94- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
95 [[self settingsStore] setMaxBitrate:bitrate];
96}
97
Anders Carlssone1500582017-06-15 16:05:13 +020098- (BOOL)currentAudioOnlySettingFromStore {
99 return [[self settingsStore] audioOnly];
100}
101
102- (void)storeAudioOnlySetting:(BOOL)audioOnly {
103 [[self settingsStore] setAudioOnly:audioOnly];
104}
105
106- (BOOL)currentCreateAecDumpSettingFromStore {
107 return [[self settingsStore] createAecDump];
108}
109
110- (void)storeCreateAecDumpSetting:(BOOL)createAecDump {
111 [[self settingsStore] setCreateAecDump:createAecDump];
112}
113
114- (BOOL)currentUseLevelControllerSettingFromStore {
115 return [[self settingsStore] useLevelController];
116}
117
118- (void)storeUseLevelControllerSetting:(BOOL)useLevelController {
119 [[self settingsStore] setUseLevelController:useLevelController];
120}
121
122- (BOOL)currentUseManualAudioConfigSettingFromStore {
123 return [[self settingsStore] useManualAudioConfig];
124}
125
126- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig {
127 [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig];
128}
129
denicijad17d5362016-11-02 02:56:09 -0700130#pragma mark - Testable
131
denicija2256e042016-11-09 06:26:18 -0800132- (ARDSettingsStore *)settingsStore {
denicijad17d5362016-11-02 02:56:09 -0700133 if (!_settingsStore) {
denicija2256e042016-11-09 06:26:18 -0800134 _settingsStore = [[ARDSettingsStore alloc] init];
Anders Carlssone1500582017-06-15 16:05:13 +0200135 [self registerStoreDefaults];
denicijad17d5362016-11-02 02:56:09 -0700136 }
137 return _settingsStore;
138}
139
sakalc522e752017-04-05 12:17:48 -0700140- (int)currentVideoResolutionWidthFromStore {
141 NSString *resolution = [self currentVideoResolutionSettingFromStore];
denicijad17d5362016-11-02 02:56:09 -0700142
sakalc522e752017-04-05 12:17:48 -0700143 return [self videoResolutionComponentAtIndex:0 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700144}
145
sakalc522e752017-04-05 12:17:48 -0700146- (int)currentVideoResolutionHeightFromStore {
147 NSString *resolution = [self currentVideoResolutionSettingFromStore];
148 return [self videoResolutionComponentAtIndex:1 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700149}
150
151#pragma mark -
152
sakalc522e752017-04-05 12:17:48 -0700153- (NSString *)defaultVideoResolutionSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200154 return [self availableVideoResolutions].firstObject;
denicijad17d5362016-11-02 02:56:09 -0700155}
156
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200157- (RTCVideoCodecInfo *)defaultVideoCodecSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200158 return [self availableVideoCodecs].firstObject;
Anders Carlssone1500582017-06-15 16:05:13 +0200159}
160
sakalc522e752017-04-05 12:17:48 -0700161- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
denicijad17d5362016-11-02 02:56:09 -0700162 if (index != 0 && index != 1) {
sakalc522e752017-04-05 12:17:48 -0700163 return 0;
denicijad17d5362016-11-02 02:56:09 -0700164 }
sakalc522e752017-04-05 12:17:48 -0700165 NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
denicijad17d5362016-11-02 02:56:09 -0700166 if (components.count != 2) {
sakalc522e752017-04-05 12:17:48 -0700167 return 0;
denicijad17d5362016-11-02 02:56:09 -0700168 }
sakalc522e752017-04-05 12:17:48 -0700169 return components[index].intValue;
denicijad17d5362016-11-02 02:56:09 -0700170}
171
Anders Carlssone1500582017-06-15 16:05:13 +0200172- (void)registerStoreDefaults {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200173 NSString *defaultVideoResolutionSetting = [self defaultVideoResolutionSetting];
174 BOOL audioOnly = (defaultVideoResolutionSetting.length == 0);
175
176// The iOS simulator doesn't provide any sort of camera capture
177// support or emulation (http://goo.gl/rHAnC1) so don't bother
178// trying to open a local stream.
179#if TARGET_IPHONE_SIMULATOR
180 audioOnly = YES;
181#endif
182
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200183 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:[self defaultVideoCodecSetting]];
Anders Carlssone1500582017-06-15 16:05:13 +0200184 [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting]
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200185 videoCodec:codecData
Anders Carlssone1500582017-06-15 16:05:13 +0200186 bitrate:nil
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200187 audioOnly:audioOnly
Anders Carlssone1500582017-06-15 16:05:13 +0200188 createAecDump:NO
189 useLevelController:NO
190 useManualAudioConfig:YES];
sakal68b5df92017-03-17 09:01:59 -0700191}
192
denicijad17d5362016-11-02 02:56:09 -0700193@end
194NS_ASSUME_NONNULL_END