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);