blob: fb3ef7ee8bdaf09c0922ae5e6dc53e2296c90e0b [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 Carlsson7bca8ca2018-08-30 09:30:29 +020013
14#import <WebRTC/RTCCameraVideoCapturer.h>
15#import <WebRTC/RTCDefaultVideoEncoderFactory.h>
16#import <WebRTC/RTCMediaConstraints.h>
denicijad17d5362016-11-02 02:56:09 -070017
18NS_ASSUME_NONNULL_BEGIN
denicijad17d5362016-11-02 02:56:09 -070019
denicija2256e042016-11-09 06:26:18 -080020@interface ARDSettingsModel () {
21 ARDSettingsStore *_settingsStore;
denicijad17d5362016-11-02 02:56:09 -070022}
23@end
24
denicija2256e042016-11-09 06:26:18 -080025@implementation ARDSettingsModel
denicijad17d5362016-11-02 02:56:09 -070026
sakalc522e752017-04-05 12:17:48 -070027- (NSArray<NSString *> *)availableVideoResolutions {
Anders Carlsson71230292017-06-09 16:06:14 +020028 NSMutableSet<NSArray<NSNumber *> *> *resolutions =
29 [[NSMutableSet<NSArray<NSNumber *> *> alloc] init];
30 for (AVCaptureDevice *device in [RTCCameraVideoCapturer captureDevices]) {
31 for (AVCaptureDeviceFormat *format in
32 [RTCCameraVideoCapturer supportedFormatsForDevice:device]) {
33 CMVideoDimensions resolution =
34 CMVideoFormatDescriptionGetDimensions(format.formatDescription);
35 NSArray<NSNumber *> *resolutionObject = @[ @(resolution.width), @(resolution.height) ];
36 [resolutions addObject:resolutionObject];
37 }
38 }
39
40 NSArray<NSArray<NSNumber *> *> *sortedResolutions =
41 [[resolutions allObjects] sortedArrayUsingComparator:^NSComparisonResult(
42 NSArray<NSNumber *> *obj1, NSArray<NSNumber *> *obj2) {
Yura Yaroshevichf9deb7a2018-04-19 17:32:53 +030043 NSComparisonResult cmp = [obj1.firstObject compare:obj2.firstObject];
44 if (cmp != NSOrderedSame) {
45 return cmp;
46 }
47 return [obj1.lastObject compare:obj2.lastObject];
Anders Carlsson71230292017-06-09 16:06:14 +020048 }];
49
50 NSMutableArray<NSString *> *resolutionStrings = [[NSMutableArray<NSString *> alloc] init];
51 for (NSArray<NSNumber *> *resolution in sortedResolutions) {
52 NSString *resolutionString =
53 [NSString stringWithFormat:@"%@x%@", resolution.firstObject, resolution.lastObject];
54 [resolutionStrings addObject:resolutionString];
55 }
56
57 return [resolutionStrings copy];
denicijad17d5362016-11-02 02:56:09 -070058}
59
sakalc522e752017-04-05 12:17:48 -070060- (NSString *)currentVideoResolutionSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020061 [self registerStoreDefaults];
62 return [[self settingsStore] videoResolution];
denicijad17d5362016-11-02 02:56:09 -070063}
64
sakalc522e752017-04-05 12:17:48 -070065- (BOOL)storeVideoResolutionSetting:(NSString *)resolution {
66 if (![[self availableVideoResolutions] containsObject:resolution]) {
denicijad17d5362016-11-02 02:56:09 -070067 return NO;
68 }
sakalc522e752017-04-05 12:17:48 -070069 [[self settingsStore] setVideoResolution:resolution];
denicijad17d5362016-11-02 02:56:09 -070070 return YES;
71}
72
Anders Carlsson6bf43d22017-10-16 13:51:43 +020073- (NSArray<RTCVideoCodecInfo *> *)availableVideoCodecs {
Anders Carlsson1d4c1522017-10-30 13:07:07 +010074 return [RTCDefaultVideoEncoderFactory supportedCodecs];
sakal68b5df92017-03-17 09:01:59 -070075}
76
Anders Carlsson6bf43d22017-10-16 13:51:43 +020077- (RTCVideoCodecInfo *)currentVideoCodecSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020078 [self registerStoreDefaults];
Anders Carlsson6bf43d22017-10-16 13:51:43 +020079 NSData *codecData = [[self settingsStore] videoCodec];
80 return [NSKeyedUnarchiver unarchiveObjectWithData:codecData];
sakal68b5df92017-03-17 09:01:59 -070081}
82
Anders Carlsson6bf43d22017-10-16 13:51:43 +020083- (BOOL)storeVideoCodecSetting:(RTCVideoCodecInfo *)videoCodec {
sakal68b5df92017-03-17 09:01:59 -070084 if (![[self availableVideoCodecs] containsObject:videoCodec]) {
85 return NO;
86 }
Anders Carlsson6bf43d22017-10-16 13:51:43 +020087 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:videoCodec];
88 [[self settingsStore] setVideoCodec:codecData];
sakal68b5df92017-03-17 09:01:59 -070089 return YES;
90}
91
denicija9af2b602016-11-17 00:43:43 -080092- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +020093 [self registerStoreDefaults];
denicija9af2b602016-11-17 00:43:43 -080094 return [[self settingsStore] maxBitrate];
95}
96
97- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
98 [[self settingsStore] setMaxBitrate:bitrate];
99}
100
Anders Carlssone1500582017-06-15 16:05:13 +0200101- (BOOL)currentAudioOnlySettingFromStore {
102 return [[self settingsStore] audioOnly];
103}
104
105- (void)storeAudioOnlySetting:(BOOL)audioOnly {
106 [[self settingsStore] setAudioOnly:audioOnly];
107}
108
109- (BOOL)currentCreateAecDumpSettingFromStore {
110 return [[self settingsStore] createAecDump];
111}
112
113- (void)storeCreateAecDumpSetting:(BOOL)createAecDump {
114 [[self settingsStore] setCreateAecDump:createAecDump];
115}
116
Anders Carlssone1500582017-06-15 16:05:13 +0200117- (BOOL)currentUseManualAudioConfigSettingFromStore {
118 return [[self settingsStore] useManualAudioConfig];
119}
120
121- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig {
122 [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig];
123}
124
denicijad17d5362016-11-02 02:56:09 -0700125#pragma mark - Testable
126
denicija2256e042016-11-09 06:26:18 -0800127- (ARDSettingsStore *)settingsStore {
denicijad17d5362016-11-02 02:56:09 -0700128 if (!_settingsStore) {
denicija2256e042016-11-09 06:26:18 -0800129 _settingsStore = [[ARDSettingsStore alloc] init];
Anders Carlssone1500582017-06-15 16:05:13 +0200130 [self registerStoreDefaults];
denicijad17d5362016-11-02 02:56:09 -0700131 }
132 return _settingsStore;
133}
134
sakalc522e752017-04-05 12:17:48 -0700135- (int)currentVideoResolutionWidthFromStore {
136 NSString *resolution = [self currentVideoResolutionSettingFromStore];
denicijad17d5362016-11-02 02:56:09 -0700137
sakalc522e752017-04-05 12:17:48 -0700138 return [self videoResolutionComponentAtIndex:0 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700139}
140
sakalc522e752017-04-05 12:17:48 -0700141- (int)currentVideoResolutionHeightFromStore {
142 NSString *resolution = [self currentVideoResolutionSettingFromStore];
143 return [self videoResolutionComponentAtIndex:1 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700144}
145
146#pragma mark -
147
sakalc522e752017-04-05 12:17:48 -0700148- (NSString *)defaultVideoResolutionSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200149 return [self availableVideoResolutions].firstObject;
denicijad17d5362016-11-02 02:56:09 -0700150}
151
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200152- (RTCVideoCodecInfo *)defaultVideoCodecSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200153 return [self availableVideoCodecs].firstObject;
Anders Carlssone1500582017-06-15 16:05:13 +0200154}
155
sakalc522e752017-04-05 12:17:48 -0700156- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
denicijad17d5362016-11-02 02:56:09 -0700157 if (index != 0 && index != 1) {
sakalc522e752017-04-05 12:17:48 -0700158 return 0;
denicijad17d5362016-11-02 02:56:09 -0700159 }
sakalc522e752017-04-05 12:17:48 -0700160 NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
denicijad17d5362016-11-02 02:56:09 -0700161 if (components.count != 2) {
sakalc522e752017-04-05 12:17:48 -0700162 return 0;
denicijad17d5362016-11-02 02:56:09 -0700163 }
sakalc522e752017-04-05 12:17:48 -0700164 return components[index].intValue;
denicijad17d5362016-11-02 02:56:09 -0700165}
166
Anders Carlssone1500582017-06-15 16:05:13 +0200167- (void)registerStoreDefaults {
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200168 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:[self defaultVideoCodecSetting]];
Anders Carlssone1500582017-06-15 16:05:13 +0200169 [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting]
Anders Carlsson6bf43d22017-10-16 13:51:43 +0200170 videoCodec:codecData
Anders Carlssone1500582017-06-15 16:05:13 +0200171 bitrate:nil
Daniela012b56b2017-11-15 13:15:24 +0100172 audioOnly:NO
Anders Carlssone1500582017-06-15 16:05:13 +0200173 createAecDump:NO
Anders Carlssone1500582017-06-15 16:05:13 +0200174 useManualAudioConfig:YES];
sakal68b5df92017-03-17 09:01:59 -0700175}
176
denicijad17d5362016-11-02 02:56:09 -0700177@end
178NS_ASSUME_NONNULL_END