libobs: Properly fix canvas video reset/restore

This commit is contained in:
Dennis Sädtler
2026-05-08 16:28:19 -04:00
committed by Ryan Foster
parent 8fb81caf0a
commit 1ecea56817
3 changed files with 13 additions and 5 deletions
+8 -3
View File
@@ -294,13 +294,18 @@ void obs_free_canvas_mixes(void)
pthread_mutex_unlock(&obs->data.canvases_mutex);
}
bool obs_canvas_has_valid_video_info(obs_canvas_t *canvas)
{
struct obs_video_info *ovi = &canvas->ovi;
return ovi->base_width && ovi->base_height && ovi->output_width && ovi->output_height &&
ovi->output_format != VIDEO_FORMAT_NONE;
}
bool obs_canvas_reset_video_internal(obs_canvas_t *canvas, struct obs_video_info *ovi)
{
obs_canvas_clear_mix(canvas);
if (ovi)
canvas->ovi = *ovi;
canvas->mix = obs_create_video_mix(&canvas->ovi);
if (canvas->mix) {
canvas->mix->view = &canvas->view;
@@ -398,7 +403,7 @@ void obs_canvas_rename_source(obs_source_t *source, const char *name)
bool obs_canvas_reset_video(obs_canvas_t *canvas, struct obs_video_info *ovi)
{
if (canvas->flags & MAIN || obs_video_active())
if (!ovi || canvas->flags & MAIN || obs_video_active())
return false;
return obs_canvas_reset_video_internal(canvas, ovi);
+1
View File
@@ -740,6 +740,7 @@ extern obs_canvas_t *obs_create_main_canvas(void);
extern void obs_canvas_destroy(obs_canvas_t *canvas);
extern void obs_canvas_clear_mix(obs_canvas_t *canvas);
extern void obs_free_canvas_mixes(void);
extern bool obs_canvas_has_valid_video_info(obs_canvas_t *canvas);
extern bool obs_canvas_reset_video_internal(obs_canvas_t *canvas, struct obs_video_info *ovi);
extern void obs_canvas_insert_source(obs_canvas_t *canvas, obs_source_t *source);
extern void obs_canvas_remove_source(obs_source_t *source);
+3 -1
View File
@@ -675,8 +675,10 @@ static bool restore_canvases(void)
obs_canvas_t *canvas = (obs_canvas_t *)ctx;
if (canvas->flags & MAIN)
continue;
if (!obs_canvas_has_valid_video_info(canvas))
continue;
if (!obs_canvas_reset_video_internal(canvas, NULL)) {
if (!obs_canvas_reset_video_internal(canvas, &canvas->ovi)) {
blog(LOG_ERROR, "Failed restoring video mix for canvas '%s'", canvas->context.name);
success = false;
}