libobs: Consolidate scene item remove code

Removes the internal helper `remove_without_release()` and branches
`obs_sceneitem_remove()` into public and internal versions.

The `obs_sceneitem_set_transition()` calls were missing from the
`remove_without_release()` function, so this resolves that issue
implicitly. Code cleanup mentioned above is done to hopefully avoid
these mistakes again.
This commit is contained in:
tt2468 2023-11-13 23:14:20 -08:00 committed by Lain
parent 972e24df79
commit 76f332a379

View file

@ -202,16 +202,7 @@ static inline void full_unlock(struct obs_scene *scene)
video_unlock(scene);
}
static void set_visibility(struct obs_scene_item *item, bool vis);
static inline void detach_sceneitem(struct obs_scene_item *item);
static inline void remove_without_release(struct obs_scene_item *item)
{
item->removed = true;
set_visibility(item, false);
signal_item_remove(item);
detach_sceneitem(item);
}
static void obs_sceneitem_remove_internal(obs_sceneitem_t *item);
static void remove_all_items(struct obs_scene *scene)
{
@ -228,7 +219,7 @@ static void remove_all_items(struct obs_scene *scene)
struct obs_scene_item *del_item = item;
item = item->next;
remove_without_release(del_item);
obs_sceneitem_remove_internal(del_item);
da_push_back(items, &del_item);
}
@ -873,7 +864,7 @@ update_transforms_and_prune_sources(obs_scene_t *scene,
struct obs_scene_item *del_item = item;
item = item->next;
remove_without_release(del_item);
obs_sceneitem_remove_internal(del_item);
da_push_back(*remove_items, &del_item);
rebuild_group = true;
continue;
@ -2254,6 +2245,19 @@ void obs_sceneitem_release(obs_sceneitem_t *item)
obs_sceneitem_destroy(item);
}
static void obs_sceneitem_remove_internal(obs_sceneitem_t *item)
{
item->removed = true;
set_visibility(item, false);
signal_item_remove(item);
detach_sceneitem(item);
obs_sceneitem_set_transition(item, true, NULL);
obs_sceneitem_set_transition(item, false, NULL);
}
void obs_sceneitem_remove(obs_sceneitem_t *item)
{
obs_scene_t *scene;
@ -2263,23 +2267,13 @@ void obs_sceneitem_remove(obs_sceneitem_t *item)
scene = item->parent;
full_lock(scene);
item->removed = true;
assert(scene != NULL);
assert(scene->source != NULL);
set_visibility(item, false);
signal_item_remove(item);
detach_sceneitem(item);
full_lock(scene);
obs_sceneitem_remove_internal(item);
full_unlock(scene);
obs_sceneitem_set_transition(item, true, NULL);
obs_sceneitem_set_transition(item, false, NULL);
obs_sceneitem_release(item);
}