Browse Source

libobs: Add transition save/load functions

Moves the transition saving/loading to functions, and refactors existing
code to use those functions instead.
Exeldro 4 years ago
parent
commit
b9a2fe7851
2 changed files with 56 additions and 52 deletions
  1. 52 52
      libobs/obs-scene.c
  2. 4 0
      libobs/obs.h

+ 52 - 52
libobs/obs-scene.c

@@ -854,35 +854,13 @@ static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data)
 
 	obs_data_t *show_data = obs_data_get_obj(item_data, "show_transition");
 	if (show_data) {
-		const char *id = obs_data_get_string(show_data, "id");
-		if (id && strlen(id)) {
-			const char *tn = obs_data_get_string(show_data, "name");
-			obs_data_t *s =
-				obs_data_get_obj(show_data, "transition");
-			obs_source_t *t = obs_source_create_private(id, tn, s);
-			obs_sceneitem_set_show_transition(item, t);
-			obs_source_release(t);
-			obs_data_release(s);
-		}
-		item->show_transition_duration =
-			(uint32_t)obs_data_get_int(show_data, "duration");
+		obs_sceneitem_transition_load(item, show_data, true);
 		obs_data_release(show_data);
 	}
 
 	obs_data_t *hide_data = obs_data_get_obj(item_data, "hide_transition");
 	if (hide_data) {
-		const char *id = obs_data_get_string(hide_data, "id");
-		if (id && strlen(id)) {
-			const char *tn = obs_data_get_string(hide_data, "name");
-			obs_data_t *s =
-				obs_data_get_obj(hide_data, "transition");
-			obs_source_t *t = obs_source_create_private(id, tn, s);
-			obs_sceneitem_set_hide_transition(item, t);
-			obs_source_release(t);
-			obs_data_release(s);
-		}
-		item->hide_transition_duration =
-			(uint32_t)obs_data_get_int(hide_data, "duration");
+		obs_sceneitem_transition_load(item, hide_data, false);
 		obs_data_release(hide_data);
 	}
 
@@ -1001,37 +979,11 @@ static void scene_save_item(obs_data_array_t *array,
 
 	obs_data_set_string(item_data, "scale_filter", scale_filter);
 
-	obs_data_t *show_data = obs_data_create();
-	if (item->show_transition) {
-		obs_data_set_string(
-			show_data, "id",
-			obs_source_get_unversioned_id(item->show_transition));
-		obs_data_set_string(show_data, "versioned_id",
-				    obs_source_get_id(item->show_transition));
-		obs_data_set_string(show_data, "name",
-				    obs_source_get_name(item->show_transition));
-		obs_data_t *s = obs_source_get_settings(item->show_transition);
-		obs_data_set_obj(show_data, "transition", s);
-		obs_data_release(s);
-	}
-	obs_data_set_int(show_data, "duration", item->show_transition_duration);
+	obs_data_t *show_data = obs_sceneitem_transition_save(item, true);
 	obs_data_set_obj(item_data, "show_transition", show_data);
 	obs_data_release(show_data);
 
-	obs_data_t *hide_data = obs_data_create();
-	if (item->hide_transition) {
-		obs_data_set_string(
-			hide_data, "id",
-			obs_source_get_unversioned_id(item->hide_transition));
-		obs_data_set_string(hide_data, "versioned_id",
-				    obs_source_get_id(item->hide_transition));
-		obs_data_set_string(hide_data, "name",
-				    obs_source_get_name(item->hide_transition));
-		obs_data_t *s = obs_source_get_settings(item->hide_transition);
-		obs_data_set_obj(hide_data, "transition", s);
-		obs_data_release(s);
-	}
-	obs_data_set_int(hide_data, "duration", item->hide_transition_duration);
+	obs_data_t *hide_data = obs_sceneitem_transition_save(item, false);
 	obs_data_set_obj(item_data, "hide_transition", hide_data);
 	obs_data_release(hide_data);
 
@@ -3579,3 +3531,51 @@ void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible)
 				     duration, item->source);
 	}
 }
+
+void obs_sceneitem_transition_load(struct obs_scene_item *item,
+				   obs_data_t *data, bool show)
+{
+	if (!item || !data)
+		return;
+	const char *id = obs_data_get_string(data, "id");
+	if (id && strlen(id)) {
+		const char *tn = obs_data_get_string(data, "name");
+		obs_data_t *s = obs_data_get_obj(data, "transition");
+		obs_source_t *t = obs_source_create_private(id, tn, s);
+		if (show)
+			obs_sceneitem_set_show_transition(item, t);
+		else
+			obs_sceneitem_set_hide_transition(item, t);
+		obs_source_release(t);
+		obs_data_release(s);
+	}
+	if (show)
+		item->show_transition_duration =
+			(uint32_t)obs_data_get_int(data, "duration");
+	else
+		item->hide_transition_duration =
+			(uint32_t)obs_data_get_int(data, "duration");
+}
+
+obs_data_t *obs_sceneitem_transition_save(struct obs_scene_item *item,
+					  bool show)
+{
+	obs_data_t *data = obs_data_create();
+	struct obs_source *transition = show ? item->show_transition
+					     : item->hide_transition;
+	if (transition) {
+		obs_data_set_string(data, "id",
+				    obs_source_get_unversioned_id(transition));
+		obs_data_set_string(data, "versioned_id",
+				    obs_source_get_id(transition));
+		obs_data_set_string(data, "name",
+				    obs_source_get_name(transition));
+		obs_data_t *s = obs_source_get_settings(transition);
+		obs_data_set_obj(data, "transition", s);
+		obs_data_release(s);
+	}
+	obs_data_set_int(data, "duration",
+			 show ? item->show_transition_duration
+			      : item->hide_transition_duration);
+	return data;
+}

+ 4 - 0
libobs/obs.h

@@ -1780,6 +1780,10 @@ EXPORT obs_source_t *obs_sceneitem_get_hide_transition(obs_sceneitem_t *item);
 EXPORT uint32_t
 obs_sceneitem_get_hide_transition_duration(obs_sceneitem_t *item);
 EXPORT void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible);
+EXPORT void obs_sceneitem_transition_load(struct obs_scene_item *item,
+					  obs_data_t *data, bool show);
+EXPORT obs_data_t *obs_sceneitem_transition_save(struct obs_scene_item *item,
+						 bool show);
 
 /* ------------------------------------------------------------------------- */
 /* Outputs */