From 2c74fc36e29aaee2d80d5f2a2ded410eed309a87 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 15 May 2017 00:13:28 -0700 Subject: [PATCH] libobs: Add scene item IDs Adds a method of uniquely identifying scene items, as well as finding those scene items via that unique ID. --- libobs/obs-scene.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- libobs/obs-scene.h | 4 ++++ libobs/obs.h | 5 +++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 28babb3c2..32940215b 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -71,6 +71,8 @@ static void *scene_create(obs_data_t *settings, struct obs_source *source) signal_handler_add_array(obs_source_get_signal_handler(source), obs_scene_signals); + scene->id_counter = 0; + if (pthread_mutexattr_init(&attr) != 0) goto fail; if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) @@ -608,6 +610,9 @@ static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) obs_data_set_default_int(item_data, "align", OBS_ALIGN_TOP | OBS_ALIGN_LEFT); + if (obs_data_has_user_value(item_data, "id")) + item->id = obs_data_get_int(item_data, "id"); + item->rot = (float)obs_data_get_double(item_data, "rot"); item->align = (uint32_t)obs_data_get_int(item_data, "align"); visible = obs_data_get_bool(item_data, "visible"); @@ -659,8 +664,9 @@ static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) update_item_transform(item); } -static void scene_load(void *scene, obs_data_t *settings) +static void scene_load(void *data, obs_data_t *settings) { + struct obs_scene *scene = data; obs_data_array_t *items = obs_data_get_array(settings, "items"); size_t count, i; @@ -676,6 +682,9 @@ static void scene_load(void *scene, obs_data_t *settings) obs_data_release(item_data); } + if (obs_data_has_user_value(settings, "id_counter")) + scene->id_counter = obs_data_get_int(settings, "id_counter"); + obs_data_array_release(items); } @@ -699,6 +708,7 @@ static void scene_save_item(obs_data_array_t *array, obs_data_set_int (item_data, "crop_top", (int)item->crop.top); obs_data_set_int (item_data, "crop_right", (int)item->crop.right); obs_data_set_int (item_data, "crop_bottom", (int)item->crop.bottom); + obs_data_set_int (item_data, "id", item->id); if (item->scale_filter == OBS_SCALE_POINT) scale_filter = "point"; @@ -731,6 +741,8 @@ static void scene_save(void *data, obs_data_t *settings) item = item->next; } + obs_data_set_int(settings, "id_counter", scene->id_counter); + full_unlock(scene); obs_data_set_array(settings, "items", array); @@ -1160,6 +1172,28 @@ obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene, const char *name) return item; } +obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene, int64_t id) +{ + struct obs_scene_item *item; + + if (!scene) + return NULL; + + full_lock(scene); + + item = scene->first_item; + while (item) { + if (item->id == id) + break; + + item = item->next; + } + + full_unlock(scene); + + return item; +} + void obs_scene_enum_items(obs_scene_t *scene, bool (*callback)(obs_scene_t*, obs_sceneitem_t*, void*), void *param) @@ -1307,6 +1341,7 @@ obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source) item = bzalloc(sizeof(struct obs_scene_item)); item->source = source; + item->id = ++scene->id_counter; item->parent = scene; item->ref = 1; item->align = OBS_ALIGN_TOP | OBS_ALIGN_LEFT; @@ -1919,3 +1954,11 @@ void obs_sceneitem_defer_update_end(obs_sceneitem_t *item) if (os_atomic_dec_long(&item->defer_update) == 0) update_item_transform(item); } + +int64_t obs_sceneitem_get_id(const obs_sceneitem_t *item) +{ + if (!obs_ptr_valid(item, "obs_sceneitem_get_id")) + return 0; + + return item->id; +} diff --git a/libobs/obs-scene.h b/libobs/obs-scene.h index 2d9aa991a..d46022123 100644 --- a/libobs/obs-scene.h +++ b/libobs/obs-scene.h @@ -32,6 +32,8 @@ struct obs_scene_item { volatile long ref; volatile bool removed; + int64_t id; + struct obs_scene *parent; struct obs_source *source; volatile long active_refs; @@ -76,6 +78,8 @@ struct obs_scene_item { struct obs_scene { struct obs_source *source; + int64_t id_counter; + pthread_mutex_t video_mutex; pthread_mutex_t audio_mutex; struct obs_scene_item *first_item; diff --git a/libobs/obs.h b/libobs/obs.h index 8c161884a..a629cec3f 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -1218,6 +1218,9 @@ EXPORT obs_scene_t *obs_scene_from_source(const obs_source_t *source); EXPORT obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene, const char *name); +EXPORT obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene, + int64_t id); + /** Enumerates sources within a scene */ EXPORT void obs_scene_enum_items(obs_scene_t *scene, bool (*callback)(obs_scene_t*, obs_sceneitem_t*, void*), @@ -1266,6 +1269,8 @@ EXPORT void obs_sceneitem_set_bounds_alignment(obs_sceneitem_t *item, EXPORT void obs_sceneitem_set_bounds(obs_sceneitem_t *item, const struct vec2 *bounds); +EXPORT int64_t obs_sceneitem_get_id(const obs_sceneitem_t *item); + EXPORT void obs_sceneitem_get_pos(const obs_sceneitem_t *item, struct vec2 *pos); EXPORT float obs_sceneitem_get_rot(const obs_sceneitem_t *item);