libobs: Add scene item IDs

Adds a method of uniquely identifying scene items, as well as finding
those scene items via that unique ID.
This commit is contained in:
jp9000 2017-05-15 00:13:28 -07:00
parent b2e376b022
commit 2c74fc36e2
3 changed files with 53 additions and 1 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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);