Merge remote-tracking branch 'cgutman/gen7fixes'

This commit is contained in:
Iwan Timmer
2016-04-01 11:11:44 +02:00
20 changed files with 105 additions and 86 deletions
+1 -1
View File
@@ -41,7 +41,7 @@ else()
set(SOFTWARE_FOUND FALSE) set(SOFTWARE_FOUND FALSE)
endif() endif()
SET(MOONLIGHT_COMMON_INCLUDE_DIR ./third_party/moonlight-common-c) SET(MOONLIGHT_COMMON_INCLUDE_DIR ./third_party/moonlight-common-c/src)
SET(GAMESTREAM_INCLUDE_DIR ./libgamestream) SET(GAMESTREAM_INCLUDE_DIR ./libgamestream)
if(CMAKE_BUILD_TYPE MATCHES Debug) if(CMAKE_BUILD_TYPE MATCHES Debug)
+2 -3
View File
@@ -10,8 +10,7 @@ pkg_check_modules(ENET REQUIRED libenet)
aux_source_directory(./ GAMESTREAM_SRC_LIST) aux_source_directory(./ GAMESTREAM_SRC_LIST)
aux_source_directory(../third_party/h264bitstream GAMESTREAM_SRC_LIST) aux_source_directory(../third_party/h264bitstream GAMESTREAM_SRC_LIST)
aux_source_directory(../third_party/moonlight-common-c/limelight-common MOONLIGHT_COMMON_SRC_LIST) aux_source_directory(../third_party/moonlight-common-c/src MOONLIGHT_COMMON_SRC_LIST)
aux_source_directory(../third_party/moonlight-common-c/limelight-common/OpenAES MOONLIGHT_COMMON_SRC_LIST)
add_library(moonlight-common SHARED ${MOONLIGHT_COMMON_SRC_LIST}) add_library(moonlight-common SHARED ${MOONLIGHT_COMMON_SRC_LIST})
@@ -22,7 +21,7 @@ target_link_libraries(gamestream moonlight-common)
set_target_properties(gamestream PROPERTIES SOVERSION 0 VERSION ${MOONLIGHT_VERSION}) set_target_properties(gamestream PROPERTIES SOVERSION 0 VERSION ${MOONLIGHT_VERSION})
set_target_properties(moonlight-common PROPERTIES SOVERSION 0 VERSION ${MOONLIGHT_VERSION}) set_target_properties(moonlight-common PROPERTIES SOVERSION 0 VERSION ${MOONLIGHT_VERSION})
target_include_directories(gamestream PRIVATE ../third_party/moonlight-common-c ../third_party/h264bitstream ${AVAHI_INCLUDE_DIRS} ${LIBUUID_INCLUDE_DIRS}) target_include_directories(gamestream PRIVATE ../third_party/moonlight-common-c/src ../third_party/h264bitstream ${AVAHI_INCLUDE_DIRS} ${LIBUUID_INCLUDE_DIRS})
target_include_directories(moonlight-common PRIVATE ${ENET_INCLUDE_DIRS}) target_include_directories(moonlight-common PRIVATE ${ENET_INCLUDE_DIRS})
target_link_libraries(gamestream ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} ${EXPAT_LIBRARIES} ${AVAHI_LIBRARIES} ${LIBUUID_LIBRARIES}) target_link_libraries(gamestream ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} ${EXPAT_LIBRARIES} ${AVAHI_LIBRARIES} ${LIBUUID_LIBRARIES})
target_link_libraries(moonlight-common ${ENET_LIBRARIES}) target_link_libraries(moonlight-common ${ENET_LIBRARIES})
+85 -65
View File
@@ -23,7 +23,7 @@
#include "client.h" #include "client.h"
#include "errors.h" #include "errors.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdbool.h> #include <stdbool.h>
@@ -166,87 +166,107 @@ static int load_cert(const char* keyDirectory) {
} }
static int load_server_status(PSERVER_DATA server) { static int load_server_status(PSERVER_DATA server) {
char *pairedText = NULL;
char *currentGameText = NULL;
char *versionText = NULL;
char *stateText = NULL;
char *heightText = NULL;
char *serverCodecModeSupportText = NULL;
uuid_t uuid; uuid_t uuid;
char uuid_str[37]; char uuid_str[37];
int ret = GS_INVALID; int ret;
char url[4096]; char url[4096];
uuid_generate_random(uuid); int i;
uuid_unparse(uuid, uuid_str);
sprintf(url, "https://%s:47984/serverinfo?uniqueid=%s&uuid=%s", server->address, unique_id, uuid_str);
PHTTP_DATA data = http_create_data(); i = 0;
if (data == NULL) { do {
ret = GS_OUT_OF_MEMORY; char *pairedText = NULL;
goto cleanup; char *currentGameText = NULL;
} char *versionText = NULL;
if (http_request(url, data) != GS_OK) { char *stateText = NULL;
ret = GS_IO_ERROR; char *heightText = NULL;
goto cleanup; char *serverCodecModeSupportText = NULL;
}
if (xml_search(data->memory, data->size, "currentgame", &currentGameText) != GS_OK) { ret = GS_INVALID;
goto cleanup;
}
if (xml_search(data->memory, data->size, "PairStatus", &pairedText) != GS_OK) uuid_generate_random(uuid);
goto cleanup; uuid_unparse(uuid, uuid_str);
if (xml_search(data->memory, data->size, "appversion", &versionText) != GS_OK) // Modern GFE versions don't allow serverinfo to be fetched over HTTPS if the client
goto cleanup; // is not already paired. Since we can't pair without knowing the server version, we
// make another request over HTTP if the HTTPS request fails. We can't just use HTTP
// for everything because it doesn't accurately tell us if we're paired.
sprintf(url, "%s://%s:%d/serverinfo?uniqueid=%s&uuid=%s",
i == 0 ? "https" : "http", server->address, i == 0 ? 47984 : 47989, unique_id, uuid_str);
if (xml_search(data->memory, data->size, "state", &stateText) != GS_OK) PHTTP_DATA data = http_create_data();
goto cleanup; if (data == NULL) {
ret = GS_OUT_OF_MEMORY;
goto cleanup;
}
if (http_request(url, data) != GS_OK) {
ret = GS_IO_ERROR;
goto cleanup;
}
if (xml_search(data->memory, data->size, "Height", &heightText) != GS_OK) if (xml_search(data->memory, data->size, "currentgame", &currentGameText) != GS_OK) {
goto cleanup; goto cleanup;
}
if (xml_search(data->memory, data->size, "ServerCodecModeSupport", &serverCodecModeSupportText) != GS_OK) if (xml_search(data->memory, data->size, "PairStatus", &pairedText) != GS_OK)
goto cleanup; goto cleanup;
if (xml_search(data->memory, data->size, "gputype", &server->gpuType) != GS_OK) if (xml_search(data->memory, data->size, "appversion", &versionText) != GS_OK)
goto cleanup; goto cleanup;
if (xml_search(data->memory, data->size, "GfeVersion", &server->gfeVersion) != GS_OK) if (xml_search(data->memory, data->size, "state", &stateText) != GS_OK)
goto cleanup; goto cleanup;
server->paired = pairedText != NULL && strcmp(pairedText, "1") == 0; if (xml_search(data->memory, data->size, "Height", &heightText) != GS_OK)
server->currentGame = currentGameText == NULL ? 0 : atoi(currentGameText); goto cleanup;
server->supports4K = heightText != NULL && serverCodecModeSupportText != NULL && atoi(heightText) >= 2160;
server->serverMajorVersion = atoi(versionText);
if (strstr(stateText, "_SERVER_AVAILABLE")) {
// After GFE 2.8, current game remains set even after streaming
// has ended. We emulate the old behavior by forcing it to zero
// if streaming is not active.
server->currentGame = 0;
}
ret = GS_OK;
cleanup: if (xml_search(data->memory, data->size, "ServerCodecModeSupport", &serverCodecModeSupportText) != GS_OK)
if (data != NULL) goto cleanup;
http_free_data(data);
if (pairedText != NULL) if (xml_search(data->memory, data->size, "gputype", &server->gpuType) != GS_OK)
free(pairedText); goto cleanup;
if (currentGameText != NULL) if (xml_search(data->memory, data->size, "GfeVersion", &server->gfeVersion) != GS_OK)
free(currentGameText); goto cleanup;
if (versionText != NULL) // These fields are present on all version of GFE that this client supports
free(versionText); if (!strlen(currentGameText) || !strlen(pairedText) || !strlen(versionText) || !strlen(stateText))
goto cleanup;
if (heightText != NULL) server->paired = pairedText != NULL && strcmp(pairedText, "1") == 0;
free(heightText); server->currentGame = currentGameText == NULL ? 0 : atoi(currentGameText);
server->supports4K = heightText != NULL && serverCodecModeSupportText != NULL && atoi(heightText) >= 2160;
server->serverMajorVersion = atoi(versionText);
if (strstr(stateText, "_SERVER_AVAILABLE")) {
// After GFE 2.8, current game remains set even after streaming
// has ended. We emulate the old behavior by forcing it to zero
// if streaming is not active.
server->currentGame = 0;
}
ret = GS_OK;
if (serverCodecModeSupportText != NULL) cleanup:
free(serverCodecModeSupportText); if (data != NULL)
http_free_data(data);
if (pairedText != NULL)
free(pairedText);
if (currentGameText != NULL)
free(currentGameText);
if (versionText != NULL)
free(versionText);
if (heightText != NULL)
free(heightText);
if (serverCodecModeSupportText != NULL)
free(serverCodecModeSupportText);
i++;
} while (ret != GS_OK && i < 2);
return ret; return ret;
} }
@@ -561,7 +581,7 @@ int gs_start_app(PSERVER_DATA server, STREAM_CONFIGURATION *config, int appId, b
srand(time(NULL)); srand(time(NULL));
char url[4096]; char url[4096];
u_int32_t rikeyid = 1; u_int32_t rikeyid = 0;
char rikey_hex[33]; char rikey_hex[33];
bytes_to_hex(config->remoteInputAesKey, rikey_hex, 16); bytes_to_hex(config->remoteInputAesKey, rikey_hex, 16);
@@ -583,10 +603,10 @@ int gs_start_app(PSERVER_DATA server, STREAM_CONFIGURATION *config, int appId, b
else else
goto cleanup; goto cleanup;
if ((ret = xml_search(data->memory, data->size, "cancel", &result)) != GS_OK) if ((ret = xml_search(data->memory, data->size, "gamesession", &result)) != GS_OK)
goto cleanup; goto cleanup;
if (atoi(result) == 0) { if (!strcmp(result, "0")) {
ret = GS_FAILED; ret = GS_FAILED;
goto cleanup; goto cleanup;
} }
+1 -1
View File
@@ -21,7 +21,7 @@
#include "xml.h" #include "xml.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdbool.h> #include <stdbool.h>
+1 -1
View File
@@ -17,7 +17,7 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
#define GS_SPS_BITSTREAM_FIXUP 0x01 #define GS_SPS_BITSTREAM_FIXUP 0x01
#define GS_SPS_BASELINE_HACK 0x02 #define GS_SPS_BASELINE_HACK 0x02
+1 -1
View File
@@ -19,7 +19,7 @@
#include <stdbool.h> #include <stdbool.h>
#include "limelight-common/Limelight.h" #include <Limelight.h>
extern const char* audio_device; extern const char* audio_device;
+1 -1
View File
@@ -17,7 +17,7 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdbool.h> #include <stdbool.h>
+1 -1
View File
@@ -17,6 +17,6 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
extern CONNECTION_LISTENER_CALLBACKS connection_callbacks; extern CONNECTION_LISTENER_CALLBACKS connection_callbacks;
+1 -1
View File
@@ -19,7 +19,7 @@
#ifdef HAVE_LIBCEC #ifdef HAVE_LIBCEC
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <ceccloader.h> #include <ceccloader.h>
+1 -1
View File
@@ -24,7 +24,7 @@
#include "mapping.h" #include "mapping.h"
#include "libevdev/libevdev.h" #include "libevdev/libevdev.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <libudev.h> #include <libudev.h>
#include <stdio.h> #include <stdio.h>
+1 -1
View File
@@ -22,7 +22,7 @@
#include "sdlinput.h" #include "sdlinput.h"
#include "../sdl.h" #include "../sdl.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#define ACTION_MODIFIERS (MODIFIER_SHIFT|MODIFIER_ALT|MODIFIER_CTRL) #define ACTION_MODIFIERS (MODIFIER_SHIFT|MODIFIER_ALT|MODIFIER_CTRL)
#define QUIT_KEY SDLK_q #define QUIT_KEY SDLK_q
+1 -1
View File
@@ -33,7 +33,7 @@
#include "input/cec.h" #include "input/cec.h"
#include "input/sdlinput.h" #include "input/sdlinput.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
+1 -1
View File
@@ -17,7 +17,7 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <stdlib.h> #include <stdlib.h>
+1 -1
View File
@@ -22,7 +22,7 @@
#include "sdl.h" #include "sdl.h"
#include "input/sdlinput.h" #include "input/sdlinput.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
static bool done; static bool done;
static int fullscreen_flags; static int fullscreen_flags;
+1 -1
View File
@@ -18,7 +18,7 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdio.h> #include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
+1 -1
View File
@@ -17,7 +17,7 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdio.h> #include <stdio.h>
+1 -1
View File
@@ -23,7 +23,7 @@
#include "ffmpeg_vdpau.h" #include "ffmpeg_vdpau.h"
#endif #endif
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdlib.h> #include <stdlib.h>
#include <libswscale/swscale.h> #include <libswscale/swscale.h>
+1 -1
View File
@@ -17,7 +17,7 @@
* along with Moonlight; if not, see <http://www.gnu.org/licenses/>. * along with Moonlight; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
+1 -1
View File
@@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "sps.h" #include "sps.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
+1 -1
View File
@@ -21,7 +21,7 @@
#include "../sdl.h" #include "../sdl.h"
#include "ffmpeg.h" #include "ffmpeg.h"
#include "limelight-common/Limelight.h" #include <Limelight.h>
#include <SDL.h> #include <SDL.h>
#include <SDL_thread.h> #include <SDL_thread.h>