Cache video encoder descriptions

This commit is contained in:
Exeldro 2024-07-29 16:13:22 +02:00
parent 95c3b886b9
commit 25140bfd29
No known key found for this signature in database
GPG Key ID: 97269A83FC715751
4 changed files with 23 additions and 12 deletions

View File

@ -559,9 +559,18 @@ void OBSBasicSettings::AddServer(QFormLayout *outputsLayout, obs_data_t *setting
videoEncoder->setCurrentIndex(0); videoEncoder->setCurrentIndex(0);
videoPageLayout->addRow(QString::fromUtf8(obs_module_text("VideoEncoder")), videoEncoder); videoPageLayout->addRow(QString::fromUtf8(obs_module_text("VideoEncoder")), videoEncoder);
bool allEmpty = false;
auto videoEncoderIndex = new QComboBox; auto videoEncoderIndex = new QComboBox;
for (int i = 0; i < MAX_OUTPUT_VIDEO_ENCODERS; i++) { for (int i = 0; i < MAX_OUTPUT_VIDEO_ENCODERS; i++) {
videoEncoderIndex->addItem(QString::number(i + 1) + " " + mainEncoderDescriptions[i]); QString settingName = QString::fromUtf8("video_encoder_description") + QString::number(i);
auto description = obs_data_get_string(this->settings, settingName.toUtf8().constData());
if (!description || description[0] == '\0') {
if (i != 0 && !allEmpty) {
break;
}
allEmpty = true;
}
videoEncoderIndex->addItem(QString::number(i + 1) + " " + description);
} }
videoEncoderIndex->setCurrentIndex(obs_data_get_int(settings, "video_encoder_index")); videoEncoderIndex->setCurrentIndex(obs_data_get_int(settings, "video_encoder_index"));
connect(videoEncoderIndex, &QComboBox::currentIndexChanged, [videoEncoderIndex, settings] { connect(videoEncoderIndex, &QComboBox::currentIndexChanged, [videoEncoderIndex, settings] {
@ -733,7 +742,7 @@ 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);
} }
if (!advanced || videoEncoder->currentIndex() <= 0) if (videoEncoder->currentIndex() <= 0)
videoEncoderGroup->setVisible(false); videoEncoderGroup->setVisible(false);
auto audioEncoder = new QComboBox; auto audioEncoder = new QComboBox;

View File

@ -80,7 +80,5 @@ public:
void LoadOutputStats(std::vector<video_t *> *oldVideos); void LoadOutputStats(std::vector<video_t *> *oldVideos);
void SetNewerVersion(QString newer_version_available); void SetNewerVersion(QString newer_version_available);
QStringList mainEncoderDescriptions = QStringList(MAX_OUTPUT_VIDEO_ENCODERS);
public slots: public slots:
}; };

View File

@ -284,7 +284,6 @@ MultistreamDock::MultistreamDock(QWidget *parent) : QFrame(parent)
QPushButton::connect(configButton, &QPushButton::clicked, [this] { QPushButton::connect(configButton, &QPushButton::clicked, [this] {
if (!configDialog) if (!configDialog)
configDialog = new OBSBasicSettings((QMainWindow *)obs_frontend_get_main_window()); configDialog = new OBSBasicSettings((QMainWindow *)obs_frontend_get_main_window());
configDialog->mainEncoderDescriptions = mainEncoderDescriptions;
auto settings = obs_data_create(); auto settings = obs_data_create();
if (current_config) if (current_config)
obs_data_apply(settings, current_config); obs_data_apply(settings, current_config);
@ -929,6 +928,8 @@ void MultistreamDock::LoadVerticalOutputs(bool firstLoad)
void MultistreamDock::storeMainStreamEncoders() void MultistreamDock::storeMainStreamEncoders()
{ {
if (!current_config)
return;
struct obs_video_info ovi = {0}; struct obs_video_info ovi = {0};
obs_get_video_info(&ovi); obs_get_video_info(&ovi);
double fps = ovi.fps_den > 0 ? (double)ovi.fps_num / (double)ovi.fps_den : 0.0; double fps = ovi.fps_den > 0 ? (double)ovi.fps_num / (double)ovi.fps_den : 0.0;
@ -936,24 +937,28 @@ void MultistreamDock::storeMainStreamEncoders()
bool found = false; bool found = false;
for (auto i = 0; i < MAX_OUTPUT_VIDEO_ENCODERS; i++) { for (auto i = 0; i < MAX_OUTPUT_VIDEO_ENCODERS; i++) {
auto encoder = obs_output_get_video_encoder2(output, i); auto encoder = obs_output_get_video_encoder2(output, i);
QString settingName = QString::fromUtf8("video_encoder_description") + QString::number(i);
if (encoder) { if (encoder) {
found = true; found = true;
mainEncoderDescriptions[i] = QString::number(obs_encoder_get_width(encoder)) + "x" + auto mainEncoderDescription = QString::number(obs_encoder_get_width(encoder)) + "x" +
QString::number(obs_encoder_get_height(encoder)); QString::number(obs_encoder_get_height(encoder));
auto divisor = obs_encoder_get_frame_rate_divisor(encoder); auto divisor = obs_encoder_get_frame_rate_divisor(encoder);
if (divisor > 0) if (divisor > 0)
mainEncoderDescriptions[i] += mainEncoderDescription +=
QString::fromUtf8(" ") + QString::number(fps / divisor, 'g', 4) + QString::fromUtf8("fps"); QString::fromUtf8(" ") + QString::number(fps / divisor, 'g', 4) + QString::fromUtf8("fps");
auto settings = obs_encoder_get_settings(encoder); auto settings = obs_encoder_get_settings(encoder);
auto bitrate = settings ? obs_data_get_int(settings, "bitrate") : 0; auto bitrate = settings ? obs_data_get_int(settings, "bitrate") : 0;
if (bitrate > 0) if (bitrate > 0)
mainEncoderDescriptions[i] += mainEncoderDescription +=
QString::fromUtf8(" ") + QString::number(bitrate) + QString::fromUtf8("Kbps"); QString::fromUtf8(" ") + QString::number(bitrate) + QString::fromUtf8("Kbps");
obs_data_release(settings); obs_data_release(settings);
} else if (found && !mainEncoderDescriptions[i].isEmpty()) { obs_data_set_string(current_config, settingName.toUtf8().constData(),
mainEncoderDescriptions[i] = ""; mainEncoderDescription.toUtf8().constData());
} else if (found && obs_data_has_user_value(current_config, settingName.toUtf8().constData())) {
obs_data_unset_user_value(current_config, settingName.toUtf8().constData());
} }
} }
obs_output_release(output); obs_output_release(output);

View File

@ -46,7 +46,6 @@ private:
void outputButtonStyle(QPushButton *button); void outputButtonStyle(QPushButton *button);
void storeMainStreamEncoders(); void storeMainStreamEncoders();
QStringList mainEncoderDescriptions = QStringList(MAX_OUTPUT_VIDEO_ENCODERS);
QIcon streamActiveIcon = QIcon(":/aitum/media/streaming.svg"); QIcon streamActiveIcon = QIcon(":/aitum/media/streaming.svg");
QIcon streamInactiveIcon = QIcon(":/aitum/media/stream.svg"); QIcon streamInactiveIcon = QIcon(":/aitum/media/stream.svg");