Add many new preferences to settings DB. Default HEVC to off due to reference frame invalidation not working

This commit is contained in:
Cameron Gutman
2018-06-02 17:07:38 -07:00
parent 2f0e219726
commit bfc0b89926
10 changed files with 40 additions and 20 deletions

View File

@@ -14,7 +14,7 @@
@interface DataManager : NSObject @interface DataManager : NSObject
- (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls remote: - (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls remote:
(NSInteger)streamingRemotely; (BOOL)streamingRemotely;
- (NSArray*) getHosts; - (NSArray*) getHosts;
- (void) updateHost:(TemporaryHost*)host; - (void) updateHost:(TemporaryHost*)host;

View File

@@ -54,7 +54,7 @@
} }
- (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls remote: - (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls remote:
(NSInteger) streamingRemotely { (BOOL) streamingRemotely {
[_managedObjectContext performBlockAndWait:^{ [_managedObjectContext performBlockAndWait:^{
Settings* settingsToSave = [self retrieveSettings]; Settings* settingsToSave = [self retrieveSettings];
@@ -64,7 +64,7 @@
settingsToSave.height = [NSNumber numberWithInteger:height]; settingsToSave.height = [NSNumber numberWithInteger:height];
settingsToSave.width = [NSNumber numberWithInteger:width]; settingsToSave.width = [NSNumber numberWithInteger:width];
settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls]; settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls];
settingsToSave.streamingRemotely = [NSNumber numberWithInteger:streamingRemotely]; settingsToSave.streamingRemotely = streamingRemotely;
[self saveData]; [self saveData];
}]; }];

View File

@@ -18,7 +18,12 @@
@property (nonatomic, retain) NSNumber * width; @property (nonatomic, retain) NSNumber * width;
@property (nonatomic, retain) NSNumber * onscreenControls; @property (nonatomic, retain) NSNumber * onscreenControls;
@property (nonatomic, retain) NSString * uniqueId; @property (nonatomic, retain) NSString * uniqueId;
@property (nonatomic, retain) NSNumber * streamingRemotely; @property (nonatomic) BOOL streamingRemotely;
@property (nonatomic) BOOL useHevc;
@property (nonatomic) BOOL multiController;
@property (nonatomic) BOOL playAudioOnPC;
@property (nonatomic) BOOL optimizeGames;
@property (nonatomic) BOOL enableHdr;
- (id) initFromSettings:(Settings*)settings; - (id) initFromSettings:(Settings*)settings;

View File

@@ -22,6 +22,11 @@
self.onscreenControls = settings.onscreenControls; self.onscreenControls = settings.onscreenControls;
self.uniqueId = settings.uniqueId; self.uniqueId = settings.uniqueId;
self.streamingRemotely = settings.streamingRemotely; self.streamingRemotely = settings.streamingRemotely;
self.useHevc = settings.useHevc;
self.multiController = settings.multiController;
self.playAudioOnPC = settings.playAudioOnPC;
self.enableHdr = settings.enableHdr;
self.optimizeGames = settings.optimizeGames;
return self; return self;
} }

View File

@@ -20,16 +20,21 @@
</entity> </entity>
<entity name="Settings" representedClassName="Settings" syncable="YES" codeGenerationType="class"> <entity name="Settings" representedClassName="Settings" syncable="YES" codeGenerationType="class">
<attribute name="bitrate" attributeType="Integer 32" defaultValueString="10000" usesScalarValueType="NO" syncable="YES"/> <attribute name="bitrate" attributeType="Integer 32" defaultValueString="10000" usesScalarValueType="NO" syncable="YES"/>
<attribute name="enableHdr" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
<attribute name="framerate" attributeType="Integer 32" defaultValueString="60" usesScalarValueType="NO" syncable="YES"/> <attribute name="framerate" attributeType="Integer 32" defaultValueString="60" usesScalarValueType="NO" syncable="YES"/>
<attribute name="height" attributeType="Integer 32" defaultValueString="720" usesScalarValueType="NO" syncable="YES"/> <attribute name="height" attributeType="Integer 32" defaultValueString="720" usesScalarValueType="NO" syncable="YES"/>
<attribute name="multiController" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
<attribute name="onscreenControls" attributeType="Integer 32" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/> <attribute name="onscreenControls" attributeType="Integer 32" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
<attribute name="streamingRemotely" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> <attribute name="optimizeGames" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/>
<attribute name="playAudioOnPC" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
<attribute name="streamingRemotely" attributeType="Boolean" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
<attribute name="uniqueId" attributeType="String" syncable="YES"/> <attribute name="uniqueId" attributeType="String" syncable="YES"/>
<attribute name="useHevc" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
<attribute name="width" attributeType="Integer 32" defaultValueString="1280" usesScalarValueType="NO" syncable="YES"/> <attribute name="width" attributeType="Integer 32" defaultValueString="1280" usesScalarValueType="NO" syncable="YES"/>
</entity> </entity>
<elements> <elements>
<element name="App" positionX="0" positionY="54" width="128" height="105"/> <element name="App" positionX="0" positionY="54" width="128" height="105"/>
<element name="Host" positionX="0" positionY="0" width="128" height="165"/> <element name="Host" positionX="0" positionY="0" width="128" height="165"/>
<element name="Settings" positionX="0" positionY="0" width="128" height="30"/> <element name="Settings" positionX="0" positionY="0" width="128" height="225"/>
</elements> </elements>
</model> </model>

