diff --git a/docs/README.pod b/docs/README.pod index 79712a1..4f94385 100644 --- a/docs/README.pod +++ b/docs/README.pod @@ -95,6 +95,11 @@ Change the network packetsize to I. The packetsize should the smaller than the MTU of the network. By default a safe value of 1024 is used. +=item B<-forcehevc> + +Request a h265/HEVC from the server. +Will still use h264 if server doesn't support HEVC. + =item B<-remote> Enable the optimizations for remote connections in GFE. diff --git a/libgamestream/client.c b/libgamestream/client.c index 0f0ecca..c80f88e 100644 --- a/libgamestream/client.c +++ b/libgamestream/client.c @@ -172,6 +172,7 @@ static int load_server_status(PSERVER_DATA server) { char *stateText = NULL; char *heightText = NULL; char *serverCodecModeSupportText = NULL; + char *maxLumaPixelsHEVC = NULL; uuid_t uuid; char uuid_str[37]; @@ -211,9 +212,13 @@ static int load_server_status(PSERVER_DATA server) { if (xml_search(data->memory, data->size, "ServerCodecModeSupport", &serverCodecModeSupportText) != GS_OK) goto cleanup; + if (xml_search(data->memory, data->size, "gputype", &server->gpuType) != GS_OK) + goto cleanup; + server->paired = pairedText != NULL && strcmp(pairedText, "1") == 0; server->currentGame = currentGameText == NULL ? 0 : atoi(currentGameText); server->supports4K = heightText != NULL && serverCodecModeSupportText != NULL && atoi(heightText) >= 2160; + server->maxLumaPixelsHEVC = maxLumaPixelsHEVC == NULL ? 0 : atol(maxLumaPixelsHEVC); char *versionSep = strstr(versionText, "."); if (versionSep != NULL) { *versionSep = 0; @@ -246,6 +251,9 @@ static int load_server_status(PSERVER_DATA server) { if (serverCodecModeSupportText != NULL) free(serverCodecModeSupportText); + if (maxLumaPixelsHEVC != NULL) + free(maxLumaPixelsHEVC); + return ret; } @@ -477,6 +485,11 @@ int gs_start_app(PSERVER_DATA server, STREAM_CONFIGURATION *config, int appId, b if (data == NULL) return GS_OUT_OF_MEMORY; + //Check support for H.265 video + //TODO: Find a better way to detect this + if (!(config->supportsHevc && server->maxLumaPixelsHEVC > 0 && server->gpuType != NULL && strstr(server->gpuType, "GTX 9"))) + config->supportsHevc = VIDEO_FORMAT_H264; + uuid_generate_random(uuid); uuid_unparse(uuid, uuid_str); if (server->currentGame == 0) { diff --git a/libgamestream/client.h b/libgamestream/client.h index 826a6c9..92051ce 100644 --- a/libgamestream/client.h +++ b/libgamestream/client.h @@ -27,10 +27,12 @@ typedef struct _SERVER_DATA { const char* address; + char* gpuType; bool paired; bool supports4K; int currentGame; int serverMajorVersion; + long maxLumaPixelsHEVC; } SERVER_DATA, *PSERVER_DATA; int gs_init(PSERVER_DATA server, const char *keyDirectory); diff --git a/moonlight.conf b/moonlight.conf index 0909648..a800d6c 100644 --- a/moonlight.conf +++ b/moonlight.conf @@ -17,6 +17,9 @@ ## Size of network packets should be lower than MTU #packetsize = 1024 +## Use of h265/HEVC video codec +#h265 = false + ## Default started application on host #app = Steam diff --git a/src/config.c b/src/config.c index eecda4c..6bfef0e 100644 --- a/src/config.c +++ b/src/config.c @@ -202,7 +202,7 @@ static void parse_argument(int c, char* value, PCONFIGURATION config) { config->forcehw = true; break; case 'x': - config->hevc = true; + config->stream.supportsHevc = true; break; case 1: if (config->action == NULL) @@ -285,6 +285,7 @@ void config_parse(int argc, char* argv[], PCONFIGURATION config) { config->stream.packetSize = 1024; config->stream.streamingRemotely = 0; config->stream.audioConfiguration = AUDIO_CONFIGURATION_STEREO; + config->stream.supportsHevc = false; config->platform = "default"; config->app = "Steam"; @@ -294,7 +295,6 @@ void config_parse(int argc, char* argv[], PCONFIGURATION config) { config->sops = true; config->localaudio = false; config->fullscreen = true; - config->hevc = false; config->inputsCount = 0; config->mapping = get_path("mappings/default.conf", getenv("XDG_DATA_DIRS")); diff --git a/src/config.h b/src/config.h index 8479b3c..9b88b5c 100644 --- a/src/config.h +++ b/src/config.h @@ -43,7 +43,6 @@ typedef struct _CONFIGURATION { bool forcehw; struct input_config inputs[MAX_INPUTS]; int inputsCount; - bool hevc; } CONFIGURATION, *PCONFIGURATION; bool inputAdded; diff --git a/src/main.c b/src/main.c index 3f12e49..238768e 100644 --- a/src/main.c +++ b/src/main.c @@ -83,11 +83,6 @@ static void stream(PSERVER_DATA server, PCONFIGURATION config, enum platform sys exit(-1); } - // h265 - if (config->hevc) { - config->stream.supportsHevc = 1; - } - int ret = gs_start_app(server, &config->stream, appId, config->sops, config->localaudio); if (ret < 0) { if (ret == GS_NOT_SUPPORTED_4K) @@ -142,7 +137,7 @@ static void help() { printf("\t-60fps\t\t\tUse 60fps [default]\n"); printf("\t-bitrate \tSpecify the bitrate in Kbps\n"); printf("\t-packetsize \tSpecify the maximum packetsize in bytes\n"); - printf("\t-hevc \t\tUse high efficiency video decoding (HEVC)\n"); + printf("\t-forcehevc\t\tUse high efficiency video decoding (HEVC)\n"); printf("\t-remote\t\t\tEnable remote optimizations\n"); printf("\t-app \t\tName of app to stream\n"); printf("\t-nosops\t\t\tDon't allow GFE to modify game settings\n");