frontend: Prepare Qt UI autoconfig wizards for splits
This commit is contained in:
parent
654ddcd409
commit
c792be35a1
11 changed files with 5923 additions and 0 deletions
1240
frontend/wizards/AutoConfigStartPage.cpp
Normal file
1240
frontend/wizards/AutoConfigStartPage.cpp
Normal file
File diff suppressed because it is too large
Load diff
288
frontend/wizards/AutoConfigStartPage.hpp
Normal file
288
frontend/wizards/AutoConfigStartPage.hpp
Normal file
|
|
@ -0,0 +1,288 @@
|
|||
#pragma once
|
||||
|
||||
#include <QWizard>
|
||||
#include <QPointer>
|
||||
#include <QFormLayout>
|
||||
#include <QWizardPage>
|
||||
|
||||
#include <condition_variable>
|
||||
#include <utility>
|
||||
#include <thread>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
|
||||
class Ui_AutoConfigStartPage;
|
||||
class Ui_AutoConfigVideoPage;
|
||||
class Ui_AutoConfigStreamPage;
|
||||
class Ui_AutoConfigTestPage;
|
||||
|
||||
class AutoConfigStreamPage;
|
||||
class Auth;
|
||||
|
||||
class AutoConfig : public QWizard {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfigStartPage;
|
||||
friend class AutoConfigVideoPage;
|
||||
friend class AutoConfigStreamPage;
|
||||
friend class AutoConfigTestPage;
|
||||
|
||||
enum class Type {
|
||||
Invalid,
|
||||
Streaming,
|
||||
Recording,
|
||||
VirtualCam,
|
||||
};
|
||||
|
||||
enum class Service {
|
||||
Twitch,
|
||||
YouTube,
|
||||
AmazonIVS,
|
||||
Other,
|
||||
};
|
||||
|
||||
enum class Encoder {
|
||||
x264,
|
||||
NVENC,
|
||||
QSV,
|
||||
AMD,
|
||||
Apple,
|
||||
Stream,
|
||||
};
|
||||
|
||||
enum class Quality {
|
||||
Stream,
|
||||
High,
|
||||
};
|
||||
|
||||
enum class FPSType : int {
|
||||
PreferHighFPS,
|
||||
PreferHighRes,
|
||||
UseCurrent,
|
||||
fps30,
|
||||
fps60,
|
||||
};
|
||||
|
||||
struct StreamServer {
|
||||
std::string name;
|
||||
std::string address;
|
||||
};
|
||||
|
||||
static inline const char *GetEncoderId(Encoder enc);
|
||||
|
||||
AutoConfigStreamPage *streamPage = nullptr;
|
||||
|
||||
Service service = Service::Other;
|
||||
Quality recordingQuality = Quality::Stream;
|
||||
Encoder recordingEncoder = Encoder::Stream;
|
||||
Encoder streamingEncoder = Encoder::x264;
|
||||
Type type = Type::Streaming;
|
||||
FPSType fpsType = FPSType::PreferHighFPS;
|
||||
int idealBitrate = 2500;
|
||||
struct {
|
||||
std::optional<int> targetBitrate;
|
||||
std::optional<int> bitrate;
|
||||
bool testSuccessful = false;
|
||||
} multitrackVideo;
|
||||
int baseResolutionCX = 1920;
|
||||
int baseResolutionCY = 1080;
|
||||
int idealResolutionCX = 1280;
|
||||
int idealResolutionCY = 720;
|
||||
int idealFPSNum = 60;
|
||||
int idealFPSDen = 1;
|
||||
std::string serviceName;
|
||||
std::string serverName;
|
||||
std::string server;
|
||||
std::vector<StreamServer> serviceConfigServers;
|
||||
std::string key;
|
||||
|
||||
bool hardwareEncodingAvailable = false;
|
||||
bool nvencAvailable = false;
|
||||
bool qsvAvailable = false;
|
||||
bool vceAvailable = false;
|
||||
bool appleAvailable = false;
|
||||
|
||||
int startingBitrate = 2500;
|
||||
bool customServer = false;
|
||||
bool bandwidthTest = false;
|
||||
bool testMultitrackVideo = false;
|
||||
bool testRegions = true;
|
||||
bool twitchAuto = false;
|
||||
bool amazonIVSAuto = false;
|
||||
bool regionUS = true;
|
||||
bool regionEU = true;
|
||||
bool regionAsia = true;
|
||||
bool regionOther = true;
|
||||
bool preferHighFPS = false;
|
||||
bool preferHardware = false;
|
||||
int specificFPSNum = 0;
|
||||
int specificFPSDen = 0;
|
||||
|
||||
void TestHardwareEncoding();
|
||||
bool CanTestServer(const char *server);
|
||||
|
||||
virtual void done(int result) override;
|
||||
|
||||
void SaveStreamSettings();
|
||||
void SaveSettings();
|
||||
|
||||
public:
|
||||
AutoConfig(QWidget *parent);
|
||||
~AutoConfig();
|
||||
|
||||
enum Page {
|
||||
StartPage,
|
||||
VideoPage,
|
||||
StreamPage,
|
||||
TestPage,
|
||||
};
|
||||
};
|
||||
|
||||
class AutoConfigStartPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigStartPage> ui;
|
||||
|
||||
public:
|
||||
AutoConfigStartPage(QWidget *parent = nullptr);
|
||||
~AutoConfigStartPage();
|
||||
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void on_prioritizeStreaming_clicked();
|
||||
void on_prioritizeRecording_clicked();
|
||||
void PrioritizeVCam();
|
||||
};
|
||||
|
||||
class AutoConfigVideoPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigVideoPage> ui;
|
||||
|
||||
public:
|
||||
AutoConfigVideoPage(QWidget *parent = nullptr);
|
||||
~AutoConfigVideoPage();
|
||||
|
||||
virtual int nextId() const override;
|
||||
virtual bool validatePage() override;
|
||||
};
|
||||
|
||||
class AutoConfigStreamPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
enum class Section : int {
|
||||
Connect,
|
||||
StreamKey,
|
||||
};
|
||||
|
||||
std::shared_ptr<Auth> auth;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigStreamPage> ui;
|
||||
QString lastService;
|
||||
bool ready = false;
|
||||
|
||||
void LoadServices(bool showAll);
|
||||
inline bool IsCustomService() const;
|
||||
|
||||
public:
|
||||
AutoConfigStreamPage(QWidget *parent = nullptr);
|
||||
~AutoConfigStreamPage();
|
||||
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
virtual bool validatePage() override;
|
||||
|
||||
void OnAuthConnected();
|
||||
void OnOAuthStreamKeyConnected();
|
||||
|
||||
public slots:
|
||||
void on_show_clicked();
|
||||
void on_connectAccount_clicked();
|
||||
void on_disconnectAccount_clicked();
|
||||
void on_useStreamKey_clicked();
|
||||
void on_preferHardware_clicked();
|
||||
void ServiceChanged();
|
||||
void UpdateKeyLink();
|
||||
void UpdateMoreInfoLink();
|
||||
void UpdateServerList();
|
||||
void UpdateCompleted();
|
||||
|
||||
void reset_service_ui_fields(std::string &service);
|
||||
};
|
||||
|
||||
class AutoConfigTestPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
QPointer<QFormLayout> results;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigTestPage> ui;
|
||||
std::thread testThread;
|
||||
std::condition_variable cv;
|
||||
std::mutex m;
|
||||
bool cancel = false;
|
||||
bool started = false;
|
||||
|
||||
enum class Stage {
|
||||
Starting,
|
||||
BandwidthTest,
|
||||
StreamEncoder,
|
||||
RecordingEncoder,
|
||||
Finished,
|
||||
};
|
||||
|
||||
Stage stage = Stage::Starting;
|
||||
bool softwareTested = false;
|
||||
|
||||
void StartBandwidthStage();
|
||||
void StartStreamEncoderStage();
|
||||
void StartRecordingEncoderStage();
|
||||
|
||||
void FindIdealHardwareResolution();
|
||||
bool TestSoftwareEncoding();
|
||||
|
||||
void TestBandwidthThread();
|
||||
void TestStreamEncoderThread();
|
||||
void TestRecordingEncoderThread();
|
||||
|
||||
void FinalizeResults();
|
||||
|
||||
struct ServerInfo {
|
||||
std::string name;
|
||||
std::string address;
|
||||
int bitrate = 0;
|
||||
int ms = -1;
|
||||
|
||||
inline ServerInfo() {}
|
||||
|
||||
inline ServerInfo(const char *name_, const char *address_) : name(name_), address(address_) {}
|
||||
};
|
||||
|
||||
void GetServers(std::vector<ServerInfo> &servers);
|
||||
|
||||
public:
|
||||
AutoConfigTestPage(QWidget *parent = nullptr);
|
||||
~AutoConfigTestPage();
|
||||
|
||||
virtual void initializePage() override;
|
||||
virtual void cleanupPage() override;
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void NextStage();
|
||||
void UpdateMessage(QString message);
|
||||
void Failure(QString message);
|
||||
void Progress(int percentage);
|
||||
};
|
||||
1240
frontend/wizards/AutoConfigStreamPage.cpp
Normal file
1240
frontend/wizards/AutoConfigStreamPage.cpp
Normal file
File diff suppressed because it is too large
Load diff
288
frontend/wizards/AutoConfigStreamPage.hpp
Normal file
288
frontend/wizards/AutoConfigStreamPage.hpp
Normal file
|
|
@ -0,0 +1,288 @@
|
|||
#pragma once
|
||||
|
||||
#include <QWizard>
|
||||
#include <QPointer>
|
||||
#include <QFormLayout>
|
||||
#include <QWizardPage>
|
||||
|
||||
#include <condition_variable>
|
||||
#include <utility>
|
||||
#include <thread>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
|
||||
class Ui_AutoConfigStartPage;
|
||||
class Ui_AutoConfigVideoPage;
|
||||
class Ui_AutoConfigStreamPage;
|
||||
class Ui_AutoConfigTestPage;
|
||||
|
||||
class AutoConfigStreamPage;
|
||||
class Auth;
|
||||
|
||||
class AutoConfig : public QWizard {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfigStartPage;
|
||||
friend class AutoConfigVideoPage;
|
||||
friend class AutoConfigStreamPage;
|
||||
friend class AutoConfigTestPage;
|
||||
|
||||
enum class Type {
|
||||
Invalid,
|
||||
Streaming,
|
||||
Recording,
|
||||
VirtualCam,
|
||||
};
|
||||
|
||||
enum class Service {
|
||||
Twitch,
|
||||
YouTube,
|
||||
AmazonIVS,
|
||||
Other,
|
||||
};
|
||||
|
||||
enum class Encoder {
|
||||
x264,
|
||||
NVENC,
|
||||
QSV,
|
||||
AMD,
|
||||
Apple,
|
||||
Stream,
|
||||
};
|
||||
|
||||
enum class Quality {
|
||||
Stream,
|
||||
High,
|
||||
};
|
||||
|
||||
enum class FPSType : int {
|
||||
PreferHighFPS,
|
||||
PreferHighRes,
|
||||
UseCurrent,
|
||||
fps30,
|
||||
fps60,
|
||||
};
|
||||
|
||||
struct StreamServer {
|
||||
std::string name;
|
||||
std::string address;
|
||||
};
|
||||
|
||||
static inline const char *GetEncoderId(Encoder enc);
|
||||
|
||||
AutoConfigStreamPage *streamPage = nullptr;
|
||||
|
||||
Service service = Service::Other;
|
||||
Quality recordingQuality = Quality::Stream;
|
||||
Encoder recordingEncoder = Encoder::Stream;
|
||||
Encoder streamingEncoder = Encoder::x264;
|
||||
Type type = Type::Streaming;
|
||||
FPSType fpsType = FPSType::PreferHighFPS;
|
||||
int idealBitrate = 2500;
|
||||
struct {
|
||||
std::optional<int> targetBitrate;
|
||||
std::optional<int> bitrate;
|
||||
bool testSuccessful = false;
|
||||
} multitrackVideo;
|
||||
int baseResolutionCX = 1920;
|
||||
int baseResolutionCY = 1080;
|
||||
int idealResolutionCX = 1280;
|
||||
int idealResolutionCY = 720;
|
||||
int idealFPSNum = 60;
|
||||
int idealFPSDen = 1;
|
||||
std::string serviceName;
|
||||
std::string serverName;
|
||||
std::string server;
|
||||
std::vector<StreamServer> serviceConfigServers;
|
||||
std::string key;
|
||||
|
||||
bool hardwareEncodingAvailable = false;
|
||||
bool nvencAvailable = false;
|
||||
bool qsvAvailable = false;
|
||||
bool vceAvailable = false;
|
||||
bool appleAvailable = false;
|
||||
|
||||
int startingBitrate = 2500;
|
||||
bool customServer = false;
|
||||
bool bandwidthTest = false;
|
||||
bool testMultitrackVideo = false;
|
||||
bool testRegions = true;
|
||||
bool twitchAuto = false;
|
||||
bool amazonIVSAuto = false;
|
||||
bool regionUS = true;
|
||||
bool regionEU = true;
|
||||
bool regionAsia = true;
|
||||
bool regionOther = true;
|
||||
bool preferHighFPS = false;
|
||||
bool preferHardware = false;
|
||||
int specificFPSNum = 0;
|
||||
int specificFPSDen = 0;
|
||||
|
||||
void TestHardwareEncoding();
|
||||
bool CanTestServer(const char *server);
|
||||
|
||||
virtual void done(int result) override;
|
||||
|
||||
void SaveStreamSettings();
|
||||
void SaveSettings();
|
||||
|
||||
public:
|
||||
AutoConfig(QWidget *parent);
|
||||
~AutoConfig();
|
||||
|
||||
enum Page {
|
||||
StartPage,
|
||||
VideoPage,
|
||||
StreamPage,
|
||||
TestPage,
|
||||
};
|
||||
};
|
||||
|
||||
class AutoConfigStartPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigStartPage> ui;
|
||||
|
||||
public:
|
||||
AutoConfigStartPage(QWidget *parent = nullptr);
|
||||
~AutoConfigStartPage();
|
||||
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void on_prioritizeStreaming_clicked();
|
||||
void on_prioritizeRecording_clicked();
|
||||
void PrioritizeVCam();
|
||||
};
|
||||
|
||||
class AutoConfigVideoPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigVideoPage> ui;
|
||||
|
||||
public:
|
||||
AutoConfigVideoPage(QWidget *parent = nullptr);
|
||||
~AutoConfigVideoPage();
|
||||
|
||||
virtual int nextId() const override;
|
||||
virtual bool validatePage() override;
|
||||
};
|
||||
|
||||
class AutoConfigStreamPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
enum class Section : int {
|
||||
Connect,
|
||||
StreamKey,
|
||||
};
|
||||
|
||||
std::shared_ptr<Auth> auth;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigStreamPage> ui;
|
||||
QString lastService;
|
||||
bool ready = false;
|
||||
|
||||
void LoadServices(bool showAll);
|
||||
inline bool IsCustomService() const;
|
||||
|
||||
public:
|
||||
AutoConfigStreamPage(QWidget *parent = nullptr);
|
||||
~AutoConfigStreamPage();
|
||||
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
virtual bool validatePage() override;
|
||||
|
||||
void OnAuthConnected();
|
||||
void OnOAuthStreamKeyConnected();
|
||||
|
||||
public slots:
|
||||
void on_show_clicked();
|
||||
void on_connectAccount_clicked();
|
||||
void on_disconnectAccount_clicked();
|
||||
void on_useStreamKey_clicked();
|
||||
void on_preferHardware_clicked();
|
||||
void ServiceChanged();
|
||||
void UpdateKeyLink();
|
||||
void UpdateMoreInfoLink();
|
||||
void UpdateServerList();
|
||||
void UpdateCompleted();
|
||||
|
||||
void reset_service_ui_fields(std::string &service);
|
||||
};
|
||||
|
||||
class AutoConfigTestPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
QPointer<QFormLayout> results;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigTestPage> ui;
|
||||
std::thread testThread;
|
||||
std::condition_variable cv;
|
||||
std::mutex m;
|
||||
bool cancel = false;
|
||||
bool started = false;
|
||||
|
||||
enum class Stage {
|
||||
Starting,
|
||||
BandwidthTest,
|
||||
StreamEncoder,
|
||||
RecordingEncoder,
|
||||
Finished,
|
||||
};
|
||||
|
||||
Stage stage = Stage::Starting;
|
||||
bool softwareTested = false;
|
||||
|
||||
void StartBandwidthStage();
|
||||
void StartStreamEncoderStage();
|
||||
void StartRecordingEncoderStage();
|
||||
|
||||
void FindIdealHardwareResolution();
|
||||
bool TestSoftwareEncoding();
|
||||
|
||||
void TestBandwidthThread();
|
||||
void TestStreamEncoderThread();
|
||||
void TestRecordingEncoderThread();
|
||||
|
||||
void FinalizeResults();
|
||||
|
||||
struct ServerInfo {
|
||||
std::string name;
|
||||
std::string address;
|
||||
int bitrate = 0;
|
||||
int ms = -1;
|
||||
|
||||
inline ServerInfo() {}
|
||||
|
||||
inline ServerInfo(const char *name_, const char *address_) : name(name_), address(address_) {}
|
||||
};
|
||||
|
||||
void GetServers(std::vector<ServerInfo> &servers);
|
||||
|
||||
public:
|
||||
AutoConfigTestPage(QWidget *parent = nullptr);
|
||||
~AutoConfigTestPage();
|
||||
|
||||
virtual void initializePage() override;
|
||||
virtual void cleanupPage() override;
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void NextStage();
|
||||
void UpdateMessage(QString message);
|
||||
void Failure(QString message);
|
||||
void Progress(int percentage);
|
||||
};
|
||||
78
frontend/wizards/AutoConfigTestPage.hpp
Normal file
78
frontend/wizards/AutoConfigTestPage.hpp
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
#pragma once
|
||||
|
||||
#include <QPointer>
|
||||
#include <QWizardPage>
|
||||
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
|
||||
class QFormLayout;
|
||||
class Ui_AutoConfigTestPage;
|
||||
|
||||
class AutoConfigTestPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
QPointer<QFormLayout> results;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigTestPage> ui;
|
||||
std::thread testThread;
|
||||
std::condition_variable cv;
|
||||
std::mutex m;
|
||||
bool cancel = false;
|
||||
bool started = false;
|
||||
|
||||
enum class Stage {
|
||||
Starting,
|
||||
BandwidthTest,
|
||||
StreamEncoder,
|
||||
RecordingEncoder,
|
||||
Finished,
|
||||
};
|
||||
|
||||
Stage stage = Stage::Starting;
|
||||
bool softwareTested = false;
|
||||
|
||||
void StartBandwidthStage();
|
||||
void StartStreamEncoderStage();
|
||||
void StartRecordingEncoderStage();
|
||||
|
||||
void FindIdealHardwareResolution();
|
||||
bool TestSoftwareEncoding();
|
||||
|
||||
void TestBandwidthThread();
|
||||
void TestStreamEncoderThread();
|
||||
void TestRecordingEncoderThread();
|
||||
|
||||
void FinalizeResults();
|
||||
|
||||
struct ServerInfo {
|
||||
std::string name;
|
||||
std::string address;
|
||||
int bitrate = 0;
|
||||
int ms = -1;
|
||||
|
||||
inline ServerInfo() {}
|
||||
|
||||
inline ServerInfo(const char *name_, const char *address_) : name(name_), address(address_) {}
|
||||
};
|
||||
|
||||
void GetServers(std::vector<ServerInfo> &servers);
|
||||
|
||||
public:
|
||||
AutoConfigTestPage(QWidget *parent = nullptr);
|
||||
~AutoConfigTestPage();
|
||||
|
||||
virtual void initializePage() override;
|
||||
virtual void cleanupPage() override;
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void NextStage();
|
||||
void UpdateMessage(QString message);
|
||||
void Failure(QString message);
|
||||
void Progress(int percentage);
|
||||
};
|
||||
1240
frontend/wizards/AutoConfigVideoPage.cpp
Normal file
1240
frontend/wizards/AutoConfigVideoPage.cpp
Normal file
File diff suppressed because it is too large
Load diff
288
frontend/wizards/AutoConfigVideoPage.hpp
Normal file
288
frontend/wizards/AutoConfigVideoPage.hpp
Normal file
|
|
@ -0,0 +1,288 @@
|
|||
#pragma once
|
||||
|
||||
#include <QWizard>
|
||||
#include <QPointer>
|
||||
#include <QFormLayout>
|
||||
#include <QWizardPage>
|
||||
|
||||
#include <condition_variable>
|
||||
#include <utility>
|
||||
#include <thread>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
|
||||
class Ui_AutoConfigStartPage;
|
||||
class Ui_AutoConfigVideoPage;
|
||||
class Ui_AutoConfigStreamPage;
|
||||
class Ui_AutoConfigTestPage;
|
||||
|
||||
class AutoConfigStreamPage;
|
||||
class Auth;
|
||||
|
||||
class AutoConfig : public QWizard {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfigStartPage;
|
||||
friend class AutoConfigVideoPage;
|
||||
friend class AutoConfigStreamPage;
|
||||
friend class AutoConfigTestPage;
|
||||
|
||||
enum class Type {
|
||||
Invalid,
|
||||
Streaming,
|
||||
Recording,
|
||||
VirtualCam,
|
||||
};
|
||||
|
||||
enum class Service {
|
||||
Twitch,
|
||||
YouTube,
|
||||
AmazonIVS,
|
||||
Other,
|
||||
};
|
||||
|
||||
enum class Encoder {
|
||||
x264,
|
||||
NVENC,
|
||||
QSV,
|
||||
AMD,
|
||||
Apple,
|
||||
Stream,
|
||||
};
|
||||
|
||||
enum class Quality {
|
||||
Stream,
|
||||
High,
|
||||
};
|
||||
|
||||
enum class FPSType : int {
|
||||
PreferHighFPS,
|
||||
PreferHighRes,
|
||||
UseCurrent,
|
||||
fps30,
|
||||
fps60,
|
||||
};
|
||||
|
||||
struct StreamServer {
|
||||
std::string name;
|
||||
std::string address;
|
||||
};
|
||||
|
||||
static inline const char *GetEncoderId(Encoder enc);
|
||||
|
||||
AutoConfigStreamPage *streamPage = nullptr;
|
||||
|
||||
Service service = Service::Other;
|
||||
Quality recordingQuality = Quality::Stream;
|
||||
Encoder recordingEncoder = Encoder::Stream;
|
||||
Encoder streamingEncoder = Encoder::x264;
|
||||
Type type = Type::Streaming;
|
||||
FPSType fpsType = FPSType::PreferHighFPS;
|
||||
int idealBitrate = 2500;
|
||||
struct {
|
||||
std::optional<int> targetBitrate;
|
||||
std::optional<int> bitrate;
|
||||
bool testSuccessful = false;
|
||||
} multitrackVideo;
|
||||
int baseResolutionCX = 1920;
|
||||
int baseResolutionCY = 1080;
|
||||
int idealResolutionCX = 1280;
|
||||
int idealResolutionCY = 720;
|
||||
int idealFPSNum = 60;
|
||||
int idealFPSDen = 1;
|
||||
std::string serviceName;
|
||||
std::string serverName;
|
||||
std::string server;
|
||||
std::vector<StreamServer> serviceConfigServers;
|
||||
std::string key;
|
||||
|
||||
bool hardwareEncodingAvailable = false;
|
||||
bool nvencAvailable = false;
|
||||
bool qsvAvailable = false;
|
||||
bool vceAvailable = false;
|
||||
bool appleAvailable = false;
|
||||
|
||||
int startingBitrate = 2500;
|
||||
bool customServer = false;
|
||||
bool bandwidthTest = false;
|
||||
bool testMultitrackVideo = false;
|
||||
bool testRegions = true;
|
||||
bool twitchAuto = false;
|
||||
bool amazonIVSAuto = false;
|
||||
bool regionUS = true;
|
||||
bool regionEU = true;
|
||||
bool regionAsia = true;
|
||||
bool regionOther = true;
|
||||
bool preferHighFPS = false;
|
||||
bool preferHardware = false;
|
||||
int specificFPSNum = 0;
|
||||
int specificFPSDen = 0;
|
||||
|
||||
void TestHardwareEncoding();
|
||||
bool CanTestServer(const char *server);
|
||||
|
||||
virtual void done(int result) override;
|
||||
|
||||
void SaveStreamSettings();
|
||||
void SaveSettings();
|
||||
|
||||
public:
|
||||
AutoConfig(QWidget *parent);
|
||||
~AutoConfig();
|
||||
|
||||
enum Page {
|
||||
StartPage,
|
||||
VideoPage,
|
||||
StreamPage,
|
||||
TestPage,
|
||||
};
|
||||
};
|
||||
|
||||
class AutoConfigStartPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigStartPage> ui;
|
||||
|
||||
public:
|
||||
AutoConfigStartPage(QWidget *parent = nullptr);
|
||||
~AutoConfigStartPage();
|
||||
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void on_prioritizeStreaming_clicked();
|
||||
void on_prioritizeRecording_clicked();
|
||||
void PrioritizeVCam();
|
||||
};
|
||||
|
||||
class AutoConfigVideoPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigVideoPage> ui;
|
||||
|
||||
public:
|
||||
AutoConfigVideoPage(QWidget *parent = nullptr);
|
||||
~AutoConfigVideoPage();
|
||||
|
||||
virtual int nextId() const override;
|
||||
virtual bool validatePage() override;
|
||||
};
|
||||
|
||||
class AutoConfigStreamPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
enum class Section : int {
|
||||
Connect,
|
||||
StreamKey,
|
||||
};
|
||||
|
||||
std::shared_ptr<Auth> auth;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigStreamPage> ui;
|
||||
QString lastService;
|
||||
bool ready = false;
|
||||
|
||||
void LoadServices(bool showAll);
|
||||
inline bool IsCustomService() const;
|
||||
|
||||
public:
|
||||
AutoConfigStreamPage(QWidget *parent = nullptr);
|
||||
~AutoConfigStreamPage();
|
||||
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
virtual bool validatePage() override;
|
||||
|
||||
void OnAuthConnected();
|
||||
void OnOAuthStreamKeyConnected();
|
||||
|
||||
public slots:
|
||||
void on_show_clicked();
|
||||
void on_connectAccount_clicked();
|
||||
void on_disconnectAccount_clicked();
|
||||
void on_useStreamKey_clicked();
|
||||
void on_preferHardware_clicked();
|
||||
void ServiceChanged();
|
||||
void UpdateKeyLink();
|
||||
void UpdateMoreInfoLink();
|
||||
void UpdateServerList();
|
||||
void UpdateCompleted();
|
||||
|
||||
void reset_service_ui_fields(std::string &service);
|
||||
};
|
||||
|
||||
class AutoConfigTestPage : public QWizardPage {
|
||||
Q_OBJECT
|
||||
|
||||
friend class AutoConfig;
|
||||
|
||||
QPointer<QFormLayout> results;
|
||||
|
||||
std::unique_ptr<Ui_AutoConfigTestPage> ui;
|
||||
std::thread testThread;
|
||||
std::condition_variable cv;
|
||||
std::mutex m;
|
||||
bool cancel = false;
|
||||
bool started = false;
|
||||
|
||||
enum class Stage {
|
||||
Starting,
|
||||
BandwidthTest,
|
||||
StreamEncoder,
|
||||
RecordingEncoder,
|
||||
Finished,
|
||||
};
|
||||
|
||||
Stage stage = Stage::Starting;
|
||||
bool softwareTested = false;
|
||||
|
||||
void StartBandwidthStage();
|
||||
void StartStreamEncoderStage();
|
||||
void StartRecordingEncoderStage();
|
||||
|
||||
void FindIdealHardwareResolution();
|
||||
bool TestSoftwareEncoding();
|
||||
|
||||
void TestBandwidthThread();
|
||||
void TestStreamEncoderThread();
|
||||
void TestRecordingEncoderThread();
|
||||
|
||||
void FinalizeResults();
|
||||
|
||||
struct ServerInfo {
|
||||
std::string name;
|
||||
std::string address;
|
||||
int bitrate = 0;
|
||||
int ms = -1;
|
||||
|
||||
inline ServerInfo() {}
|
||||
|
||||
inline ServerInfo(const char *name_, const char *address_) : name(name_), address(address_) {}
|
||||
};
|
||||
|
||||
void GetServers(std::vector<ServerInfo> &servers);
|
||||
|
||||
public:
|
||||
AutoConfigTestPage(QWidget *parent = nullptr);
|
||||
~AutoConfigTestPage();
|
||||
|
||||
virtual void initializePage() override;
|
||||
virtual void cleanupPage() override;
|
||||
virtual bool isComplete() const override;
|
||||
virtual int nextId() const override;
|
||||
|
||||
public slots:
|
||||
void NextStage();
|
||||
void UpdateMessage(QString message);
|
||||
void Failure(QString message);
|
||||
void Progress(int percentage);
|
||||
};
|
||||
1261
frontend/wizards/TestMode.hpp
Normal file
1261
frontend/wizards/TestMode.hpp
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue