From fb57eff212fbe5e777cf559288bc70bf67d9c428 Mon Sep 17 00:00:00 2001 From: Norihiro Kamae Date: Fri, 11 Aug 2023 13:05:57 +0900 Subject: [PATCH] libobs: Fix holding possibly released pointer in obs_output_t When `obs_output_t` is an encoded output, `obs_output_set_media` will ignore the video and audio so that `obs_output_t` will keep holding the `video_t` and `audio_t` pointer when the output was created. By this commit, `video` and `audio` member variables in `obs_output_t` will never set if it is an encoded output. In the auto-configuration wizard, `video_t` is released and created to have a different video size while `obs_output_t` is not released. This resulted in accessing the released `video_t` pointer. --- libobs/obs-output.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libobs/obs-output.c b/libobs/obs-output.c index 83558089e..fc49febd8 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -201,8 +201,10 @@ obs_output_t *obs_output_create(const char *id, const char *name, } else { output->info = *info; } - output->video = obs_get_video(); - output->audio = obs_get_audio(); + if (!flag_encoded(output)) { + output->video = obs_get_video(); + output->audio = obs_get_audio(); + } if (output->info.get_defaults) output->info.get_defaults(output->context.settings); @@ -331,6 +333,8 @@ bool obs_output_actual_start(obs_output_t *output) if (success && output->video) { output->starting_frame_count = video_output_get_total_frames(output->video); + } + if (success) { output->starting_drawn_count = obs->video.total_frames; output->starting_lagged_count = obs->video.lagged_frames; } @@ -1331,6 +1335,10 @@ static inline bool has_scaling(const struct obs_output *output) const struct video_scale_info * obs_output_get_video_conversion(struct obs_output *output) { + if (log_flag_encoded(output, __FUNCTION__, true) || + !log_flag_video(output, __FUNCTION__)) + return NULL; + if (output->video_conversion_set) { if (!output->video_conversion.width) output->video_conversion.width =