mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 04:42:18 +02:00
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:
parent
b2e376b022
commit
2c74fc36e2
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user