More PoC streaming code (closer to final)

This commit is contained in:
Cameron Gutman 2018-06-27 23:54:24 -07:00
parent 94ecc4a1c8
commit cad95f12f6

View File

@ -6,6 +6,9 @@
#include "streaming/streaming.h" #include "streaming/streaming.h"
#include "backend/computermanager.h" #include "backend/computermanager.h"
#include "backend/boxartmanager.h" #include "backend/boxartmanager.h"
#include "settings/streamingpreferences.h"
#include <QRandomGenerator>
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
@ -48,18 +51,68 @@ void MainWindow::computerStateChanged(NvComputer* computer)
QString pin = pm.generatePinString(); QString pin = pm.generatePinString();
pm.pair(http.getServerInfo(), pin); pm.pair(http.getServerInfo(), pin);
} }
else { else if (!computer->appList.isEmpty()) {
QImage im = m_BoxArtManager.loadBoxArt(computer, computer->appList[0]); QImage im = m_BoxArtManager.loadBoxArt(computer, computer->appList[0]);
#if 0 // Stop polling before launching a game
STREAM_CONFIGURATION sc; m_ComputerManager.stopPollingAsync();
LiInitializeStreamConfiguration(&sc);
sc.width = 1280; #if 1
sc.height = 720; STREAM_CONFIGURATION streamConfig;
sc.fps = 60; StreamingPreferences prefs;
sc.packetSize = 1024;
sc.bitrate = 10000; LiInitializeStreamConfiguration(&streamConfig);
sc.audioConfiguration = AUDIO_CONFIGURATION_51_SURROUND; // 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); QMessageBox* box = new QMessageBox(nullptr);
box->setAttribute(Qt::WA_DeleteOnClose); //makes sure the msgbox is deleted automatically when closed 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(); box->open();
if (computer->currentGameId != 0) { if (computer->currentGameId != 0) {
http.resumeApp(&sc); http.resumeApp(&streamConfig);
} }
else { 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(); QString serverInfo = http.getServerInfo();
QByteArray hostnameStr = computer->activeAddress.toLatin1(); QByteArray hostnameStr = computer->activeAddress.toLatin1();
QByteArray siAppVersion = http.getXmlString(serverInfo, "appversion").toLatin1(); QByteArray siAppVersion = http.getXmlString(serverInfo, "appversion").toLatin1();
QByteArray siGfeVersion = http.getXmlString(serverInfo, "GfeVersion").toLatin1(); QByteArray siGfeVersion = http.getXmlString(serverInfo, "GfeVersion").toLatin1();
si.address = hostnameStr.data(); hostInfo.address = hostnameStr.data();
si.serverInfoAppVersion = siAppVersion.data(); hostInfo.serverInfoAppVersion = siAppVersion.data();
si.serverInfoGfeVersion = siGfeVersion.data(); hostInfo.serverInfoGfeVersion = siGfeVersion.data();
StartConnection(&si, &sc, box); StartConnection(&hostInfo, &streamConfig, box);
#endif #endif
} }
} }
@ -95,8 +151,6 @@ void MainWindow::on_newHostBtn_clicked()
QString hostname = popupmanager::getHostnameDialog(this); QString hostname = popupmanager::getHostnameDialog(this);
if (!hostname.isEmpty()) { if (!hostname.isEmpty()) {
m_ComputerManager.addNewHost(hostname, false); m_ComputerManager.addNewHost(hostname, false);
QThread::sleep(10);
m_ComputerManager.stopPollingAsync();
} }
} }