From 8d7264281b010c6cc76dce1b6091b7518b07f015 Mon Sep 17 00:00:00 2001 From: mhoyer-streamlabs Date: Thu, 15 Jan 2026 13:00:06 -0600 Subject: [PATCH 1/2] Add function to check if configured encoder is valid for service(s) --- obs-studio-client/source/nodeobs_settings.cpp | 16 ++++++ obs-studio-client/source/nodeobs_settings.hpp | 2 + obs-studio-server/source/nodeobs_settings.cpp | 57 +++++++++++++++++++ obs-studio-server/source/nodeobs_settings.h | 2 + 4 files changed, 77 insertions(+) diff --git a/obs-studio-client/source/nodeobs_settings.cpp b/obs-studio-client/source/nodeobs_settings.cpp index e595f37ef..3c2d4534d 100644 --- a/obs-studio-client/source/nodeobs_settings.cpp +++ b/obs-studio-client/source/nodeobs_settings.cpp @@ -406,6 +406,21 @@ void settings::OBS_settings_saveSettings(const Napi::CallbackInfo &info) return; } +Napi::Value settings::OBS_settings_isValidEncoder(const Napi::CallbackInfo &info) +{ + std::string category = info[0].ToString().Utf8Value(); + auto conn = GetConnection(info); + if (!conn) + return info.Env().Undefined(); + + std::vector response = conn->call_synchronous_helper("Settings", "OBS_settings_isValidEncoder", {ipc::value(category)}); + + if (!ValidateResponse(info, response)) + return info.Env().Undefined(); + + return Napi::Boolean::New(info.Env(), response[1].value_union.ui32); +} + std::vector settings::getListCategories(void) { std::vector categories; @@ -525,6 +540,7 @@ void settings::Init(Napi::Env env, Napi::Object exports) { exports.Set(Napi::String::New(env, "OBS_settings_getSettings"), Napi::Function::New(env, settings::OBS_settings_getSettings)); exports.Set(Napi::String::New(env, "OBS_settings_saveSettings"), Napi::Function::New(env, settings::OBS_settings_saveSettings)); + exports.Set(Napi::String::New(env, "OBS_settings_isValidEncoder"), Napi::Function::New(env, settings::OBS_settings_isValidEncoder)); exports.Set(Napi::String::New(env, "OBS_settings_getListCategories"), Napi::Function::New(env, settings::OBS_settings_getListCategories)); exports.Set(Napi::String::New(env, "OBS_settings_getInputAudioDevices"), Napi::Function::New(env, settings::OBS_settings_getInputAudioDevices)); exports.Set(Napi::String::New(env, "OBS_settings_getOutputAudioDevices"), Napi::Function::New(env, settings::OBS_settings_getOutputAudioDevices)); diff --git a/obs-studio-client/source/nodeobs_settings.hpp b/obs-studio-client/source/nodeobs_settings.hpp index bc0215029..174e580a8 100644 --- a/obs-studio-client/source/nodeobs_settings.hpp +++ b/obs-studio-client/source/nodeobs_settings.hpp @@ -133,6 +133,8 @@ void Init(Napi::Env env, Napi::Object exports); Napi::Value OBS_settings_getSettings(const Napi::CallbackInfo &info); void OBS_settings_saveSettings(const Napi::CallbackInfo &info); +Napi::Value OBS_settings_isValidEncoder(const Napi::CallbackInfo &info); + Napi::Value OBS_settings_getListCategories(const Napi::CallbackInfo &info); Napi::Value OBS_settings_getInputAudioDevices(const Napi::CallbackInfo &info); diff --git a/obs-studio-server/source/nodeobs_settings.cpp b/obs-studio-server/source/nodeobs_settings.cpp index 4d4051784..5eb3db653 100644 --- a/obs-studio-server/source/nodeobs_settings.cpp +++ b/obs-studio-server/source/nodeobs_settings.cpp @@ -72,6 +72,8 @@ void OBS_settings::Register(ipc::server &srv) cls->register_function(std::make_shared( "OBS_settings_saveSettings", std::vector{ipc::type::String, ipc::type::UInt32, ipc::type::UInt32, ipc::type::Binary}, OBS_settings_saveSettings)); + cls->register_function( + std::make_shared("OBS_settings_isValidEncoder", std::vector{}, OBS_settings_isValidEncoder)); cls->register_function( std::make_shared("OBS_settings_getInputAudioDevices", std::vector{}, OBS_settings_getInputAudioDevices)); cls->register_function( @@ -1196,6 +1198,61 @@ static void converOldJimNvencEncoder(config_t *config, const std::string &config } } +static bool validateEncoderForService(StreamServiceId serviceId, const char *encoderToFind) +{ + bool validEncoder = false; + + //have encoder - find in encoders_set, validate 'streaming' flag and check availability based on 'check_availability_streaming' flag + for (int i = 0; i < encoders_set.size(); i++) { + if (std::string(encoderToFind) == encoders_set[i].simple_name || std::string(encoderToFind) == encoders_set[i].advanced_name) { + if (encoders_set[i].streaming) { + if (encoders_set[i].check_availability_streaming) { + if (isEncoderAvailableForStreaming(encoderToFind, OBS_service::getService(serviceId))) { + validEncoder = true; + break; + } + } else { + validEncoder = true; + } + } + break; + } + } + + return validEncoder; +} + +void OBS_settings::OBS_settings_isValidEncoder(void *data, const int64_t id, const std::vector &args, std::vector &rval) +{ + const char *mode = NULL; + const char *curEncoder = NULL; + bool validEncoder = false; + std::string serviceToCheck = args[0].value_str; + + //get mode and configured encoder + mode = config_get_string(ConfigManager::getInstance().getBasic(), "Output", "Mode"); + if (mode == NULL) { + mode = "Simple"; + } + if (strcmp(mode, "Advanced") == 0) { + curEncoder = config_get_string(ConfigManager::getInstance().getBasic(), "AdvOut", "Encoder"); + } else { + curEncoder = config_get_string(ConfigManager::getInstance().getBasic(), "SimpleOutput", "StreamingEncoder"); + } + + if (serviceToCheck == "Both") { + validEncoder = validateEncoderForService(StreamServiceId::Main, curEncoder) && validateEncoderForService(StreamServiceId::Second, curEncoder); + } else if (serviceToCheck == "Stream") { + validEncoder = validateEncoderForService(StreamServiceId::Main, curEncoder); + } else if (serviceToCheck == "StreamSecond") { + validEncoder = validateEncoderForService(StreamServiceId::Second, curEncoder); + } + + rval.push_back(ipc::value((uint64_t)ErrorCode::Ok)); + rval.push_back(ipc::value(validEncoder)); +} + + void OBS_settings::getSimpleOutputSettings(std::vector *outputSettings, config_t *config, bool isCategoryEnabled) { converOldJimNvencEncoder(config, "SimpleOutput", "StreamEncoder", "RecEncoder"); diff --git a/obs-studio-server/source/nodeobs_settings.h b/obs-studio-server/source/nodeobs_settings.h index 67be76316..70a8ea6f7 100644 --- a/obs-studio-server/source/nodeobs_settings.h +++ b/obs-studio-server/source/nodeobs_settings.h @@ -149,6 +149,8 @@ class OBS_settings { static void OBS_settings_getSettings(void *data, const int64_t id, const std::vector &args, std::vector &rval); static void OBS_settings_saveSettings(void *data, const int64_t id, const std::vector &args, std::vector &rval); + static void OBS_settings_isValidEncoder(void *data, const int64_t id, const std::vector &args, std::vector &rval); + static void saveGenericSettings(std::vector genericSettings, std::string section, config_t *config); static void OBS_settings_getInputAudioDevices(void *data, const int64_t id, const std::vector &args, std::vector &rval); From 36f79982cb4f1ba81496a2920232e9e5bebdb579 Mon Sep 17 00:00:00 2001 From: mhoyer-streamlabs Date: Fri, 16 Jan 2026 05:40:36 -0600 Subject: [PATCH 2/2] Formatting --- obs-studio-server/source/nodeobs_settings.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/obs-studio-server/source/nodeobs_settings.cpp b/obs-studio-server/source/nodeobs_settings.cpp index 5eb3db653..de3acd9d6 100644 --- a/obs-studio-server/source/nodeobs_settings.cpp +++ b/obs-studio-server/source/nodeobs_settings.cpp @@ -72,8 +72,7 @@ void OBS_settings::Register(ipc::server &srv) cls->register_function(std::make_shared( "OBS_settings_saveSettings", std::vector{ipc::type::String, ipc::type::UInt32, ipc::type::UInt32, ipc::type::Binary}, OBS_settings_saveSettings)); - cls->register_function( - std::make_shared("OBS_settings_isValidEncoder", std::vector{}, OBS_settings_isValidEncoder)); + cls->register_function(std::make_shared("OBS_settings_isValidEncoder", std::vector{}, OBS_settings_isValidEncoder)); cls->register_function( std::make_shared("OBS_settings_getInputAudioDevices", std::vector{}, OBS_settings_getInputAudioDevices)); cls->register_function( @@ -1252,7 +1251,6 @@ void OBS_settings::OBS_settings_isValidEncoder(void *data, const int64_t id, con rval.push_back(ipc::value(validEncoder)); } - void OBS_settings::getSimpleOutputSettings(std::vector *outputSettings, config_t *config, bool isCategoryEnabled) { converOldJimNvencEncoder(config, "SimpleOutput", "StreamEncoder", "RecEncoder");