Browse Source

libobs: Allow group duplication

jp9000 7 years ago
parent
commit
5dfab20a46
2 changed files with 22 additions and 0 deletions
  1. 15 0
      libobs/obs-scene.c
  2. 7 0
      libobs/obs-source.c

+ 15 - 0
libobs/obs-scene.c

@@ -1239,6 +1239,10 @@ obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name,
 	obs_data_apply(new_scene->source->private_settings,
 			scene->source->private_settings);
 
+	/* never duplicate sub-items for groups */
+	if (scene->is_group)
+		make_unique = false;
+
 	for (size_t i = 0; i < items.num; i++) {
 		item = items.array[i];
 		source = make_unique ?
@@ -1292,6 +1296,9 @@ obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name,
 	for (size_t i = 0; i < items.num; i++)
 		obs_sceneitem_release(items.array[i]);
 
+	if (new_scene->is_group)
+		resize_scene(new_scene);
+
 	da_free(items);
 	return new_scene;
 }
@@ -1321,6 +1328,14 @@ obs_scene_t *obs_scene_from_source(const obs_source_t *source)
 	return source->context.data;
 }
 
+obs_scene_t *obs_group_from_source(const obs_source_t *source)
+{
+	if (!source || source->info.id != group_info.id)
+		return NULL;
+
+	return source->context.data;
+}
+
 obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene, const char *name)
 {
 	struct obs_scene_item *item;

+ 7 - 0
libobs/obs-source.c

@@ -439,6 +439,8 @@ void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src)
 	duplicate_filters(dst, src, dst->context.private);
 }
 
+extern obs_scene_t *obs_group_from_source(const obs_source_t *source);
+
 obs_source_t *obs_source_duplicate(obs_source_t *source,
 		const char *new_name, bool create_private)
 {
@@ -455,6 +457,11 @@ obs_source_t *obs_source_duplicate(obs_source_t *source,
 
 	if (source->info.type == OBS_SOURCE_TYPE_SCENE) {
 		obs_scene_t *scene = obs_scene_from_source(source);
+		if (!scene)
+			scene = obs_group_from_source(source);
+		if (!scene)
+			return NULL;
+
 		obs_scene_t *new_scene = obs_scene_duplicate(scene, new_name,
 				create_private ? OBS_SCENE_DUP_PRIVATE_COPY :
 					OBS_SCENE_DUP_COPY);