diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index 8f1a769b1..8d3a5d2bf 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -829,8 +829,7 @@ static const double vals[] = static const size_t numVals = sizeof(vals)/sizeof(double); -void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, - uint32_t out_cx, uint32_t out_cy) +void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy) { QString advRescale; QString advRecRescale; @@ -838,11 +837,14 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, QString oldOutputRes; string bestScale; int bestPixelDiff = 0x7FFFFFFF; + uint32_t out_cx = outputCX; + uint32_t out_cy = outputCY; advRescale = ui->advOutRescale->lineEdit()->text(); advRecRescale = ui->advOutRecRescale->lineEdit()->text(); advFFRescale = ui->advOutFFRescale->lineEdit()->text(); - oldOutputRes = ui->outputResolution->lineEdit()->text(); + + ui->outputResolution->blockSignals(true); ui->outputResolution->clear(); ui->advOutRescale->clear(); @@ -852,6 +854,10 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, if (!out_cx || !out_cy) { out_cx = cx; out_cy = cy; + oldOutputRes = ui->baseResolution->lineEdit()->text(); + } else { + oldOutputRes = QString::number(out_cx) + "x" + + QString::number(out_cy); } for (size_t idx = 0; idx < numVals; idx++) { @@ -894,6 +900,8 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, else ui->outputResolution->lineEdit()->setText(bestScale.c_str()); + ui->outputResolution->blockSignals(false); + if (advRescale.isEmpty()) advRescale = res.c_str(); if (advRecRescale.isEmpty()) @@ -946,11 +954,14 @@ void OBSBasicSettings::LoadResolutionLists() ui->baseResolution->addItem(res.c_str()); } - ResetDownscales(cx, cy, out_cx, out_cy); + string outputResString = ResString(out_cx, out_cy); ui->baseResolution->lineEdit()->setText(ResString(cx, cy).c_str()); - ui->outputResolution->lineEdit()->setText( - ResString(out_cx, out_cy).c_str()); + + RecalcOutputResPixels(outputResString.c_str()); + ResetDownscales(cx, cy); + + ui->outputResolution->lineEdit()->setText(outputResString.c_str()); } static inline void LoadFPSCommon(OBSBasic *main, Ui::OBSBasicSettings *ui) @@ -2617,18 +2628,32 @@ static bool ValidResolutions(Ui::OBSBasicSettings *ui) return true; } +void OBSBasicSettings::RecalcOutputResPixels(const char *resText) +{ + uint32_t newCX; + uint32_t newCY; + + ConvertResText(resText, newCX, newCY); + if (newCX && newCY) { + outputCX = newCX; + outputCY = newCY; + } +} + +void OBSBasicSettings::on_outputResolution_editTextChanged(const QString &text) +{ + if (!loading) + RecalcOutputResPixels(QT_TO_UTF8(text)); +} + void OBSBasicSettings::on_baseResolution_editTextChanged(const QString &text) { if (!loading && ValidResolutions(ui.get())) { QString baseResolution = text; - uint32_t cx, cy, out_cx, out_cy; + uint32_t cx, cy; ConvertResText(QT_TO_UTF8(baseResolution), cx, cy); - - QString outRes = ui->outputResolution->lineEdit()->text(); - ConvertResText(QT_TO_UTF8(outRes), out_cx, out_cy); - - ResetDownscales(cx, cy, out_cx, out_cy); + ResetDownscales(cx, cy); } } diff --git a/obs/window-basic-settings.hpp b/obs/window-basic-settings.hpp index 96be12d18..8a592897e 100644 --- a/obs/window-basic-settings.hpp +++ b/obs/window-basic-settings.hpp @@ -121,6 +121,9 @@ private: OBSSignal hotkeyRegistered; OBSSignal hotkeyUnregistered; + uint32_t outputCX = 0; + uint32_t outputCY = 0; + void SaveCombo(QComboBox *widget, const char *section, const char *value); void SaveComboData(QComboBox *widget, const char *section, @@ -210,8 +213,7 @@ private: /* video */ void LoadRendererList(); - void ResetDownscales(uint32_t cx, uint32_t cy, - uint32_t out_cx, uint32_t out_cy); + void ResetDownscales(uint32_t cx, uint32_t cy); void LoadDownscaleFilters(); void LoadResolutionLists(); void LoadFPSData(); @@ -230,6 +232,8 @@ private: void FillSimpleRecordingValues(); + void RecalcOutputResPixels(const char *resText); + private slots: void on_theme_activated(int idx); @@ -249,6 +253,7 @@ private slots: void on_colorFormat_currentIndexChanged(const QString &text); + void on_outputResolution_editTextChanged(const QString &text); void on_baseResolution_editTextChanged(const QString &text); void GeneralChanged();