From 0a8e00c478401119309c050de7b23111b1af3ae6 Mon Sep 17 00:00:00 2001 From: derrod Date: Wed, 10 Jan 2024 10:05:56 +0100 Subject: [PATCH] UI: Add and migrate to GPU scaling options --- UI/data/locale/en-US.ini | 1 + UI/forms/OBSBasicSettings.ui | 66 +++++++++++--------------------- UI/window-basic-main-outputs.cpp | 15 ++++++-- UI/window-basic-main.cpp | 15 ++++++++ UI/window-basic-settings.cpp | 57 +++++++++++++++++++++------ 5 files changed, 95 insertions(+), 59 deletions(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 11654dbd3..d1d4b2fd2 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -1037,6 +1037,7 @@ Basic.Settings.Output.NoSpaceFileName="Generate File Name without Space" # basic mode 'output' settings - advanced section Basic.Settings.Output.Adv.Rescale="Rescale Output" +Basic.Settings.Output.Adv.Rescale.Disabled="Disabled" Basic.Settings.Output.Adv.AudioTrack="Audio Track" Basic.Settings.Output.Adv.Streaming="Streaming" Basic.Settings.Output.Adv.Streaming.Settings="Streaming Settings" diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui index 5edee9bc8..c7c911917 100644 --- a/UI/forms/OBSBasicSettings.ui +++ b/UI/forms/OBSBasicSettings.ui @@ -2590,7 +2590,7 @@ - + 0 @@ -2606,14 +2606,21 @@ - - - false - - - true - - + + + + + + + + false + + + true + + + + @@ -3200,7 +3207,7 @@ - + 0 @@ -3230,6 +3237,9 @@ 0 + + + @@ -7937,7 +7947,7 @@ advOutMultiTrack5 advOutMultiTrack6 advOutEncoder - advOutUseRescale + advOutRescaleFilter advOutRescale advOutRecType advOutRecPath @@ -7951,7 +7961,7 @@ advOutRecTrack5 advOutRecTrack6 advOutRecEncoder - advOutRecUseRescale + advOutRecRescaleFilter advOutRecRescale advOutMuxCustom advOutSplitFile @@ -8370,22 +8380,6 @@ - - advOutUseRescale - toggled(bool) - advOutRescale - setEnabled(bool) - - - 269 - 192 - - - 656 - 192 - - - advOutRecType currentIndexChanged(int) @@ -8402,22 +8396,6 @@ - - advOutRecUseRescale - toggled(bool) - advOutRecRescale - setEnabled(bool) - - - 289 - 317 - - - 662 - 317 - - - advOutFFUseRescale toggled(bool) diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 8e3be9ceb..8624ca91c 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -1810,9 +1810,10 @@ inline bool AdvancedOutput::allowsMultiTrack() inline void AdvancedOutput::SetupStreaming() { - bool rescale = config_get_bool(main->Config(), "AdvOut", "Rescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", "RescaleRes"); + int rescaleFilter = + config_get_int(main->Config(), "AdvOut", "RescaleFilter"); int multiTrackAudioMixes = config_get_int(main->Config(), "AdvOut", "StreamMultiTrackAudioMixes"); unsigned int cx = 0; @@ -1820,7 +1821,7 @@ inline void AdvancedOutput::SetupStreaming() int idx = 0; bool is_multitrack_output = allowsMultiTrack(); - if (rescale && rescaleRes && *rescaleRes) { + if (rescaleFilter != OBS_SCALE_DISABLE && rescaleRes && *rescaleRes) { if (sscanf(rescaleRes, "%ux%u", &cx, &cy) != 2) { cx = 0; cy = 0; @@ -1840,6 +1841,8 @@ inline void AdvancedOutput::SetupStreaming() } obs_encoder_set_scaled_size(videoStreaming, cx, cy); + obs_encoder_set_gpu_scale_type(videoStreaming, + (obs_scale_type)rescaleFilter); const char *id = obs_service_get_id(main->GetService()); if (strcmp(id, "rtmp_custom") == 0) { @@ -1856,9 +1859,10 @@ inline void AdvancedOutput::SetupRecording() config_get_string(main->Config(), "AdvOut", "RecFilePath"); const char *mux = config_get_string(main->Config(), "AdvOut", "RecMuxerCustom"); - bool rescale = config_get_bool(main->Config(), "AdvOut", "RecRescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", "RecRescaleRes"); + int rescaleFilter = + config_get_int(main->Config(), "AdvOut", "RecRescaleFilter"); int tracks; const char *recFormat = @@ -1890,7 +1894,8 @@ inline void AdvancedOutput::SetupRecording() obs_output_set_video_encoder(replayBuffer, videoStreaming); } else { - if (rescale && rescaleRes && *rescaleRes) { + if (rescaleFilter != OBS_SCALE_DISABLE && rescaleRes && + *rescaleRes) { if (sscanf(rescaleRes, "%ux%u", &cx, &cy) != 2) { cx = 0; cy = 0; @@ -1898,6 +1903,8 @@ inline void AdvancedOutput::SetupRecording() } obs_encoder_set_scaled_size(videoRecording, cx, cy); + obs_encoder_set_gpu_scale_type(videoRecording, + (obs_scale_type)rescaleFilter); obs_output_set_video_encoder(fileOutput, videoRecording); if (replayBuffer) obs_output_set_video_encoder(replayBuffer, diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 67fe6a14f..c1911f8d2 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1595,6 +1595,21 @@ bool OBSBasic::InitBasicConfigDefaults() MigrateFormat("AdvOut"); MigrateFormat("SimpleOutput"); + /* ----------------------------------------------------- */ + /* Migrate output scale setting to GPU scaling options. */ + + if (config_get_bool(basicConfig, "AdvOut", "Rescale") && + !config_has_user_value(basicConfig, "AdvOut", "RescaleFilter")) { + config_set_int(basicConfig, "AdvOut", "RescaleFilter", + OBS_SCALE_BILINEAR); + } + + if (config_get_bool(basicConfig, "AdvOut", "RecRescale") && + !config_has_user_value(basicConfig, "AdvOut", "RecRescaleFilter")) { + config_set_int(basicConfig, "AdvOut", "RecRescaleFilter", + OBS_SCALE_BILINEAR); + } + /* ----------------------------------------------------- */ if (changed) diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index 47f475ea7..f1fad879b 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -442,8 +442,8 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->simpleRBMegsMax, SCROLL_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutEncoder, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutAEncoder, COMBO_CHANGED, OUTPUTS_CHANGED); - HookWidget(ui->advOutUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRescale, CBEDIT_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->advOutRescaleFilter, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutTrack1, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutTrack2, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutTrack3, CHECK_CHANGED, OUTPUTS_CHANGED); @@ -462,8 +462,8 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->advOutRecFormat, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecEncoder, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecAEncoder, COMBO_CHANGED, OUTPUTS_CHANGED); - HookWidget(ui->advOutRecUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecRescale, CBEDIT_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->advOutRecRescaleFilter, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutMuxCustom, EDIT_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutSplitFile, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutSplitFileType, COMBO_CHANGED, OUTPUTS_CHANGED); @@ -825,6 +825,35 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) connect(ui->advRBSecMax, &QSpinBox::valueChanged, this, &OBSBasicSettings::AdvReplayBufferChanged); + // GPU scaling filters + auto addScaleFilter = [&](const char *string, int value) -> void { + ui->advOutRescaleFilter->addItem(QTStr(string), value); + ui->advOutRecRescaleFilter->addItem(QTStr(string), value); + }; + + addScaleFilter("Basic.Settings.Output.Adv.Rescale.Disabled", + OBS_SCALE_DISABLE); + addScaleFilter("Basic.Settings.Video.DownscaleFilter.Bilinear", + OBS_SCALE_BILINEAR); + addScaleFilter("Basic.Settings.Video.DownscaleFilter.Area", + OBS_SCALE_AREA); + addScaleFilter("Basic.Settings.Video.DownscaleFilter.Bicubic", + OBS_SCALE_BICUBIC); + addScaleFilter("Basic.Settings.Video.DownscaleFilter.Lanczos", + OBS_SCALE_LANCZOS); + + auto connectScaleFilter = [&](QComboBox *filter, + QComboBox *res) -> void { + connect(filter, &QComboBox::currentIndexChanged, this, + [this, res, filter](int) { + res->setEnabled(filter->currentData() != + OBS_SCALE_DISABLE); + }); + }; + + connectScaleFilter(ui->advOutRescaleFilter, ui->advOutRescale); + connectScaleFilter(ui->advOutRecRescaleFilter, ui->advOutRecRescale); + // Get Bind to IP Addresses obs_properties_t *ppts = obs_get_output_properties("rtmp_output"); obs_property_t *p = obs_properties_get(ppts, "bind_ip"); @@ -2040,16 +2069,20 @@ inline bool allowsMultiTrack(const char *protocol) void OBSBasicSettings::LoadAdvOutputStreamingSettings() { - bool rescale = config_get_bool(main->Config(), "AdvOut", "Rescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", "RescaleRes"); + int rescaleFilter = + config_get_int(main->Config(), "AdvOut", "RescaleFilter"); int trackIndex = config_get_int(main->Config(), "AdvOut", "TrackIndex"); int audioMixes = config_get_int(main->Config(), "AdvOut", "StreamMultiTrackAudioMixes"); - ui->advOutUseRescale->setChecked(rescale); - ui->advOutRescale->setEnabled(rescale); + ui->advOutRescale->setEnabled(rescaleFilter != OBS_SCALE_DISABLE); ui->advOutRescale->setCurrentText(rescaleRes); + int idx = ui->advOutRescaleFilter->findData(rescaleFilter); + if (idx != -1) + ui->advOutRescaleFilter->setCurrentIndex(idx); + QStringList specList = QTStr("FilenameFormatting.completer") .split(QRegularExpression("\n")); QCompleter *specCompleter = new QCompleter(specList); @@ -2176,9 +2209,10 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings() config_get_string(main->Config(), "AdvOut", "RecFilePath"); bool noSpace = config_get_bool(main->Config(), "AdvOut", "RecFileNameWithoutSpace"); - bool rescale = config_get_bool(main->Config(), "AdvOut", "RecRescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", "RecRescaleRes"); + int rescaleFilter = + config_get_int(main->Config(), "AdvOut", "RecRescaleFilter"); const char *muxCustom = config_get_string(main->Config(), "AdvOut", "RecMuxerCustom"); int tracks = config_get_int(main->Config(), "AdvOut", "RecTracks"); @@ -2196,11 +2230,13 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings() ui->advOutRecType->setCurrentIndex(typeIndex); ui->advOutRecPath->setText(path); ui->advOutNoSpace->setChecked(noSpace); - ui->advOutRecUseRescale->setChecked(rescale); ui->advOutRecRescale->setCurrentText(rescaleRes); + int idx = ui->advOutRecRescaleFilter->findData(rescaleFilter); + if (idx != -1) + ui->advOutRecRescaleFilter->setCurrentIndex(idx); ui->advOutMuxCustom->setText(muxCustom); - int idx = ui->advOutRecFormat->findData(format); + idx = ui->advOutRecFormat->findData(format); ui->advOutRecFormat->setCurrentIndex(idx); ui->advOutRecTrack1->setChecked(tracks & (1 << 0)); @@ -3855,8 +3891,8 @@ void OBSBasicSettings::SaveOutputSettings() SaveComboData(ui->advOutEncoder, "AdvOut", "Encoder"); SaveComboData(ui->advOutAEncoder, "AdvOut", "AudioEncoder"); - SaveCheckBox(ui->advOutUseRescale, "AdvOut", "Rescale"); SaveCombo(ui->advOutRescale, "AdvOut", "RescaleRes"); + SaveComboData(ui->advOutRescaleFilter, "AdvOut", "RescaleFilter"); SaveTrackIndex(main->Config(), "AdvOut", "TrackIndex", ui->advOutTrack1, ui->advOutTrack2, ui->advOutTrack3, ui->advOutTrack4, ui->advOutTrack5, ui->advOutTrack6); @@ -3872,8 +3908,8 @@ void OBSBasicSettings::SaveOutputSettings() SaveComboData(ui->advOutRecFormat, "AdvOut", "RecFormat2"); SaveComboData(ui->advOutRecEncoder, "AdvOut", "RecEncoder"); SaveComboData(ui->advOutRecAEncoder, "AdvOut", "RecAudioEncoder"); - SaveCheckBox(ui->advOutRecUseRescale, "AdvOut", "RecRescale"); SaveCombo(ui->advOutRecRescale, "AdvOut", "RecRescaleRes"); + SaveComboData(ui->advOutRecRescaleFilter, "AdvOut", "RecRescaleFilter"); SaveEdit(ui->advOutMuxCustom, "AdvOut", "RecMuxerCustom"); SaveCheckBox(ui->advOutSplitFile, "AdvOut", "RecSplitFile"); config_set_string( @@ -4406,7 +4442,6 @@ void OBSBasicSettings::on_advOutRecEncoder_currentIndexChanged(int idx) } if (idx <= 0) { - ui->advOutRecUseRescale->setChecked(false); ui->advOutRecUseRescale->setVisible(false); ui->advOutRecRescaleContainer->setVisible(false); ui->advOutRecEncoderProps->setVisible(false);