(API Change) Fix "apply service settings" functions
API changed from: ------------------------ EXPORT void obs_service_apply_encoder_settings(obs_service_t *service, obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder); void obs_service_info::apply_encoder_settings(void *data obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder); To: ------------------------ EXPORT void obs_service_apply_encoder_settings(obs_service_t *service, obs_data_t *video_encoder_settings, obs_data_t *audio_encoder_settings); void obs_service_info::apply_encoder_settings(void *data obs_data_t *video_encoder_settings, obs_data_t *audio_encoder_settings); These changes make it so that instead of an encoder potentially being updated more than once with different settings, that these functions will be called for the specific settings being used, and the settings will be updated according to what's required by the service. This fixes that design flaw and ensures that there's no case where obs_encoder_update is called where the settings might not have service-specific settings applied.
This commit is contained in:
@@ -225,11 +225,9 @@ static obs_properties_t *rtmp_common_properties(void *unused)
|
||||
return ppts;
|
||||
}
|
||||
|
||||
static void apply_video_encoder_settings(obs_encoder_t *encoder,
|
||||
static void apply_video_encoder_settings(obs_data_t *settings,
|
||||
json_t *recommended)
|
||||
{
|
||||
obs_data_t *settings = obs_encoder_get_settings(encoder);
|
||||
|
||||
json_t *item = json_object_get(recommended, "keyint");
|
||||
if (item && json_is_integer(item)) {
|
||||
int keyint = (int)json_integer_value(item);
|
||||
@@ -256,29 +254,21 @@ static void apply_video_encoder_settings(obs_encoder_t *encoder,
|
||||
obs_data_set_int(settings, "buffer_size", max_bitrate);
|
||||
}
|
||||
}
|
||||
|
||||
obs_encoder_update(encoder, settings);
|
||||
obs_data_release(settings);
|
||||
}
|
||||
|
||||
static void apply_audio_encoder_settings(obs_encoder_t *encoder,
|
||||
static void apply_audio_encoder_settings(obs_data_t *settings,
|
||||
json_t *recommended)
|
||||
{
|
||||
obs_data_t *settings = obs_encoder_get_settings(encoder);
|
||||
|
||||
json_t *item = json_object_get(recommended, "max audio bitrate");
|
||||
if (item && json_is_integer(item)) {
|
||||
int max_bitrate = (int)json_integer_value(item);
|
||||
if (obs_data_get_int(settings, "bitrate") > max_bitrate)
|
||||
obs_data_set_int(settings, "bitrate", max_bitrate);
|
||||
}
|
||||
|
||||
obs_encoder_update(encoder, settings);
|
||||
obs_data_release(settings);
|
||||
}
|
||||
|
||||
static void initialize_output(struct rtmp_common *service, json_t *root,
|
||||
obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
|
||||
obs_data_t *video_settings, obs_data_t *audio_settings)
|
||||
{
|
||||
json_t *json_service = find_service(root, service->service);
|
||||
json_t *recommended;
|
||||
@@ -294,14 +284,14 @@ static void initialize_output(struct rtmp_common *service, json_t *root,
|
||||
if (!recommended)
|
||||
return;
|
||||
|
||||
if (video_encoder)
|
||||
apply_video_encoder_settings(video_encoder, recommended);
|
||||
if (audio_encoder)
|
||||
apply_audio_encoder_settings(audio_encoder, recommended);
|
||||
if (video_settings)
|
||||
apply_video_encoder_settings(video_settings, recommended);
|
||||
if (audio_settings)
|
||||
apply_audio_encoder_settings(audio_settings, recommended);
|
||||
}
|
||||
|
||||
static void rtmp_common_apply_settings(void *data,
|
||||
obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
|
||||
obs_data_t *video_settings, obs_data_t *audio_settings)
|
||||
{
|
||||
struct rtmp_common *service = data;
|
||||
char *file;
|
||||
@@ -310,8 +300,8 @@ static void rtmp_common_apply_settings(void *data,
|
||||
if (file) {
|
||||
json_t *root = open_json_file(file);
|
||||
if (root) {
|
||||
initialize_output(service, root, video_encoder,
|
||||
audio_encoder);
|
||||
initialize_output(service, root, video_settings,
|
||||
audio_settings);
|
||||
json_decref(root);
|
||||
}
|
||||
bfree(file);
|
||||
|
Reference in New Issue
Block a user