blob: 0d3ca7ccb684b7c06da6b1abd03dfc1d674d29e9 [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"
15
16NS_ASSUME_NONNULL_BEGIN
denicijad17d5362016-11-02 02:56:09 -070017
sakal68b5df92017-03-17 09:01:59 -070018static NSArray<NSString *> *videoCodecsStaticValues() {
19 return @[ @"H264", @"VP8", @"VP9" ];
20}
21
denicija2256e042016-11-09 06:26:18 -080022@interface ARDSettingsModel () {
23 ARDSettingsStore *_settingsStore;
denicijad17d5362016-11-02 02:56:09 -070024}
25@end
26
denicija2256e042016-11-09 06:26:18 -080027@implementation ARDSettingsModel
denicijad17d5362016-11-02 02:56:09 -070028
sakalc522e752017-04-05 12:17:48 -070029- (NSArray<NSString *> *)availableVideoResolutions {
Anders Carlsson71230292017-06-09 16:06:14 +020030 NSMutableSet<NSArray<NSNumber *> *> *resolutions =
31 [[NSMutableSet<NSArray<NSNumber *> *> alloc] init];
32 for (AVCaptureDevice *device in [RTCCameraVideoCapturer captureDevices]) {
33 for (AVCaptureDeviceFormat *format in
34 [RTCCameraVideoCapturer supportedFormatsForDevice:device]) {
35 CMVideoDimensions resolution =
36 CMVideoFormatDescriptionGetDimensions(format.formatDescription);
37 NSArray<NSNumber *> *resolutionObject = @[ @(resolution.width), @(resolution.height) ];
38 [resolutions addObject:resolutionObject];
39 }
40 }
41
42 NSArray<NSArray<NSNumber *> *> *sortedResolutions =
43 [[resolutions allObjects] sortedArrayUsingComparator:^NSComparisonResult(
44 NSArray<NSNumber *> *obj1, NSArray<NSNumber *> *obj2) {
45 return obj1.firstObject > obj2.firstObject;
46 }];
47
48 NSMutableArray<NSString *> *resolutionStrings = [[NSMutableArray<NSString *> alloc] init];
49 for (NSArray<NSNumber *> *resolution in sortedResolutions) {
50 NSString *resolutionString =
51 [NSString stringWithFormat:@"%@x%@", resolution.firstObject, resolution.lastObject];
52 [resolutionStrings addObject:resolutionString];
53 }
54
55 return [resolutionStrings copy];
denicijad17d5362016-11-02 02:56:09 -070056}
57
sakalc522e752017-04-05 12:17:48 -070058- (NSString *)currentVideoResolutionSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020059 [self registerStoreDefaults];
60 return [[self settingsStore] videoResolution];
denicijad17d5362016-11-02 02:56:09 -070061}
62
sakalc522e752017-04-05 12:17:48 -070063- (BOOL)storeVideoResolutionSetting:(NSString *)resolution {
64 if (![[self availableVideoResolutions] containsObject:resolution]) {
denicijad17d5362016-11-02 02:56:09 -070065 return NO;
66 }
sakalc522e752017-04-05 12:17:48 -070067 [[self settingsStore] setVideoResolution:resolution];
denicijad17d5362016-11-02 02:56:09 -070068 return YES;
69}
70
sakal68b5df92017-03-17 09:01:59 -070071- (NSArray<NSString *> *)availableVideoCodecs {
72 return videoCodecsStaticValues();
73}
74
75- (NSString *)currentVideoCodecSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020076 [self registerStoreDefaults];
77 return [[self settingsStore] videoCodec];
sakal68b5df92017-03-17 09:01:59 -070078}
79
80- (BOOL)storeVideoCodecSetting:(NSString *)videoCodec {
81 if (![[self availableVideoCodecs] containsObject:videoCodec]) {
82 return NO;
83 }
84 [[self settingsStore] setVideoCodec:videoCodec];
85 return YES;
86}
87
denicija9af2b602016-11-17 00:43:43 -080088- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020089 [self registerStoreDefaults];
denicija9af2b602016-11-17 00:43:43 -080090 return [[self settingsStore] maxBitrate];
91}
92
93- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
94 [[self settingsStore] setMaxBitrate:bitrate];
95}
96
Anders Carlssone1500582017-06-15 16:05:13 +020097- (BOOL)currentAudioOnlySettingFromStore {
98 return [[self settingsStore] audioOnly];
99}
100
101- (void)storeAudioOnlySetting:(BOOL)audioOnly {
102 [[self settingsStore] setAudioOnly:audioOnly];
103}
104
105- (BOOL)currentCreateAecDumpSettingFromStore {
106 return [[self settingsStore] createAecDump];
107}
108
109- (void)storeCreateAecDumpSetting:(BOOL)createAecDump {
110 [[self settingsStore] setCreateAecDump:createAecDump];
111}
112
113- (BOOL)currentUseLevelControllerSettingFromStore {
114 return [[self settingsStore] useLevelController];
115}
116
117- (void)storeUseLevelControllerSetting:(BOOL)useLevelController {
118 [[self settingsStore] setUseLevelController:useLevelController];
119}
120
121- (BOOL)currentUseManualAudioConfigSettingFromStore {
122 return [[self settingsStore] useManualAudioConfig];
123}
124
125- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig {
126 [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig];
127}
128
denicijad17d5362016-11-02 02:56:09 -0700129#pragma mark - Testable
130
denicija2256e042016-11-09 06:26:18 -0800131- (ARDSettingsStore *)settingsStore {
denicijad17d5362016-11-02 02:56:09 -0700132 if (!_settingsStore) {
denicija2256e042016-11-09 06:26:18 -0800133 _settingsStore = [[ARDSettingsStore alloc] init];
Anders Carlssone1500582017-06-15 16:05:13 +0200134 [self registerStoreDefaults];
denicijad17d5362016-11-02 02:56:09 -0700135 }
136 return _settingsStore;
137}
138
sakalc522e752017-04-05 12:17:48 -0700139- (int)currentVideoResolutionWidthFromStore {
140 NSString *resolution = [self currentVideoResolutionSettingFromStore];
denicijad17d5362016-11-02 02:56:09 -0700141
sakalc522e752017-04-05 12:17:48 -0700142 return [self videoResolutionComponentAtIndex:0 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700143}
144
sakalc522e752017-04-05 12:17:48 -0700145- (int)currentVideoResolutionHeightFromStore {
146 NSString *resolution = [self currentVideoResolutionSettingFromStore];
147 return [self videoResolutionComponentAtIndex:1 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700148}
149
150#pragma mark -
151
sakalc522e752017-04-05 12:17:48 -0700152- (NSString *)defaultVideoResolutionSetting {
Anders Carlsson71230292017-06-09 16:06:14 +0200153 return [self availableVideoResolutions][0];
denicijad17d5362016-11-02 02:56:09 -0700154}
155
Anders Carlssone1500582017-06-15 16:05:13 +0200156- (NSString *)defaultVideoCodecSetting {
157 return videoCodecsStaticValues()[0];
158}
159
sakalc522e752017-04-05 12:17:48 -0700160- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
denicijad17d5362016-11-02 02:56:09 -0700161 if (index != 0 && index != 1) {
sakalc522e752017-04-05 12:17:48 -0700162 return 0;
denicijad17d5362016-11-02 02:56:09 -0700163 }
sakalc522e752017-04-05 12:17:48 -0700164 NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
denicijad17d5362016-11-02 02:56:09 -0700165 if (components.count != 2) {
sakalc522e752017-04-05 12:17:48 -0700166 return 0;
denicijad17d5362016-11-02 02:56:09 -0700167 }
sakalc522e752017-04-05 12:17:48 -0700168 return components[index].intValue;
denicijad17d5362016-11-02 02:56:09 -0700169}
170
Anders Carlssone1500582017-06-15 16:05:13 +0200171- (void)registerStoreDefaults {
172 [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting]
173 videoCodec:[self defaultVideoCodecSetting]
174 bitrate:nil
175 audioOnly:NO
176 createAecDump:NO
177 useLevelController:NO
178 useManualAudioConfig:YES];
sakal68b5df92017-03-17 09:01:59 -0700179}
180
denicijad17d5362016-11-02 02:56:09 -0700181@end
182NS_ASSUME_NONNULL_END