From 93456dfde24ddbf86d03bd19d5e6ed29614789f1 Mon Sep 17 00:00:00 2001 From: derrod Date: Mon, 2 May 2022 16:18:09 +0200 Subject: [PATCH] UI: Set Replay Buffer Memory limit dynamically --- UI/data/locale/en-US.ini | 1 + UI/window-basic-settings.cpp | 57 +++++++++++++++++++++++++++++------- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index ac57cae3a..74fb2c377 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -926,6 +926,7 @@ Basic.Settings.Output.UseReplayBuffer="Enable Replay Buffer" Basic.Settings.Output.ReplayBuffer.SecondsMax="Maximum Replay Time" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Maximum Memory (Megabytes)" Basic.Settings.Output.ReplayBuffer.Estimate="Estimated memory usage: %1 MB" +Basic.Settings.Output.ReplayBuffer.EstimateTooLarge="Warning: Estimated memory usage of %1 MiB is larger than recommended maximum of %2 MiB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Cannot estimate memory usage. Please set maximum memory limit." Basic.Settings.Output.ReplayBuffer.Prefix="Replay Buffer Filename Prefix" Basic.Settings.Output.ReplayBuffer.Suffix="Suffix" diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index c6c07d00a..a72bf5807 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -4976,6 +4976,8 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged() } #define ESTIMATE_STR "Basic.Settings.Output.ReplayBuffer.Estimate" +#define ESTIMATE_TOO_LARGE_STR \ + "Basic.Settings.Output.ReplayBuffer.EstimateTooLarge" #define ESTIMATE_UNKNOWN_STR \ "Basic.Settings.Output.ReplayBuffer.EstimateUnknown" @@ -5013,17 +5015,33 @@ void OBSBasicSettings::SimpleReplayBufferChanged() int abitrate = ui->simpleOutputABitrate->currentText().toInt(); int seconds = ui->simpleRBSecMax->value(); + // Set maximum to 75% of installed memory + uint64_t memTotal = os_get_sys_total_size(); + int64_t memMaxMB = memTotal ? memTotal * 3 / 4 / 1024 / 1024 : 8192; + int64_t memMB = int64_t(seconds) * int64_t(vbitrate + abitrate) * 1000 / 8 / 1024 / 1024; if (memMB < 1) memMB = 1; - if (streamQuality) - ui->simpleRBEstimate->setText( - QTStr(ESTIMATE_STR).arg(QString::number(int(memMB)))); - else + ui->simpleRBEstimate->setObjectName(""); + if (streamQuality) { + if (memMB <= memMaxMB) { + ui->simpleRBEstimate->setText( + QTStr(ESTIMATE_STR) + .arg(QString::number(int(memMB)))); + } else { + ui->simpleRBEstimate->setText( + QTStr(ESTIMATE_TOO_LARGE_STR) + .arg(QString::number(int(memMB)), + QString::number(int(memMaxMB)))); + ui->simpleRBEstimate->setObjectName("warningLabel"); + } + } else { ui->simpleRBEstimate->setText(QTStr(ESTIMATE_UNKNOWN_STR)); + } + ui->simpleRBEstimate->style()->polish(ui->simpleRBEstimate); ui->replayBufferGroupBox->setVisible(!lossless && replayBufferEnabled); ui->simpleReplayBuf->setVisible(!lossless); @@ -5089,6 +5107,10 @@ void OBSBasicSettings::AdvReplayBufferChanged() int seconds = ui->advRBSecMax->value(); + // Set maximum to 75% of installed memory + uint64_t memTotal = os_get_sys_total_size(); + int64_t memMaxMB = memTotal ? memTotal * 3 / 4 / 1024 / 1024 : 8192; + int64_t memMB = int64_t(seconds) * int64_t(vbitrate + abitrate) * 1000 / 8 / 1024 / 1024; if (memMB < 1) @@ -5100,16 +5122,31 @@ void OBSBasicSettings::AdvReplayBufferChanged() if (vbitrate == 0) varRateControl = false; - ui->advRBMegsMax->setVisible(!varRateControl); - ui->advRBMegsMaxLabel->setVisible(!varRateControl); + ui->advRBEstimate->setObjectName(""); + if (varRateControl) { + ui->advRBMegsMax->setVisible(false); + ui->advRBMegsMaxLabel->setVisible(false); - if (varRateControl) - ui->advRBEstimate->setText( - QTStr(ESTIMATE_STR).arg(QString::number(int(memMB)))); - else + if (memMB <= memMaxMB) { + ui->advRBEstimate->setText( + QTStr(ESTIMATE_STR) + .arg(QString::number(int(memMB)))); + } else { + ui->advRBEstimate->setText( + QTStr(ESTIMATE_TOO_LARGE_STR) + .arg(QString::number(int(memMB)), + QString::number(int(memMaxMB)))); + ui->advRBEstimate->setObjectName("warningLabel"); + } + } else { + ui->advRBMegsMax->setVisible(true); + ui->advRBMegsMaxLabel->setVisible(true); + ui->advRBMegsMax->setMaximum(memMaxMB); ui->advRBEstimate->setText(QTStr(ESTIMATE_UNKNOWN_STR)); + } ui->advReplayBufferFrame->setEnabled(!lossless && replayBufferEnabled); + ui->advRBEstimate->style()->polish(ui->advRBEstimate); ui->advReplayBuf->setEnabled(!lossless); UpdateAutomaticReplayBufferCheckboxes();