From cad95f12f6cbc73886995c806ac2851b0940e827 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 27 Jun 2018 23:54:24 -0700 Subject: [PATCH] More PoC streaming code (closer to final) --- app/gui/mainwindow.cpp | 92 +++++++++++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 19 deletions(-) diff --git a/app/gui/mainwindow.cpp b/app/gui/mainwindow.cpp index 71e6367b..87d93652 100644 --- a/app/gui/mainwindow.cpp +++ b/app/gui/mainwindow.cpp @@ -6,6 +6,9 @@ #include "streaming/streaming.h" #include "backend/computermanager.h" #include "backend/boxartmanager.h" +#include "settings/streamingpreferences.h" + +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -48,18 +51,68 @@ void MainWindow::computerStateChanged(NvComputer* computer) QString pin = pm.generatePinString(); pm.pair(http.getServerInfo(), pin); } - else { + else if (!computer->appList.isEmpty()) { QImage im = m_BoxArtManager.loadBoxArt(computer, computer->appList[0]); -#if 0 - STREAM_CONFIGURATION sc; - LiInitializeStreamConfiguration(&sc); - sc.width = 1280; - sc.height = 720; - sc.fps = 60; - sc.packetSize = 1024; - sc.bitrate = 10000; - sc.audioConfiguration = AUDIO_CONFIGURATION_51_SURROUND; + // Stop polling before launching a game + m_ComputerManager.stopPollingAsync(); + +#if 1 + STREAM_CONFIGURATION streamConfig; + StreamingPreferences prefs; + + LiInitializeStreamConfiguration(&streamConfig); + // TODO: Validate 4K and 4K60 based on serverinfo + streamConfig.width = prefs.width; + streamConfig.height = prefs.height; + streamConfig.fps = prefs.fps; + streamConfig.bitrate = prefs.bitrateKbps; + streamConfig.packetSize = 1024; + streamConfig.hevcBitratePercentageMultiplier = 75; + for (int i = 0; i < sizeof(streamConfig.remoteInputAesKey); i++) { + streamConfig.remoteInputAesKey[i] = + (char)(QRandomGenerator::global()->generate() % 256); + } + *(int*)streamConfig.remoteInputAesIv = qToBigEndian(QRandomGenerator::global()->generate()); + switch (prefs.audioConfig) + { + case StreamingPreferences::AC_AUTO: + streamConfig.audioConfiguration = SdlDetermineAudioConfiguration(); + break; + case StreamingPreferences::AC_FORCE_STEREO: + streamConfig.audioConfiguration = AUDIO_CONFIGURATION_STEREO; + break; + case StreamingPreferences::AC_FORCE_SURROUND: + streamConfig.audioConfiguration = AUDIO_CONFIGURATION_51_SURROUND; + break; + } + switch (prefs.videoCodecConfig) + { + case StreamingPreferences::VCC_AUTO: + // TODO: Determine if HEVC is better depending on the decoder + streamConfig.supportsHevc = true; + streamConfig.enableHdr = false; + break; + case StreamingPreferences::VCC_FORCE_H264: + streamConfig.supportsHevc = false; + streamConfig.enableHdr = false; + break; + case StreamingPreferences::VCC_FORCE_HEVC: + streamConfig.supportsHevc = true; + streamConfig.enableHdr = false; + break; + case StreamingPreferences::VCC_FORCE_HEVC_HDR: + streamConfig.supportsHevc = true; + streamConfig.enableHdr = true; + break; + } + + // TODO: Validate HEVC support based on decoder caps + // TODO: Validate HDR support based on decoder caps, display, server caps, and app + + // Initialize the gamepad code with our preferences + // Note: must be done before SdlGetAttachedGamepadMask! + SdlInitializeGamepad(prefs.multiController); QMessageBox* box = new QMessageBox(nullptr); box->setAttribute(Qt::WA_DeleteOnClose); //makes sure the msgbox is deleted automatically when closed @@ -68,24 +121,27 @@ void MainWindow::computerStateChanged(NvComputer* computer) box->open(); if (computer->currentGameId != 0) { - http.resumeApp(&sc); + http.resumeApp(&streamConfig); } else { - http.launchApp(999999, &sc, true, false, SdlGetAttachedGamepadMask()); + http.launchApp(999999, &streamConfig, + prefs.enableGameOptimizations, + prefs.playAudioOnHost, + SdlGetAttachedGamepadMask()); } - SERVER_INFORMATION si; + SERVER_INFORMATION hostInfo; QString serverInfo = http.getServerInfo(); QByteArray hostnameStr = computer->activeAddress.toLatin1(); QByteArray siAppVersion = http.getXmlString(serverInfo, "appversion").toLatin1(); QByteArray siGfeVersion = http.getXmlString(serverInfo, "GfeVersion").toLatin1(); - si.address = hostnameStr.data(); - si.serverInfoAppVersion = siAppVersion.data(); - si.serverInfoGfeVersion = siGfeVersion.data(); + hostInfo.address = hostnameStr.data(); + hostInfo.serverInfoAppVersion = siAppVersion.data(); + hostInfo.serverInfoGfeVersion = siGfeVersion.data(); - StartConnection(&si, &sc, box); + StartConnection(&hostInfo, &streamConfig, box); #endif } } @@ -95,8 +151,6 @@ void MainWindow::on_newHostBtn_clicked() QString hostname = popupmanager::getHostnameDialog(this); if (!hostname.isEmpty()) { m_ComputerManager.addNewHost(hostname, false); - QThread::sleep(10); - m_ComputerManager.stopPollingAsync(); } }