1
0

AutoConfigVideoPage.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "AutoConfigVideoPage.hpp"
  2. #include "AutoConfig.hpp"
  3. #include "ui_AutoConfigVideoPage.h"
  4. #include <OBSApp.hpp>
  5. #include <QScreen>
  6. #include "moc_AutoConfigVideoPage.cpp"
  7. #define RES_TEXT(x) "Basic.AutoConfig.VideoPage." x
  8. #define RES_USE_CURRENT RES_TEXT("BaseResolution.UseCurrent")
  9. #define RES_USE_DISPLAY RES_TEXT("BaseResolution.Display")
  10. #define FPS_USE_CURRENT RES_TEXT("FPS.UseCurrent")
  11. #define FPS_PREFER_HIGH_FPS RES_TEXT("FPS.PreferHighFPS")
  12. #define FPS_PREFER_HIGH_RES RES_TEXT("FPS.PreferHighRes")
  13. #define wiz reinterpret_cast<AutoConfig *>(wizard())
  14. AutoConfigVideoPage::AutoConfigVideoPage(QWidget *parent) : QWizardPage(parent), ui(new Ui_AutoConfigVideoPage)
  15. {
  16. ui->setupUi(this);
  17. setTitle(QTStr("Basic.AutoConfig.VideoPage"));
  18. setSubTitle(QTStr("Basic.AutoConfig.VideoPage.SubTitle"));
  19. obs_video_info ovi;
  20. obs_get_video_info(&ovi);
  21. long double fpsVal = (long double)ovi.fps_num / (long double)ovi.fps_den;
  22. QString fpsStr = (ovi.fps_den > 1) ? QString::number(fpsVal, 'f', 2) : QString::number(fpsVal, 'g');
  23. ui->fps->addItem(QTStr(FPS_PREFER_HIGH_FPS), (int)AutoConfig::FPSType::PreferHighFPS);
  24. ui->fps->addItem(QTStr(FPS_PREFER_HIGH_RES), (int)AutoConfig::FPSType::PreferHighRes);
  25. ui->fps->addItem(QTStr(FPS_USE_CURRENT).arg(fpsStr), (int)AutoConfig::FPSType::UseCurrent);
  26. ui->fps->addItem(QStringLiteral("30"), (int)AutoConfig::FPSType::fps30);
  27. ui->fps->addItem(QStringLiteral("60"), (int)AutoConfig::FPSType::fps60);
  28. ui->fps->setCurrentIndex(0);
  29. QString cxStr = QString::number(ovi.base_width);
  30. QString cyStr = QString::number(ovi.base_height);
  31. int encRes = int(ovi.base_width << 16) | int(ovi.base_height);
  32. // Auto config only supports testing down to 240p, don't allow current
  33. // resolution if it's lower than that.
  34. if (ovi.base_height >= 240)
  35. ui->canvasRes->addItem(QTStr(RES_USE_CURRENT).arg(cxStr, cyStr), (int)encRes);
  36. QList<QScreen *> screens = QGuiApplication::screens();
  37. for (int i = 0; i < screens.size(); i++) {
  38. QScreen *screen = screens[i];
  39. QSize as = screen->size();
  40. int as_width = as.width();
  41. int as_height = as.height();
  42. // Calculate physical screen resolution based on the virtual screen resolution
  43. // They might differ if scaling is enabled, e.g. for HiDPI screens
  44. as_width = round(as_width * screen->devicePixelRatio());
  45. as_height = round(as_height * screen->devicePixelRatio());
  46. encRes = as_width << 16 | as_height;
  47. QString str =
  48. QTStr(RES_USE_DISPLAY)
  49. .arg(QString::number(i + 1), QString::number(as_width), QString::number(as_height));
  50. ui->canvasRes->addItem(str, encRes);
  51. }
  52. auto addRes = [&](int cx, int cy) {
  53. encRes = (cx << 16) | cy;
  54. QString str = QString("%1x%2").arg(QString::number(cx), QString::number(cy));
  55. ui->canvasRes->addItem(str, encRes);
  56. };
  57. addRes(1920, 1080);
  58. addRes(1280, 720);
  59. ui->canvasRes->setCurrentIndex(0);
  60. }
  61. AutoConfigVideoPage::~AutoConfigVideoPage() {}
  62. int AutoConfigVideoPage::nextId() const
  63. {
  64. return wiz->type == AutoConfig::Type::Recording ? AutoConfig::TestPage : AutoConfig::StreamPage;
  65. }
  66. bool AutoConfigVideoPage::validatePage()
  67. {
  68. int encRes = ui->canvasRes->currentData().toInt();
  69. wiz->baseResolutionCX = encRes >> 16;
  70. wiz->baseResolutionCY = encRes & 0xFFFF;
  71. wiz->fpsType = (AutoConfig::FPSType)ui->fps->currentData().toInt();
  72. obs_video_info ovi;
  73. obs_get_video_info(&ovi);
  74. switch (wiz->fpsType) {
  75. case AutoConfig::FPSType::PreferHighFPS:
  76. wiz->specificFPSNum = 0;
  77. wiz->specificFPSDen = 0;
  78. wiz->preferHighFPS = true;
  79. break;
  80. case AutoConfig::FPSType::PreferHighRes:
  81. wiz->specificFPSNum = 0;
  82. wiz->specificFPSDen = 0;
  83. wiz->preferHighFPS = false;
  84. break;
  85. case AutoConfig::FPSType::UseCurrent:
  86. wiz->specificFPSNum = ovi.fps_num;
  87. wiz->specificFPSDen = ovi.fps_den;
  88. wiz->preferHighFPS = false;
  89. break;
  90. case AutoConfig::FPSType::fps30:
  91. wiz->specificFPSNum = 30;
  92. wiz->specificFPSDen = 1;
  93. wiz->preferHighFPS = false;
  94. break;
  95. case AutoConfig::FPSType::fps60:
  96. wiz->specificFPSNum = 60;
  97. wiz->specificFPSDen = 1;
  98. wiz->preferHighFPS = false;
  99. break;
  100. }
  101. return true;
  102. }