From bfc0b899261d47f115d3816624a13801f193f520 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 2 Jun 2018 17:07:38 -0700 Subject: [PATCH] Add many new preferences to settings DB. Default HEVC to off due to reference frame invalidation not working --- Limelight/Database/DataManager.h | 2 +- Limelight/Database/DataManager.m | 4 ++-- Limelight/Database/TemporarySettings.h | 7 ++++++- Limelight/Database/TemporarySettings.m | 5 +++++ .../Moonlight v1.1.xcdatamodel/contents | 9 +++++++-- Limelight/Stream/Connection.m | 9 +++++++-- Limelight/Stream/StreamConfiguration.h | 3 ++- Limelight/Stream/StreamConfiguration.m | 2 +- .../ViewControllers/MainFrameViewController.m | 14 +++++++------- Limelight/ViewControllers/SettingsViewController.m | 5 ++--- 10 files changed, 40 insertions(+), 20 deletions(-) diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index 327c58e..8c7c7ed 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -14,7 +14,7 @@ @interface DataManager : NSObject - (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls remote: - (NSInteger)streamingRemotely; + (BOOL)streamingRemotely; - (NSArray*) getHosts; - (void) updateHost:(TemporaryHost*)host; diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 3bc742b..3adfc7f 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -54,7 +54,7 @@ } - (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls remote: - (NSInteger) streamingRemotely { + (BOOL) streamingRemotely { [_managedObjectContext performBlockAndWait:^{ Settings* settingsToSave = [self retrieveSettings]; @@ -64,7 +64,7 @@ settingsToSave.height = [NSNumber numberWithInteger:height]; settingsToSave.width = [NSNumber numberWithInteger:width]; settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls]; - settingsToSave.streamingRemotely = [NSNumber numberWithInteger:streamingRemotely]; + settingsToSave.streamingRemotely = streamingRemotely; [self saveData]; }]; diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index a2e34af..28caa35 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -18,7 +18,12 @@ @property (nonatomic, retain) NSNumber * width; @property (nonatomic, retain) NSNumber * onscreenControls; @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; diff --git a/Limelight/Database/TemporarySettings.m b/Limelight/Database/TemporarySettings.m index 9e17ecc..dcef089 100644 --- a/Limelight/Database/TemporarySettings.m +++ b/Limelight/Database/TemporarySettings.m @@ -22,6 +22,11 @@ self.onscreenControls = settings.onscreenControls; self.uniqueId = settings.uniqueId; 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; } diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.1.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.1.xcdatamodel/contents index 853831b..090bd63 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.1.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.1.xcdatamodel/contents @@ -20,16 +20,21 @@ + + - + + + + - + \ No newline at end of file diff --git a/Limelight/Stream/Connection.m b/Limelight/Stream/Connection.m index d950462..8bcd89a 100644 --- a/Limelight/Stream/Connection.m +++ b/Limelight/Stream/Connection.m @@ -297,6 +297,11 @@ void ClLogMessage(const char* format, ...) Log(LOG_E, @"Unknown audio channel count: %d", config.audioChannelCount); abort(); } + + // HDR implies HEVC allowed + if (config.enableHdr) { + config.allowHevc = YES; + } #if TARGET_OS_IPHONE // 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. // As a result, we will only use HEVC on iOS 11.3 or later. if (@available(iOS 11.3, *)) { - _streamConfig.supportsHevc = VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC); + _streamConfig.supportsHevc = config.allowHevc && VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC); } #else if (@available(macOS 10.13, *)) { // Streaming with limited bandwidth will result in better quality with HEVC if (VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) || _streamConfig.streamingRemotely != 0) - _streamConfig.supportsHevc = true; + _streamConfig.supportsHevc = config.allowHevc; } #endif diff --git a/Limelight/Stream/StreamConfiguration.h b/Limelight/Stream/StreamConfiguration.h index 110ceed..8bf8ee8 100644 --- a/Limelight/Stream/StreamConfiguration.h +++ b/Limelight/Stream/StreamConfiguration.h @@ -18,7 +18,7 @@ @property int frameRate; @property int bitRate; @property int riKeyId; -@property int streamingRemotely; +@property BOOL streamingRemotely; @property NSData* riKey; @property int gamepadMask; @property BOOL optimizeGameSettings; @@ -27,5 +27,6 @@ @property int audioChannelMask; @property BOOL enableHdr; @property BOOL multiController; +@property BOOL allowHevc; @end diff --git a/Limelight/Stream/StreamConfiguration.m b/Limelight/Stream/StreamConfiguration.m index f9625bb..3efa33a 100644 --- a/Limelight/Stream/StreamConfiguration.m +++ b/Limelight/Stream/StreamConfiguration.m @@ -9,5 +9,5 @@ #import "StreamConfiguration.h" @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 diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index 25b10ed..ef908a2 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -431,12 +431,12 @@ static NSMutableSet* hostList; _streamConfig.bitRate = [streamSettings.bitrate intValue]; _streamConfig.height = [streamSettings.height intValue]; _streamConfig.width = [streamSettings.width intValue]; - _streamConfig.streamingRemotely = [streamSettings.streamingRemotely intValue]; - _streamConfig.optimizeGameSettings = YES; - _streamConfig.playAudioOnPC = NO; + _streamConfig.streamingRemotely = streamSettings.streamingRemotely; + _streamConfig.optimizeGameSettings = streamSettings.optimizeGames; + _streamConfig.playAudioOnPC = streamSettings.playAudioOnPC; // multiController must be set before calling getConnectedGamepadMask - _streamConfig.multiController = YES; + _streamConfig.multiController = streamSettings.multiController; _streamConfig.gamepadMask = [ControllerSupport getConnectedGamepadMask:_streamConfig]; // 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. // 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 - // higher peak brightness than the iOS device can support to look correct in HDR mode. + // It should also be a user preference, since some games may require higher peak + // brightness than the iOS device can support to look correct in HDR mode. if (@available(iOS 11.3, *)) { _streamConfig.enableHdr = app.hdrSupported && // App supported (app.host.serverCodecModeSupport & 0x200) != 0 && // HEVC Main10 encoding on host PC GPU VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) && // Decoder supported (AVPlayer.availableHDRModes & AVPlayerHDRModeHDR10) != 0 && // Display supported - NO; // TODO: User wants it enabled + streamSettings.enableHdr; // User wants it enabled } } diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index 65d51bf..63e90cb 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -84,8 +84,7 @@ static NSString* bitrateFormat = @"Bitrate: %.1f Mbps"; } NSInteger onscreenControls = [currentSettings.onscreenControls integerValue]; - NSInteger streamingRemotely = [currentSettings.streamingRemotely integerValue]; - [self.remoteSelector setSelectedSegmentIndex:streamingRemotely]; + [self.remoteSelector setSelectedSegmentIndex:currentSettings.streamingRemotely ? 1 : 0]; [self.resolutionSelector setSelectedSegmentIndex:resolution]; [self.resolutionSelector addTarget:self action:@selector(newResolutionFpsChosen) forControlEvents:UIControlEventValueChanged]; [self.framerateSelector setSelectedSegmentIndex:framerate]; @@ -168,7 +167,7 @@ static NSString* bitrateFormat = @"Bitrate: %.1f Mbps"; NSInteger height = [self getChosenStreamHeight]; NSInteger width = [self getChosenStreamWidth]; 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 remote: streamingRemotely]; }