mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-19 20:32:15 +02:00
UI: Add stream delay options to advanced settings
I added stream delay options to advanced settings not just because I feel it's an advanced option, but also to reduce clutter in the outputs section and its sub-sections, which already have far too many options as it is.
This commit is contained in:
parent
0538865553
commit
d1293b2b8a
@ -42,6 +42,7 @@ Hide="Hide"
|
||||
Untitled="Untitled"
|
||||
New="New"
|
||||
Duplicate="Duplicate"
|
||||
Enable="Enable"
|
||||
|
||||
# title bar strings
|
||||
TitleBar.Profile="Profile"
|
||||
@ -391,6 +392,10 @@ Basic.Settings.Advanced.Video.ColorSpace="YUV Color Space"
|
||||
Basic.Settings.Advanced.Video.ColorRange="YUV Color Range"
|
||||
Basic.Settings.Advanced.Video.ColorRange.Partial="Partial"
|
||||
Basic.Settings.Advanced.Video.ColorRange.Full="Full"
|
||||
Basic.Settings.Advanced.StreamDelay="Stream Delay"
|
||||
Basic.Settings.Advanced.StreamDelay.Duration="Duration (seconds)"
|
||||
Basic.Settings.Advanced.StreamDelay.Preserve="Preserve cutoff point (increase delay) when reconnecting"
|
||||
Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimated Memory Usage: %1 MB"
|
||||
|
||||
# advanced audio properties
|
||||
Basic.AdvAudio="Advanced Audio Properties"
|
||||
|
@ -2790,6 +2790,98 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_5">
|
||||
<property name="title">
|
||||
<string>Basic.Settings.Advanced.StreamDelay</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_18">
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="streamDelayEnable">
|
||||
<property name="text">
|
||||
<string>Enable</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_56">
|
||||
<property name="text">
|
||||
<string>Basic.Settings.Advanced.StreamDelay.Duration</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QWidget" name="widget_12" native="true">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_13">
|
||||
<property name="spacing">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="streamDelaySec">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string notr="true">s</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1800</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="streamDelayInfo">
|
||||
<property name="text">
|
||||
<string notr="true">Estimated RAM goes here</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="streamDelayPreserve">
|
||||
<property name="text">
|
||||
<string>Basic.Settings.Advanced.StreamDelay.Preserve</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="advancedMsg">
|
||||
<property name="styleSheet">
|
||||
@ -3222,8 +3314,56 @@
|
||||
<slot>setCurrentIndex(int)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>732</x>
|
||||
<y>179</y>
|
||||
<x>250</x>
|
||||
<y>89</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>250</x>
|
||||
<y>92</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>streamDelayEnable</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>label_56</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>533</x>
|
||||
<y>273</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>449</x>
|
||||
<y>301</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>streamDelayEnable</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>streamDelayPreserve</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>578</x>
|
||||
<y>275</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>593</x>
|
||||
<y>339</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>streamDelayEnable</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>widget_12</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>517</x>
|
||||
<y>267</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>777</x>
|
||||
|
@ -689,6 +689,10 @@ bool OBSBasic::InitBasicConfigDefaults()
|
||||
config_set_default_uint (basicConfig, "Video", "BaseCX", cx);
|
||||
config_set_default_uint (basicConfig, "Video", "BaseCY", cy);
|
||||
|
||||
config_set_default_bool (basicConfig, "Output", "DelayEnable", false);
|
||||
config_set_default_uint (basicConfig, "Output", "DelaySec", 20);
|
||||
config_set_default_bool (basicConfig, "Output", "DelayPreserve", true);
|
||||
|
||||
int i = 0;
|
||||
uint32_t scale_cx = cx;
|
||||
uint32_t scale_cy = cy;
|
||||
|
@ -346,6 +346,9 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||
HookWidget(ui->colorFormat, COMBO_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->colorSpace, COMBO_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->colorRange, COMBO_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->streamDelayEnable, CHECK_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->streamDelaySec, SCROLL_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->streamDelayPreserve, CHECK_CHANGED, ADV_CHANGED);
|
||||
|
||||
#ifdef _WIN32
|
||||
uint32_t winVer = GetWindowsVersion();
|
||||
@ -363,6 +366,23 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||
}
|
||||
#endif
|
||||
|
||||
connect(ui->streamDelaySec, SIGNAL(valueChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->outputMode, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->simpleOutputVBitrate, SIGNAL(valueChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->simpleOutputABitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->advOutTrack1Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->advOutTrack2Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->advOutTrack3Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(ui->advOutTrack4Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
|
||||
//Apply button disabled until change.
|
||||
EnableApplyButton(false);
|
||||
|
||||
@ -1096,7 +1116,12 @@ void OBSBasicSettings::LoadAdvOutputStreamingEncoderProperties()
|
||||
"streamEncoder.json");
|
||||
ui->advOutputStreamTab->layout()->addWidget(streamEncoderProps);
|
||||
|
||||
connect(streamEncoderProps, SIGNAL(Changed()),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
|
||||
SetComboByValue(ui->advOutEncoder, encoder);
|
||||
|
||||
UpdateStreamDelayEstimate();
|
||||
}
|
||||
|
||||
void OBSBasicSettings::LoadAdvOutputRecordingSettings()
|
||||
@ -1548,9 +1573,19 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
||||
"Video", "ColorSpace");
|
||||
const char *videoColorRange = config_get_string(main->Config(),
|
||||
"Video", "ColorRange");
|
||||
bool enableDelay = config_get_bool(main->Config(), "Output",
|
||||
"DelayEnable");
|
||||
int delaySec = config_get_int(main->Config(), "Output",
|
||||
"DelaySec");
|
||||
bool preserveDelay = config_get_bool(main->Config(), "Output",
|
||||
"DelayPreserve");
|
||||
|
||||
loading = true;
|
||||
|
||||
ui->streamDelaySec->setValue(delaySec);
|
||||
ui->streamDelayPreserve->setChecked(preserveDelay);
|
||||
ui->streamDelayEnable->setChecked(enableDelay);
|
||||
|
||||
ui->audioBufferingTime->setValue(audioBufferingTime);
|
||||
SetComboByName(ui->colorFormat, videoColorFormat);
|
||||
SetComboByName(ui->colorSpace, videoColorSpace);
|
||||
@ -1954,6 +1989,9 @@ void OBSBasicSettings::SaveAdvancedSettings()
|
||||
SaveCombo(ui->colorFormat, "Video", "ColorFormat");
|
||||
SaveCombo(ui->colorSpace, "Video", "ColorSpace");
|
||||
SaveComboData(ui->colorRange, "Video", "ColorRange");
|
||||
SaveCheckBox(ui->streamDelayEnable, "Output", "DelayEnable");
|
||||
SaveSpinBox(ui->streamDelaySec, "Output", "DelaySec");
|
||||
SaveCheckBox(ui->streamDelayPreserve, "Output", "DelayPreserve");
|
||||
}
|
||||
|
||||
static inline const char *OutputModeFromIdx(int idx)
|
||||
@ -2701,3 +2739,55 @@ void OBSBasicSettings::AdvOutRecCheckWarnings()
|
||||
formLayout->addRow(nullptr, advOutRecWarning);
|
||||
}
|
||||
}
|
||||
|
||||
static inline QString MakeMemorySizeString(int bitrate, int seconds)
|
||||
{
|
||||
QString str = QTStr("Basic.Settings.Advanced.StreamDelay.MemoryUsage");
|
||||
int megabytes = bitrate * seconds / 1000 / 8;
|
||||
|
||||
return str.arg(QString::number(megabytes));
|
||||
}
|
||||
|
||||
void OBSBasicSettings::UpdateSimpleOutStreamDelayEstimate()
|
||||
{
|
||||
int seconds = ui->streamDelaySec->value();
|
||||
int vBitrate = ui->simpleOutputVBitrate->value();
|
||||
int aBitrate = ui->simpleOutputABitrate->currentText().toInt();
|
||||
|
||||
QString msg = MakeMemorySizeString(vBitrate + aBitrate, seconds);
|
||||
|
||||
ui->streamDelayInfo->setText(msg);
|
||||
}
|
||||
|
||||
void OBSBasicSettings::UpdateAdvOutStreamDelayEstimate()
|
||||
{
|
||||
if (!streamEncoderProps)
|
||||
return;
|
||||
|
||||
OBSData settings = streamEncoderProps->GetSettings();
|
||||
int trackIndex = config_get_int(main->Config(), "AdvOut", "TrackIndex");
|
||||
QString aBitrateText;
|
||||
|
||||
switch (trackIndex) {
|
||||
case 1: aBitrateText = ui->advOutTrack1Bitrate->currentText(); break;
|
||||
case 2: aBitrateText = ui->advOutTrack2Bitrate->currentText(); break;
|
||||
case 3: aBitrateText = ui->advOutTrack3Bitrate->currentText(); break;
|
||||
case 4: aBitrateText = ui->advOutTrack4Bitrate->currentText(); break;
|
||||
}
|
||||
|
||||
int seconds = ui->streamDelaySec->value();
|
||||
int vBitrate = (int)obs_data_get_int(settings, "bitrate");
|
||||
int aBitrate = aBitrateText.toInt();
|
||||
|
||||
QString msg = MakeMemorySizeString(vBitrate + aBitrate, seconds);
|
||||
|
||||
ui->streamDelayInfo->setText(msg);
|
||||
}
|
||||
|
||||
void OBSBasicSettings::UpdateStreamDelayEstimate()
|
||||
{
|
||||
if (ui->outputMode->currentIndex() == 0)
|
||||
UpdateSimpleOutStreamDelayEstimate();
|
||||
else
|
||||
UpdateAdvOutStreamDelayEstimate();
|
||||
}
|
||||
|
@ -222,6 +222,9 @@ private:
|
||||
void SaveAdvancedSettings();
|
||||
void SaveSettings();
|
||||
|
||||
void UpdateSimpleOutStreamDelayEstimate();
|
||||
void UpdateAdvOutStreamDelayEstimate();
|
||||
|
||||
private slots:
|
||||
void on_theme_activated(int idx);
|
||||
|
||||
@ -259,6 +262,8 @@ private slots:
|
||||
void AdvancedChanged();
|
||||
void AdvancedChangedRestart();
|
||||
|
||||
void UpdateStreamDelayEstimate();
|
||||
|
||||
void AdvOutRecCheckWarnings();
|
||||
|
||||
protected:
|
||||
|
Loading…
Reference in New Issue
Block a user