UI: Add Multitrack Video settings

This commit is contained in:
Ruwen Hahn
2024-04-18 16:23:02 +02:00
committed by Ryan Foster
parent c8950900c3
commit 3f1362f7e7
5 changed files with 827 additions and 333 deletions

View File

@@ -337,6 +337,7 @@ void RestrictResetBitrates(initializer_list<QComboBox *> boxes, int maxbitrate);
#define GROUP_CHANGED &QGroupBox::toggled
#define SCROLL_CHANGED &QSpinBox::valueChanged
#define DSCROLL_CHANGED &QDoubleSpinBox::valueChanged
#define TEXT_CHANGED &QPlainTextEdit::textChanged
#define GENERAL_CHANGED &OBSBasicSettings::GeneralChanged
#define STREAM1_CHANGED &OBSBasicSettings::Stream1Changed
@@ -419,6 +420,14 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->authUsername, EDIT_CHANGED, STREAM1_CHANGED);
HookWidget(ui->authPw, EDIT_CHANGED, STREAM1_CHANGED);
HookWidget(ui->ignoreRecommended, CHECK_CHANGED, STREAM1_CHANGED);
HookWidget(ui->enableMultitrackVideo, CHECK_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoMaximumAggregateBitrateAuto, CHECK_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoMaximumAggregateBitrate, SCROLL_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoMaximumVideoTracksAuto, CHECK_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoMaximumVideoTracks, SCROLL_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoStreamDumpEnable, CHECK_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoConfigOverrideEnable, CHECK_CHANGED, STREAM1_CHANGED);
HookWidget(ui->multitrackVideoConfigOverride, TEXT_CHANGED, STREAM1_CHANGED);
HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->simpleOutputPath, EDIT_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->simpleNoSpace, CHECK_CHANGED, OUTPUTS_CHANGED);
@@ -1068,6 +1077,21 @@ void OBSBasicSettings::SaveSpinBox(QSpinBox *widget, const char *section,
config_set_int(main->Config(), section, value, widget->value());
}
void OBSBasicSettings::SaveText(QPlainTextEdit *widget, const char *section,
const char *value)
{
if (!WidgetChanged(widget))
return;
auto utf8 = widget->toPlainText().toUtf8();
OBSDataAutoRelease safe_text = obs_data_create();
obs_data_set_string(safe_text, "text", utf8.constData());
config_set_string(main->Config(), section, value,
obs_data_get_json(safe_text));
}
std::string DeserializeConfigText(const char *value)
{
OBSDataAutoRelease data = obs_data_create_from_json(value);
@@ -6253,6 +6277,116 @@ void OBSBasicSettings::UpdateAdvNetworkGroup()
#endif
}
extern bool MultitrackVideoDeveloperModeEnabled();
void OBSBasicSettings::UpdateMultitrackVideo()
{
// Technically, it should currently be safe to toggle multitrackVideo
// while not streaming (recording should be irrelevant), but practically
// output settings aren't currently being tracked with that degree of
// flexibility, so just disable everything while outputs are active.
auto toggle_available = !main->Active();
// FIXME: protocol is not updated properly for WHIP; what do?
auto available = protocol.startsWith("RTMP");
if (available && !IsCustomService()) {
OBSDataAutoRelease settings = obs_data_create();
obs_data_set_string(settings, "service",
QT_TO_UTF8(ui->service->currentText()));
OBSServiceAutoRelease temp_service = obs_service_create_private(
"rtmp_common", "auto config query service", settings);
settings = obs_service_get_settings(temp_service);
available = obs_data_has_user_value(
settings, "multitrack_video_configuration_url");
if (!available && ui->enableMultitrackVideo->isChecked())
ui->enableMultitrackVideo->setChecked(false);
}
ui->multitrackVideoGroupBox->setVisible(available);
ui->enableMultitrackVideo->setEnabled(toggle_available);
ui->multitrackVideoMaximumAggregateBitrateLabel->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked());
ui->multitrackVideoMaximumAggregateBitrateAuto->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked());
ui->multitrackVideoMaximumAggregateBitrate->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked() &&
!ui->multitrackVideoMaximumAggregateBitrateAuto->isChecked());
ui->multitrackVideoMaximumVideoTracksLabel->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked());
ui->multitrackVideoMaximumVideoTracksAuto->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked());
ui->multitrackVideoMaximumVideoTracks->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked() &&
!ui->multitrackVideoMaximumVideoTracksAuto->isChecked());
ui->multitrackVideoStreamDumpEnable->setVisible(
available && MultitrackVideoDeveloperModeEnabled());
ui->multitrackVideoConfigOverrideEnable->setVisible(
available && MultitrackVideoDeveloperModeEnabled());
ui->multitrackVideoConfigOverrideLabel->setVisible(
available && MultitrackVideoDeveloperModeEnabled());
ui->multitrackVideoConfigOverride->setVisible(
available && MultitrackVideoDeveloperModeEnabled());
ui->multitrackVideoStreamDumpEnable->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked());
ui->multitrackVideoConfigOverrideEnable->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked());
ui->multitrackVideoConfigOverrideLabel->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked() &&
ui->multitrackVideoConfigOverrideEnable->isChecked());
ui->multitrackVideoConfigOverride->setEnabled(
toggle_available && ui->enableMultitrackVideo->isChecked() &&
ui->multitrackVideoConfigOverrideEnable->isChecked());
if (available) {
OBSDataAutoRelease settings;
{
auto service_name = ui->service->currentText();
auto custom_server = ui->customServer->text().trimmed();
obs_properties_t *props =
obs_get_service_properties("rtmp_common");
obs_property_t *service =
obs_properties_get(props, "service");
settings = obs_data_create();
obs_data_set_string(settings, "service",
QT_TO_UTF8(service_name));
obs_property_modified(service, settings);
obs_properties_destroy(props);
}
auto multitrack_video_name =
QTStr("Basic.Settings.Stream.MultitrackVideoLabel");
if (obs_data_has_user_value(settings, "multitrack_video_name"))
multitrack_video_name = obs_data_get_string(
settings, "multitrack_video_name");
ui->enableMultitrackVideo->setText(
QTStr("Basic.Settings.Stream.EnableMultitrackVideo")
.arg(multitrack_video_name));
if (obs_data_has_user_value(settings,
"multitrack_video_disclaimer")) {
ui->multitrackVideoInfo->setVisible(true);
ui->multitrackVideoInfo->setText(obs_data_get_string(
settings, "multitrack_video_disclaimer"));
} else {
ui->multitrackVideoInfo->setText(
QTStr("MultitrackVideo.Info")
.arg(multitrack_video_name,
ui->service->currentText()));
}
}
}
void OBSBasicSettings::SimpleStreamAudioEncoderChanged()
{
PopulateSimpleBitrates(