ARDSettingsModel.m (7103B)
1 /* 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 11 #import "ARDSettingsModel+Private.h" 12 #import "ARDSettingsStore.h" 13 14 #import "sdk/objc/api/peerconnection/RTCMediaConstraints.h" 15 #import "sdk/objc/components/capturer/RTCCameraVideoCapturer.h" 16 #import "sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h" 17 18 NS_ASSUME_NONNULL_BEGIN 19 20 @interface ARDSettingsModel () { 21 ARDSettingsStore *_settingsStore; 22 } 23 @end 24 25 @implementation ARDSettingsModel 26 27 - (NSArray<NSString *> *)availableVideoResolutions { 28 NSMutableSet<NSArray<NSNumber *> *> *resolutions = 29 [[NSMutableSet<NSArray<NSNumber *> *> alloc] init]; 30 for (AVCaptureDevice *device in 31 [RTC_OBJC_TYPE(RTCCameraVideoCapturer) captureDevices]) { 32 for (AVCaptureDeviceFormat *format in [RTC_OBJC_TYPE(RTCCameraVideoCapturer) 33 supportedFormatsForDevice:device]) { 34 CMVideoDimensions resolution = 35 CMVideoFormatDescriptionGetDimensions(format.formatDescription); 36 NSArray<NSNumber *> *resolutionObject = 37 @[ @(resolution.width), @(resolution.height) ]; 38 [resolutions addObject:resolutionObject]; 39 } 40 } 41 42 NSArray<NSArray<NSNumber *> *> *sortedResolutions = [[resolutions allObjects] 43 sortedArrayUsingComparator:^NSComparisonResult( 44 NSArray<NSNumber *> *obj1, NSArray<NSNumber *> *obj2) { 45 NSComparisonResult cmp = [obj1.firstObject compare:obj2.firstObject]; 46 if (cmp != NSOrderedSame) { 47 return cmp; 48 } 49 return [obj1.lastObject compare:obj2.lastObject]; 50 }]; 51 52 NSMutableArray<NSString *> *resolutionStrings = 53 [[NSMutableArray<NSString *> alloc] init]; 54 for (NSArray<NSNumber *> *resolution in sortedResolutions) { 55 NSString *resolutionString = 56 [NSString stringWithFormat:@"%@x%@", 57 resolution.firstObject, 58 resolution.lastObject]; 59 [resolutionStrings addObject:resolutionString]; 60 } 61 62 return [resolutionStrings copy]; 63 } 64 65 - (NSString *)currentVideoResolutionSettingFromStore { 66 [self registerStoreDefaults]; 67 return [[self settingsStore] videoResolution]; 68 } 69 70 - (BOOL)storeVideoResolutionSetting:(NSString *)resolution { 71 if (![[self availableVideoResolutions] containsObject:resolution]) { 72 return NO; 73 } 74 [[self settingsStore] setVideoResolution:resolution]; 75 return YES; 76 } 77 78 - (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)availableVideoCodecs { 79 return [RTC_OBJC_TYPE(RTCDefaultVideoEncoderFactory) supportedCodecs]; 80 } 81 82 - (RTC_OBJC_TYPE(RTCVideoCodecInfo) *)currentVideoCodecSettingFromStore { 83 [self registerStoreDefaults]; 84 NSData *codecData = [[self settingsStore] videoCodec]; 85 #if defined(WEBRTC_IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 86 Class expectedClass = [RTC_OBJC_TYPE(RTCVideoCodecInfo) class]; 87 NSError *error; 88 RTC_OBJC_TYPE(RTCVideoCodecInfo) *videoCodecSetting = 89 [NSKeyedUnarchiver unarchivedObjectOfClass:expectedClass 90 fromData:codecData 91 error:&error]; 92 if (!error) { 93 return videoCodecSetting; 94 } 95 return nil; 96 #else 97 return [NSKeyedUnarchiver unarchiveObjectWithData:codecData]; 98 #endif 99 } 100 101 - (BOOL)storeVideoCodecSetting:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)videoCodec { 102 if (![[self availableVideoCodecs] containsObject:videoCodec]) { 103 return NO; 104 } 105 106 #if defined(WEBRTC_IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 107 NSError *error; 108 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:videoCodec 109 requiringSecureCoding:NO 110 error:&error]; 111 if (error) { 112 return NO; 113 } 114 #else 115 NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:videoCodec]; 116 #endif 117 118 [[self settingsStore] setVideoCodec:codecData]; 119 return YES; 120 } 121 122 - (nullable NSNumber *)currentMaxBitrateSettingFromStore { 123 [self registerStoreDefaults]; 124 return [[self settingsStore] maxBitrate]; 125 } 126 127 - (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate { 128 [[self settingsStore] setMaxBitrate:bitrate]; 129 } 130 131 - (BOOL)currentAudioOnlySettingFromStore { 132 return [[self settingsStore] audioOnly]; 133 } 134 135 - (void)storeAudioOnlySetting:(BOOL)audioOnly { 136 [[self settingsStore] setAudioOnly:audioOnly]; 137 } 138 139 - (BOOL)currentCreateAecDumpSettingFromStore { 140 return [[self settingsStore] createAecDump]; 141 } 142 143 - (void)storeCreateAecDumpSetting:(BOOL)createAecDump { 144 [[self settingsStore] setCreateAecDump:createAecDump]; 145 } 146 147 - (BOOL)currentUseManualAudioConfigSettingFromStore { 148 return [[self settingsStore] useManualAudioConfig]; 149 } 150 151 - (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig { 152 [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig]; 153 } 154 155 #pragma mark - Testable 156 157 - (ARDSettingsStore *)settingsStore { 158 if (!_settingsStore) { 159 _settingsStore = [[ARDSettingsStore alloc] init]; 160 [self registerStoreDefaults]; 161 } 162 return _settingsStore; 163 } 164 165 - (int)currentVideoResolutionWidthFromStore { 166 NSString *resolution = [self currentVideoResolutionSettingFromStore]; 167 168 return [self videoResolutionComponentAtIndex:0 inString:resolution]; 169 } 170 171 - (int)currentVideoResolutionHeightFromStore { 172 NSString *resolution = [self currentVideoResolutionSettingFromStore]; 173 return [self videoResolutionComponentAtIndex:1 inString:resolution]; 174 } 175 176 #pragma mark - 177 178 - (NSString *)defaultVideoResolutionSetting { 179 return [self availableVideoResolutions].firstObject; 180 } 181 182 - (RTC_OBJC_TYPE(RTCVideoCodecInfo) *)defaultVideoCodecSetting { 183 return [self availableVideoCodecs].firstObject; 184 } 185 186 - (int)videoResolutionComponentAtIndex:(int)index 187 inString:(NSString *)resolution { 188 if (index != 0 && index != 1) { 189 return 0; 190 } 191 NSArray<NSString *> *components = 192 [resolution componentsSeparatedByString:@"x"]; 193 if (components.count != 2) { 194 return 0; 195 } 196 return components[index].intValue; 197 } 198 199 - (void)registerStoreDefaults { 200 #if defined(WEBRTC_IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 201 NSError *error; 202 NSData *codecData = [NSKeyedArchiver 203 archivedDataWithRootObject:[self defaultVideoCodecSetting] 204 requiringSecureCoding:NO 205 error:&error]; 206 if (error) { 207 return; 208 } 209 #else 210 NSData *codecData = [NSKeyedArchiver 211 archivedDataWithRootObject:[self defaultVideoCodecSetting]]; 212 #endif 213 214 [ARDSettingsStore 215 setDefaultsForVideoResolution:[self defaultVideoResolutionSetting] 216 videoCodec:codecData 217 bitrate:nil 218 audioOnly:NO 219 createAecDump:NO 220 useManualAudioConfig:YES]; 221 } 222 @end 223 NS_ASSUME_NONNULL_END