Преглед на файлове

libobs: Force sceneitem transform update if scene dimensions change

derrod преди 1 година
родител
ревизия
a50320464a
променени са 2 файла, в които са добавени 26 реда и са изтрити 8 реда
  1. 23 8
      libobs/obs-scene.c
  2. 3 0
      libobs/obs-scene.h

+ 23 - 8
libobs/obs-scene.c

@@ -925,10 +925,9 @@ static void scene_video_tick(void *data, float seconds)
 }
 
 /* assumes video lock */
-static void
-update_transforms_and_prune_sources(obs_scene_t *scene,
-				    obs_scene_item_ptr_array_t *remove_items,
-				    obs_sceneitem_t *group_sceneitem)
+static void update_transforms_and_prune_sources(
+	obs_scene_t *scene, obs_scene_item_ptr_array_t *remove_items,
+	obs_sceneitem_t *group_sceneitem, bool scene_size_changed)
 {
 	struct obs_scene_item *item = scene->first_item;
 	bool rebuild_group =
@@ -951,12 +950,13 @@ update_transforms_and_prune_sources(obs_scene_t *scene,
 
 			video_lock(group_scene);
 			update_transforms_and_prune_sources(group_scene,
-							    remove_items, item);
+							    remove_items, item,
+							    scene_size_changed);
 			video_unlock(group_scene);
 		}
 
 		if (os_atomic_load_bool(&item->update_transform) ||
-		    source_size_changed(item)) {
+		    source_size_changed(item) || scene_size_changed) {
 
 			update_item_transform(item, true);
 			rebuild_group = true;
@@ -969,6 +969,19 @@ update_transforms_and_prune_sources(obs_scene_t *scene,
 		resize_group(group_sceneitem);
 }
 
+static inline bool scene_size_changed(obs_scene_t *scene)
+{
+	uint32_t width = scene_getwidth(scene);
+	uint32_t height = scene_getheight(scene);
+
+	if (width == scene->last_width && height == scene->last_height)
+		return false;
+
+	scene->last_width = width;
+	scene->last_height = height;
+	return true;
+}
+
 static void scene_video_render(void *data, gs_effect_t *effect)
 {
 	obs_scene_item_ptr_array_t remove_items;
@@ -980,7 +993,9 @@ static void scene_video_render(void *data, gs_effect_t *effect)
 	video_lock(scene);
 
 	if (!scene->is_group) {
-		update_transforms_and_prune_sources(scene, &remove_items, NULL);
+		bool size_changed = scene_size_changed(scene);
+		update_transforms_and_prune_sources(scene, &remove_items, NULL,
+						    size_changed);
 	}
 
 	gs_blend_state_push();
@@ -4238,7 +4253,7 @@ void obs_scene_prune_sources(obs_scene_t *scene)
 	da_init(remove_items);
 
 	video_lock(scene);
-	update_transforms_and_prune_sources(scene, &remove_items, NULL);
+	update_transforms_and_prune_sources(scene, &remove_items, NULL, false);
 	video_unlock(scene);
 
 	for (size_t i = 0; i < remove_items.num; i++)

+ 3 - 0
libobs/obs-scene.h

@@ -110,6 +110,9 @@ struct obs_scene {
 	uint32_t cx;
 	uint32_t cy;
 
+	uint32_t last_width;
+	uint32_t last_height;
+
 	int64_t id_counter;
 
 	pthread_mutex_t video_mutex;