Add fps divisor and scaling

This commit is contained in:
Exeldro 2024-07-24 11:44:30 +02:00
parent 387f087c9b
commit 9e6f9b8022
No known key found for this signature in database
GPG Key ID: 97269A83FC715751

View File

@ -455,17 +455,24 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
auto advancedGroup = new QGroupBox(QString::fromUtf8(obs_module_text("AdvancedGroupHeader"))); auto advancedGroup = new QGroupBox(QString::fromUtf8(obs_module_text("AdvancedGroupHeader")));
advancedGroup->setContentsMargins(0, 4, 0, 0); advancedGroup->setContentsMargins(0, 4, 0, 0);
advancedGroup->setStyleSheet("QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top right; padding: 12px 18px 0 0; }" advancedGroup->setProperty("customTitle", QVariant(true));
"QGroupBox { padding-top: 4px; padding-bottom: 0;}"); advancedGroup->setStyleSheet(
advancedGroup->setVisible(advanced); "QGroupBox[customTitle=\"true\"]::title { subcontrol-origin: margin; subcontrol-position: top right; padding: 12px 18px 0 0; }"
"QGroupBox[customTitle=\"true\"] { padding-top: 4px; padding-bottom: 0;}");
if (!advanced)
advancedGroup->setVisible(false);
auto advancedGroupLayout = new QVBoxLayout; auto advancedGroupLayout = new QVBoxLayout;
advancedGroup->setLayout(advancedGroupLayout); advancedGroup->setLayout(advancedGroupLayout);
// Tab widget // Tab widget
// 1 = bg for active tab + pane, 2 = inactive tabs, 3 = tab text colour, 4 = border colour for pane // 1 = bg for active tab + pane, 2 = inactive tabs, 3 = tab text colour, 4 = border colour for pane
auto tabStyles = QString("QTabWidget::pane { background: %1; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-right-radius: 4px; margin-top: -1px; padding-top: 8px; border: 1px solid %4; } QTabWidget::tab-bar { margin-bottom: 0; padding-bottom: 0; border-color: %4; } QTabBar::tab { color: %3; padding: 10px; margin-bottom: 0; border: 1px solid %4; } QTabBar::tab:selected { background: %1; font-weight: bold; border-bottom: none; } QTabBar::tab:!selected { background: %2; }") auto tabStyles =
.arg(palette().color(QPalette::ColorRole::Mid).name(QColor::HexRgb), palette().color(QPalette::ColorRole::Light).name(QColor::HexRgb), palette().color(QPalette::ColorRole::Text).name(QColor::HexRgb), palette().color(QPalette::ColorRole::Light).name(QColor::HexRgb)); QString("QTabWidget::pane { background: %1; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-right-radius: 4px; margin-top: -1px; padding-top: 8px; border: 1px solid %4; } QTabWidget::tab-bar { margin-bottom: 0; padding-bottom: 0; border-color: %4; } QTabBar::tab { color: %3; padding: 10px; margin-bottom: 0; border: 1px solid %4; } QTabBar::tab:selected { background: %1; font-weight: bold; border-bottom: none; } QTabBar::tab:!selected { background: %2; }")
.arg(palette().color(QPalette::ColorRole::Mid).name(QColor::HexRgb),
palette().color(QPalette::ColorRole::Light).name(QColor::HexRgb),
palette().color(QPalette::ColorRole::Text).name(QColor::HexRgb),
palette().color(QPalette::ColorRole::Light).name(QColor::HexRgb));
auto advancedTabWidget = new QTabWidget; auto advancedTabWidget = new QTabWidget;
advancedTabWidget->setContentsMargins(0, 0, 0, 0); advancedTabWidget->setContentsMargins(0, 0, 0, 0);
@ -493,7 +500,6 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
auto audioPageLayout = new QFormLayout; auto audioPageLayout = new QFormLayout;
audioPage->setLayout(audioPageLayout); audioPage->setLayout(audioPageLayout);
// VIDEO ENCODER // VIDEO ENCODER
auto videoEncoder = new QComboBox; auto videoEncoder = new QComboBox;
videoEncoder->addItem(QString::fromUtf8(obs_module_text("MainEncoder")), QVariant(QString::fromUtf8(""))); videoEncoder->addItem(QString::fromUtf8(obs_module_text("MainEncoder")), QVariant(QString::fromUtf8("")));
@ -517,9 +523,100 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
videoEncoderGroup->setLayout(videoEncoderGroupLayout); videoEncoderGroup->setLayout(videoEncoderGroupLayout);
videoPageLayout->addRow(videoEncoderGroup); videoPageLayout->addRow(videoEncoderGroup);
const bool main = outputsLayout == mainOutputsLayout;
if (main) {
struct obs_video_info ovi;
obs_get_video_info(&ovi);
double fps = ovi.fps_den > 0 ? (double)ovi.fps_num / (double)ovi.fps_den : 0.0;
auto fpsDivisor = new QComboBox;
auto frd = obs_data_get_int(settings, "frame_rate_divisor");
for (int i = 1; i <= 10; i++) {
if (i == 1) {
fpsDivisor->addItem(
QString::number(fps, 'g', 3) + " " + QString::fromUtf8(obs_module_text("Original")), i);
fpsDivisor->setCurrentIndex(0);
} else {
fpsDivisor->addItem(QString::number(fps / i, 'g', 3), i);
if (frd == i) {
fpsDivisor->setCurrentIndex(fpsDivisor->count() - 1);
}
}
}
videoEncoderGroupLayout->addRow(QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.FPS")),
fpsDivisor);
//obs_encoder_get_frame_rate_divisor
auto scale = new QGroupBox(QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Output.Adv.Rescale")));
scale->setCheckable(true);
scale->setChecked(obs_data_get_bool(settings, "scale"));
connect(scale, &QGroupBox::toggled,
[scale, settings] { obs_data_set_bool(settings, "scale", scale->isChecked()); });
auto scaleLayout = new QFormLayout();
scale->setLayout(scaleLayout);
auto downscale = new QComboBox;
auto downscale_type = obs_data_get_int(settings, "scale_type");
downscale->addItem(QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Output.Adv.Rescale.Disabled")),
OBS_SCALE_DISABLE);
downscale->setCurrentIndex(0);
downscale->addItem(
QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.DownscaleFilter.Bilinear")),
OBS_SCALE_BILINEAR);
if (downscale_type == OBS_SCALE_BILINEAR)
downscale->setCurrentIndex(1);
downscale->addItem(QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.DownscaleFilter.Area")),
OBS_SCALE_AREA);
if (downscale_type == OBS_SCALE_AREA)
downscale->setCurrentIndex(2);
downscale->addItem(
QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.DownscaleFilter.Bicubic")),
OBS_SCALE_BICUBIC);
if (downscale_type == OBS_SCALE_BICUBIC)
downscale->setCurrentIndex(3);
downscale->addItem(
QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.DownscaleFilter.Lanczos")),
OBS_SCALE_LANCZOS);
if (downscale_type == OBS_SCALE_LANCZOS)
downscale->setCurrentIndex(4);
connect(downscale, &QComboBox::currentIndexChanged,
[downscale, settings] { obs_data_set_int(settings, "scale_type", downscale->currentData().toInt()); });
scaleLayout->addRow(QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.DownscaleFilter")),
downscale);
auto resolution = new QComboBox;
resolution->setEditable(true);
resolution->addItem("1280x720");
resolution->addItem("1920x1080");
resolution->addItem("2560x1440");
resolution->setCurrentText(QString::number(obs_data_get_int(settings, "width")) + "x" +
QString::number(obs_data_get_int(settings, "height")));
if (resolution->currentText() == "0x0")
resolution->setCurrentText(QString::number(ovi.output_width) + "x" + QString::number(ovi.output_height));
connect(resolution, &QComboBox::currentTextChanged, [settings, resolution] {
const auto res = resolution->currentText();
uint32_t width, height;
if (sscanf(res.toUtf8().constData(), "%dx%d", &width, &height) == 2 && width > 0 && height > 0) {
obs_data_set_int(settings, "width", width);
obs_data_set_int(settings, "height", height);
}
});
scaleLayout->addRow(QString::fromUtf8(obs_frontend_get_locale_string("Basic.Settings.Video.ScaledResolution")),
resolution);
videoEncoderGroupLayout->addRow(scale);
}
connect(videoEncoder, &QComboBox::currentIndexChanged, connect(videoEncoder, &QComboBox::currentIndexChanged,
[this, serverGroup, advancedGroupLayout, videoPageLayout, videoEncoder, videoEncoderIndex, videoEncoderGroup, [this, serverGroup, advancedGroupLayout, videoPageLayout, videoEncoder, videoEncoderIndex, videoEncoderGroup,
videoEncoderGroupLayout, settings] { videoEncoderGroupLayout, settings, videoPage, main] {
auto encoder_string = videoEncoder->currentData().toString().toUtf8(); auto encoder_string = videoEncoder->currentData().toString().toUtf8();
auto encoder = encoder_string.constData(); auto encoder = encoder_string.constData();
obs_data_set_string(settings, "video_encoder", encoder); obs_data_set_string(settings, "video_encoder", encoder);
@ -528,13 +625,14 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
videoEncoderGroup->setVisible(false); videoEncoderGroup->setVisible(false);
} else { } else {
videoPageLayout->setRowVisible(videoEncoderIndex, false); videoPageLayout->setRowVisible(videoEncoderIndex, false);
if (!videoEncoderGroup->isVisibleTo(videoPage))
videoEncoderGroup->setVisible(true); videoEncoderGroup->setVisible(true);
auto t = encoder_properties.find(serverGroup); auto t = encoder_properties.find(serverGroup);
if (t != encoder_properties.end()) { if (t != encoder_properties.end()) {
obs_properties_destroy(t->second); obs_properties_destroy(t->second);
encoder_properties.erase(t); encoder_properties.erase(t);
} }
for (int i = videoEncoderGroupLayout->rowCount() - 1; i >= 0; i--) { for (int i = videoEncoderGroupLayout->rowCount() - 1; i >= (main ? 2 : 0); i--) {
videoEncoderGroupLayout->removeRow(i); videoEncoderGroupLayout->removeRow(i);
} }
//auto stream_encoder_settings = obs_encoder_defaults(encoder); //auto stream_encoder_settings = obs_encoder_defaults(encoder);
@ -572,7 +670,8 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
if (strcmp(type, current_type) == 0) if (strcmp(type, current_type) == 0)
videoEncoder->setCurrentIndex(videoEncoder->count() - 1); videoEncoder->setCurrentIndex(videoEncoder->count() - 1);
} }
videoEncoderGroup->setVisible(advanced && videoEncoder->currentIndex() > 0); if (!advanced || videoEncoder->currentIndex() <= 0)
videoEncoderGroup->setVisible(false);
auto audioEncoder = new QComboBox; auto audioEncoder = new QComboBox;
audioEncoder->addItem(QString::fromUtf8(obs_module_text("MainEncoder")), QVariant(QString::fromUtf8(""))); audioEncoder->addItem(QString::fromUtf8(obs_module_text("MainEncoder")), QVariant(QString::fromUtf8("")));
@ -611,7 +710,7 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
connect(audioEncoder, &QComboBox::currentIndexChanged, connect(audioEncoder, &QComboBox::currentIndexChanged,
[this, serverGroup, advancedGroupLayout, audioPageLayout, audioEncoder, audioEncoderIndex, audioEncoderGroup, [this, serverGroup, advancedGroupLayout, audioPageLayout, audioEncoder, audioEncoderIndex, audioEncoderGroup,
audioEncoderGroupLayout, audioTrack, settings] { audioEncoderGroupLayout, audioTrack, settings, audioPage] {
auto encoder_string = audioEncoder->currentData().toString().toUtf8(); auto encoder_string = audioEncoder->currentData().toString().toUtf8();
auto encoder = encoder_string.constData(); auto encoder = encoder_string.constData();
obs_data_set_string(settings, "audio_encoder", encoder); obs_data_set_string(settings, "audio_encoder", encoder);
@ -622,6 +721,7 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
} else { } else {
audioPageLayout->setRowVisible(audioEncoderIndex, false); audioPageLayout->setRowVisible(audioEncoderIndex, false);
audioPageLayout->setRowVisible(audioTrack, true); audioPageLayout->setRowVisible(audioTrack, true);
if (!audioEncoderGroup->isVisibleTo(audioPage))
audioEncoderGroup->setVisible(true); audioEncoderGroup->setVisible(true);
auto t = encoder_properties.find(serverGroup); auto t = encoder_properties.find(serverGroup);
if (t != encoder_properties.end()) { if (t != encoder_properties.end()) {
@ -665,7 +765,8 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
if (strcmp(type, current_type) == 0) if (strcmp(type, current_type) == 0)
audioEncoder->setCurrentIndex(audioEncoder->count() - 1); audioEncoder->setCurrentIndex(audioEncoder->count() - 1);
} }
audioEncoderGroup->setVisible(audioEncoder->currentIndex() > 0); if (audioEncoder->currentIndex() <= 0)
audioEncoderGroup->setVisible(false);
audioPageLayout->setRowVisible(audioTrack, audioEncoder->currentIndex() > 0); audioPageLayout->setRowVisible(audioTrack, audioEncoder->currentIndex() > 0);
auto advancedButton = new QPushButton(QString::fromUtf8(obs_module_text("EditEncoderSettings"))); auto advancedButton = new QPushButton(QString::fromUtf8(obs_module_text("EditEncoderSettings")));
@ -683,10 +784,6 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
advancedTabWidget->addTab(audioPage, QString::fromUtf8(obs_module_text("AudioEncoderSettings"))); advancedTabWidget->addTab(audioPage, QString::fromUtf8(obs_module_text("AudioEncoderSettings")));
advancedGroupLayout->addWidget(advancedTabWidget, 1); advancedGroupLayout->addWidget(advancedTabWidget, 1);
// Remove button // Remove button
auto removeButton = auto removeButton =
new QPushButton(QIcon(":/res/images/minus.svg"), QString::fromUtf8(obs_frontend_get_locale_string("Remove"))); new QPushButton(QIcon(":/res/images/minus.svg"), QString::fromUtf8(obs_frontend_get_locale_string("Remove")));