View File

@@ -297,6 +297,11 @@ void ClLogMessage(const char* format, ...)
Log(LOG_E, @"Unknown audio channel count: %d", config.audioChannelCount); Log(LOG_E, @"Unknown audio channel count: %d", config.audioChannelCount);
abort(); abort();
} }
// HDR implies HEVC allowed
if (config.enableHdr) {
config.allowHevc = YES;
}
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
// On iOS 11, we can use HEVC if the server supports encoding it // On iOS 11, we can use HEVC if the server supports encoding it
@@ -305,13 +310,13 @@ void ClLogMessage(const char* format, ...)
// to freeze after a few minutes with HEVC prior to iOS 11.3. // to freeze after a few minutes with HEVC prior to iOS 11.3.
// As a result, we will only use HEVC on iOS 11.3 or later. // As a result, we will only use HEVC on iOS 11.3 or later.
if (@available(iOS 11.3, *)) { if (@available(iOS 11.3, *)) {
_streamConfig.supportsHevc = VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC); _streamConfig.supportsHevc = config.allowHevc && VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC);
} }
#else #else
if (@available(macOS 10.13, *)) { if (@available(macOS 10.13, *)) {
// Streaming with limited bandwidth will result in better quality with HEVC // Streaming with limited bandwidth will result in better quality with HEVC
if (VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) || _streamConfig.streamingRemotely != 0) if (VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) || _streamConfig.streamingRemotely != 0)
_streamConfig.supportsHevc = true; _streamConfig.supportsHevc = config.allowHevc;
} }
#endif #endif

View File

@@ -18,7 +18,7 @@
@property int frameRate; @property int frameRate;
@property int bitRate; @property int bitRate;
@property int riKeyId; @property int riKeyId;
@property int streamingRemotely; @property BOOL streamingRemotely;
@property NSData* riKey; @property NSData* riKey;
@property int gamepadMask; @property int gamepadMask;
@property BOOL optimizeGameSettings; @property BOOL optimizeGameSettings;
@@ -27,5 +27,6 @@
@property int audioChannelMask; @property int audioChannelMask;
@property BOOL enableHdr; @property BOOL enableHdr;
@property BOOL multiController; @property BOOL multiController;
@property BOOL allowHevc;
@end @end

View File

@@ -9,5 +9,5 @@
#import "StreamConfiguration.h" #import "StreamConfiguration.h"
@implementation StreamConfiguration @implementation StreamConfiguration
@synthesize host, appID, width, height, frameRate, bitRate, riKeyId, riKey, gamepadMask, streamingRemotely, appName, optimizeGameSettings, playAudioOnPC, audioChannelMask, audioChannelCount, enableHdr, multiController; @synthesize host, appID, width, height, frameRate, bitRate, riKeyId, riKey, gamepadMask, streamingRemotely, appName, optimizeGameSettings, playAudioOnPC, audioChannelMask, audioChannelCount, enableHdr, multiController, allowHevc;
@end @end

View File

@@ -431,12 +431,12 @@ static NSMutableSet* hostList;
_streamConfig.bitRate = [streamSettings.bitrate intValue]; _streamConfig.bitRate = [streamSettings.bitrate intValue];
_streamConfig.height = [streamSettings.height intValue]; _streamConfig.height = [streamSettings.height intValue];
_streamConfig.width = [streamSettings.width intValue]; _streamConfig.width = [streamSettings.width intValue];
_streamConfig.streamingRemotely = [streamSettings.streamingRemotely intValue]; _streamConfig.streamingRemotely = streamSettings.streamingRemotely;
_streamConfig.optimizeGameSettings = YES; _streamConfig.optimizeGameSettings = streamSettings.optimizeGames;
_streamConfig.playAudioOnPC = NO; _streamConfig.playAudioOnPC = streamSettings.playAudioOnPC;
// multiController must be set before calling getConnectedGamepadMask // multiController must be set before calling getConnectedGamepadMask
_streamConfig.multiController = YES; _streamConfig.multiController = streamSettings.multiController;
_streamConfig.gamepadMask = [ControllerSupport getConnectedGamepadMask:_streamConfig]; _streamConfig.gamepadMask = [ControllerSupport getConnectedGamepadMask:_streamConfig];
// TODO: Detect attached surround sound system then address 5.1 TODOs // TODO: Detect attached surround sound system then address 5.1 TODOs
@@ -447,15 +447,15 @@ static NSMutableSet* hostList;
// HDR requires HDR10 game, HDR10 display, and HEVC Main10 decoder on the client. // HDR requires HDR10 game, HDR10 display, and HEVC Main10 decoder on the client.
// It additionally requires an HEVC Main10 encoder on the server (GTX 1000+). // It additionally requires an HEVC Main10 encoder on the server (GTX 1000+).
// //
// It should also be a user preference when supported, since some games may require // It should also be a user preference, since some games may require higher peak
// higher peak brightness than the iOS device can support to look correct in HDR mode. // brightness than the iOS device can support to look correct in HDR mode.
if (@available(iOS 11.3, *)) { if (@available(iOS 11.3, *)) {
_streamConfig.enableHdr = _streamConfig.enableHdr =
app.hdrSupported && // App supported app.hdrSupported && // App supported
(app.host.serverCodecModeSupport & 0x200) != 0 && // HEVC Main10 encoding on host PC GPU (app.host.serverCodecModeSupport & 0x200) != 0 && // HEVC Main10 encoding on host PC GPU
VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) && // Decoder supported VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) && // Decoder supported
(AVPlayer.availableHDRModes & AVPlayerHDRModeHDR10) != 0 && // Display supported (AVPlayer.availableHDRModes & AVPlayerHDRModeHDR10) != 0 && // Display supported
NO; // TODO: User wants it enabled streamSettings.enableHdr; // User wants it enabled
} }
} }

View File

@@ -84,8 +84,7 @@ static NSString* bitrateFormat = @"Bitrate: %.1f Mbps";
} }
NSInteger onscreenControls = [currentSettings.onscreenControls integerValue]; NSInteger onscreenControls = [currentSettings.onscreenControls integerValue];
NSInteger streamingRemotely = [currentSettings.streamingRemotely integerValue]; [self.remoteSelector setSelectedSegmentIndex:currentSettings.streamingRemotely ? 1 : 0];
[self.remoteSelector setSelectedSegmentIndex:streamingRemotely];
[self.resolutionSelector setSelectedSegmentIndex:resolution]; [self.resolutionSelector setSelectedSegmentIndex:resolution];
[self.resolutionSelector addTarget:self action:@selector(newResolutionFpsChosen) forControlEvents:UIControlEventValueChanged]; [self.resolutionSelector addTarget:self action:@selector(newResolutionFpsChosen) forControlEvents:UIControlEventValueChanged];
[self.framerateSelector setSelectedSegmentIndex:framerate]; [self.framerateSelector setSelectedSegmentIndex:framerate];
@@ -168,7 +167,7 @@ static NSString* bitrateFormat = @"Bitrate: %.1f Mbps";
NSInteger height = [self getChosenStreamHeight]; NSInteger height = [self getChosenStreamHeight];
NSInteger width = [self getChosenStreamWidth]; NSInteger width = [self getChosenStreamWidth];
NSInteger onscreenControls = [self.onscreenControlSelector selectedSegmentIndex]; NSInteger onscreenControls = [self.onscreenControlSelector selectedSegmentIndex];
NSInteger streamingRemotely = [self.remoteSelector selectedSegmentIndex]; BOOL streamingRemotely = [self.remoteSelector selectedSegmentIndex] == 1 ? YES : NO;
[dataMan saveSettingsWithBitrate:_bitrate framerate:framerate height:height width:width onscreenControls:onscreenControls [dataMan saveSettingsWithBitrate:_bitrate framerate:framerate height:height width:width onscreenControls:onscreenControls
remote: streamingRemotely]; remote: streamingRemotely];
} }