blob: c628f0fde51fca67b01b7b1f5beed44bf98a5aae [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
Mirko Bonadei19640aa2020-10-19 16:12:43 +020014#import "sdk/objc/api/peerconnection/RTCMediaConstraints.h"
15#import "sdk/objc/components/capturer/RTCCameraVideoCapturer.h"
16#import "sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.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];
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020030 for (AVCaptureDevice *device in [RTC_OBJC_TYPE(RTCCameraVideoCapturer) captureDevices]) {
Anders Carlsson71230292017-06-09 16:06:14 +020031 for (AVCaptureDeviceFormat *format in
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020032 [RTC_OBJC_TYPE(RTCCameraVideoCapturer) supportedFormatsForDevice:device]) {
Anders Carlsson71230292017-06-09 16:06:14 +020033 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
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020073- (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)availableVideoCodecs {
74 return [RTC_OBJC_TYPE(RTCDefaultVideoEncoderFactory) supportedCodecs];
sakal68b5df92017-03-17 09:01:59 -070075}
76
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020077- (RTC_OBJC_TYPE(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];
Björn Terelius02768ae2021-07-02 16:19:32 +020080 Class expectedClass = [RTC_OBJC_TYPE(RTCVideoCodecInfo) class];
81 NSError *error;
82 RTC_OBJC_TYPE(RTCVideoCodecInfo) *videoCodecSetting =
83 [NSKeyedUnarchiver unarchivedObjectOfClass:expectedClass fromData:codecData error:&error];
84 if (!error) {
85 return videoCodecSetting;
86 }
87 return nil;
sakal68b5df92017-03-17 09:01:59 -070088}
89
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020090- (BOOL)storeVideoCodecSetting:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)videoCodec {
sakal68b5df92017-03-17 09:01:59 -070091 if (![[self availableVideoCodecs] containsObject:videoCodec]) {
92 return NO;
93 }
Björn Terelius02768ae2021-07-02 16:19:32 +020094
95 NSError *error;
96 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:videoCodec
97 requiringSecureCoding:NO
98 error:&error];
99 if (!error) {
100 [[self settingsStore] setVideoCodec:codecData];
101 return YES;
102 }
103 return NO;
sakal68b5df92017-03-17 09:01:59 -0700104}
105
denicija9af2b602016-11-17 00:43:43 -0800106- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
Anders Carlssone1500582017-06-15 16:05:13 +0200107 [self registerStoreDefaults];
denicija9af2b602016-11-17 00:43:43 -0800108 return [[self settingsStore] maxBitrate];
109}
110
111- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
112 [[self settingsStore] setMaxBitrate:bitrate];
113}
114
Anders Carlssone1500582017-06-15 16:05:13 +0200115- (BOOL)currentAudioOnlySettingFromStore {
116 return [[self settingsStore] audioOnly];
117}
118
119- (void)storeAudioOnlySetting:(BOOL)audioOnly {
120 [[self settingsStore] setAudioOnly:audioOnly];
121}
122
123- (BOOL)currentCreateAecDumpSettingFromStore {
124 return [[self settingsStore] createAecDump];
125}
126
127- (void)storeCreateAecDumpSetting:(BOOL)createAecDump {
128 [[self settingsStore] setCreateAecDump:createAecDump];
129}
130
Anders Carlssone1500582017-06-15 16:05:13 +0200131- (BOOL)currentUseManualAudioConfigSettingFromStore {
132 return [[self settingsStore] useManualAudioConfig];
133}
134
135- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig {
136 [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig];
137}
138
denicijad17d5362016-11-02 02:56:09 -0700139#pragma mark - Testable
140
denicija2256e042016-11-09 06:26:18 -0800141- (ARDSettingsStore *)settingsStore {
denicijad17d5362016-11-02 02:56:09 -0700142 if (!_settingsStore) {
denicija2256e042016-11-09 06:26:18 -0800143 _settingsStore = [[ARDSettingsStore alloc] init];
Anders Carlssone1500582017-06-15 16:05:13 +0200144 [self registerStoreDefaults];
denicijad17d5362016-11-02 02:56:09 -0700145 }
146 return _settingsStore;
147}
148
sakalc522e752017-04-05 12:17:48 -0700149- (int)currentVideoResolutionWidthFromStore {
150 NSString *resolution = [self currentVideoResolutionSettingFromStore];
denicijad17d5362016-11-02 02:56:09 -0700151
sakalc522e752017-04-05 12:17:48 -0700152 return [self videoResolutionComponentAtIndex:0 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700153}
154
sakalc522e752017-04-05 12:17:48 -0700155- (int)currentVideoResolutionHeightFromStore {
156 NSString *resolution = [self currentVideoResolutionSettingFromStore];
157 return [self videoResolutionComponentAtIndex:1 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700158}
159
160#pragma mark -
161
sakalc522e752017-04-05 12:17:48 -0700162- (NSString *)defaultVideoResolutionSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200163 return [self availableVideoResolutions].firstObject;
denicijad17d5362016-11-02 02:56:09 -0700164}
165
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200166- (RTC_OBJC_TYPE(RTCVideoCodecInfo) *)defaultVideoCodecSetting {
Peter Hanspersd92e0b52017-10-23 14:30:25 +0200167 return [self availableVideoCodecs].firstObject;
Anders Carlssone1500582017-06-15 16:05:13 +0200168}
169
sakalc522e752017-04-05 12:17:48 -0700170- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
denicijad17d5362016-11-02 02:56:09 -0700171 if (index != 0 && index != 1) {
sakalc522e752017-04-05 12:17:48 -0700172 return 0;
denicijad17d5362016-11-02 02:56:09 -0700173 }
sakalc522e752017-04-05 12:17:48 -0700174 NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
denicijad17d5362016-11-02 02:56:09 -0700175 if (components.count != 2) {
sakalc522e752017-04-05 12:17:48 -0700176 return 0;
denicijad17d5362016-11-02 02:56:09 -0700177 }
sakalc522e752017-04-05 12:17:48 -0700178 return components[index].intValue;
denicijad17d5362016-11-02 02:56:09 -0700179}
180
Anders Carlssone1500582017-06-15 16:05:13 +0200181- (void)registerStoreDefaults {
Björn Terelius02768ae2021-07-02 16:19:32 +0200182 NSError *error;
183 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:[self defaultVideoCodecSetting]
184 requiringSecureCoding:NO
185 error:&error];
186 if (!error) {
187 [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting]
188 videoCodec:codecData
189 bitrate:nil
190 audioOnly:NO
191 createAecDump:NO
192 useManualAudioConfig:YES];
193 }
sakal68b5df92017-03-17 09:01:59 -0700194}
denicijad17d5362016-11-02 02:56:09 -0700195@end
196NS_ASSUME_NONNULL_END