blob: 78d404a02da033197875a465c90e6b2b31c8a431 [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 {
59 NSString *resolution = [[self settingsStore] videoResolution];
60 if (!resolution) {
61 resolution = [self defaultVideoResolutionSetting];
denicijad17d5362016-11-02 02:56:09 -070062 // To ensure consistency add the default to the store.
sakalc522e752017-04-05 12:17:48 -070063 [[self settingsStore] setVideoResolution:resolution];
denicijad17d5362016-11-02 02:56:09 -070064 }
sakalc522e752017-04-05 12:17:48 -070065 return resolution;
denicijad17d5362016-11-02 02:56:09 -070066}
67
sakalc522e752017-04-05 12:17:48 -070068- (BOOL)storeVideoResolutionSetting:(NSString *)resolution {
69 if (![[self availableVideoResolutions] containsObject:resolution]) {
denicijad17d5362016-11-02 02:56:09 -070070 return NO;
71 }
sakalc522e752017-04-05 12:17:48 -070072 [[self settingsStore] setVideoResolution:resolution];
denicijad17d5362016-11-02 02:56:09 -070073 return YES;
74}
75
sakal68b5df92017-03-17 09:01:59 -070076- (NSArray<NSString *> *)availableVideoCodecs {
77 return videoCodecsStaticValues();
78}
79
80- (NSString *)currentVideoCodecSettingFromStore {
81 NSString *videoCodec = [[self settingsStore] videoCodec];
82 if (!videoCodec) {
83 videoCodec = [self defaultVideoCodecSetting];
84 [[self settingsStore] setVideoCodec:videoCodec];
85 }
86 return videoCodec;
87}
88
89- (BOOL)storeVideoCodecSetting:(NSString *)videoCodec {
90 if (![[self availableVideoCodecs] containsObject:videoCodec]) {
91 return NO;
92 }
93 [[self settingsStore] setVideoCodec:videoCodec];
94 return YES;
95}
96
denicija9af2b602016-11-17 00:43:43 -080097- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
98 return [[self settingsStore] maxBitrate];
99}
100
101- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
102 [[self settingsStore] setMaxBitrate:bitrate];
103}
104
denicijad17d5362016-11-02 02:56:09 -0700105#pragma mark - Testable
106
denicija2256e042016-11-09 06:26:18 -0800107- (ARDSettingsStore *)settingsStore {
denicijad17d5362016-11-02 02:56:09 -0700108 if (!_settingsStore) {
denicija2256e042016-11-09 06:26:18 -0800109 _settingsStore = [[ARDSettingsStore alloc] init];
denicijad17d5362016-11-02 02:56:09 -0700110 }
111 return _settingsStore;
112}
113
sakalc522e752017-04-05 12:17:48 -0700114- (int)currentVideoResolutionWidthFromStore {
115 NSString *resolution = [self currentVideoResolutionSettingFromStore];
denicijad17d5362016-11-02 02:56:09 -0700116
sakalc522e752017-04-05 12:17:48 -0700117 return [self videoResolutionComponentAtIndex:0 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700118}
119
sakalc522e752017-04-05 12:17:48 -0700120- (int)currentVideoResolutionHeightFromStore {
121 NSString *resolution = [self currentVideoResolutionSettingFromStore];
122 return [self videoResolutionComponentAtIndex:1 inString:resolution];
denicijad17d5362016-11-02 02:56:09 -0700123}
124
125#pragma mark -
126
sakalc522e752017-04-05 12:17:48 -0700127- (NSString *)defaultVideoResolutionSetting {
Anders Carlsson71230292017-06-09 16:06:14 +0200128 return [self availableVideoResolutions][0];
denicijad17d5362016-11-02 02:56:09 -0700129}
130
sakalc522e752017-04-05 12:17:48 -0700131- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
denicijad17d5362016-11-02 02:56:09 -0700132 if (index != 0 && index != 1) {
sakalc522e752017-04-05 12:17:48 -0700133 return 0;
denicijad17d5362016-11-02 02:56:09 -0700134 }
sakalc522e752017-04-05 12:17:48 -0700135 NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
denicijad17d5362016-11-02 02:56:09 -0700136 if (components.count != 2) {
sakalc522e752017-04-05 12:17:48 -0700137 return 0;
denicijad17d5362016-11-02 02:56:09 -0700138 }
sakalc522e752017-04-05 12:17:48 -0700139 return components[index].intValue;
denicijad17d5362016-11-02 02:56:09 -0700140}
141
sakal68b5df92017-03-17 09:01:59 -0700142- (NSString *)defaultVideoCodecSetting {
143 return videoCodecsStaticValues()[0];
144}
145
denicijad17d5362016-11-02 02:56:09 -0700146@end
147NS_ASSUME_NONNULL_END