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:
jp9000
2015-09-06 16:12:03 -07:00
parent 0538865553
commit d1293b2b8a
5 changed files with 246 additions and 2 deletions

View File

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