Переглянути джерело

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.
Norihiro Kamae 2 роки тому
батько
коміт
fb57eff212
1 змінених файлів з 10 додано та 2 видалено
  1. 10 2
      libobs/obs-output.c

+ 10 - 2
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 =