tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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