mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 04:42:18 +02:00
UI: Add and migrate to GPU scaling options
This commit is contained in:
parent
fb8d228a82
commit
0a8e00c478
@ -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"
|
||||
|
@ -2590,7 +2590,7 @@
|
||||
<widget class="QComboBox" name="advOutEncoder"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="advOutUseRescale">
|
||||
<widget class="QLabel" name="advOutUseRescale">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -2606,6 +2606,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
||||
<item>
|
||||
<widget class="QComboBox" name="advOutRescaleFilter" />
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="advOutRescale">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
@ -2616,6 +2621,8 @@
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@ -3200,7 +3207,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QCheckBox" name="advOutRecUseRescale">
|
||||
<widget class="QLabel" name="advOutRecUseRescale">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
@ -3230,6 +3237,9 @@
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QComboBox" name="advOutRecRescaleFilter" />
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="advOutRecRescale">
|
||||
<property name="enabled">
|
||||
@ -7937,7 +7947,7 @@
|
||||
<tabstop>advOutMultiTrack5</tabstop>
|
||||
<tabstop>advOutMultiTrack6</tabstop>
|
||||
<tabstop>advOutEncoder</tabstop>
|
||||
<tabstop>advOutUseRescale</tabstop>
|
||||
<tabstop>advOutRescaleFilter</tabstop>
|
||||
<tabstop>advOutRescale</tabstop>
|
||||
<tabstop>advOutRecType</tabstop>
|
||||
<tabstop>advOutRecPath</tabstop>
|
||||
@ -7951,7 +7961,7 @@
|
||||
<tabstop>advOutRecTrack5</tabstop>
|
||||
<tabstop>advOutRecTrack6</tabstop>
|
||||
<tabstop>advOutRecEncoder</tabstop>
|
||||
<tabstop>advOutRecUseRescale</tabstop>
|
||||
<tabstop>advOutRecRescaleFilter</tabstop>
|
||||
<tabstop>advOutRecRescale</tabstop>
|
||||
<tabstop>advOutMuxCustom</tabstop>
|
||||
<tabstop>advOutSplitFile</tabstop>
|
||||
@ -8370,22 +8380,6 @@
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>advOutUseRescale</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>advOutRescale</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>269</x>
|
||||
<y>192</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>656</x>
|
||||
<y>192</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>advOutRecType</sender>
|
||||
<signal>currentIndexChanged(int)</signal>
|
||||
@ -8402,22 +8396,6 @@
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>advOutRecUseRescale</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>advOutRecRescale</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>289</x>
|
||||
<y>317</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>662</x>
|
||||
<y>317</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>advOutFFUseRescale</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user