Sfoglia il codice sorgente

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.
jp9000 10 anni fa
parent
commit
d1293b2b8a

+ 5 - 0
obs/data/locale/en-US.ini

@@ -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"

+ 142 - 2
obs/forms/OBSBasicSettings.ui

@@ -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>

+ 4 - 0
obs/window-basic-main.cpp

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

+ 90 - 0
obs/window-basic-settings.cpp

@@ -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();
+}

+ 5 - 0
obs/window-basic-settings.hpp

@@ -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: