OBS源的注册obs_register_source
2024-03-21
8
0
OBS的插件模块通过obs_register_source函数注册“源”。该函数通过obs_source_info结构体提供源相关的属性信息和回调函数。
#define obs_register_source(info) \
obs_register_source_s(info, sizeof(struct obs_source_info))
根据源码分析,OBSCore提供了4种类型的“源”,这4种类型的源分别存储于不同的obs_source_info_array_t中。
enum obs_source_type {
OBS_SOURCE_TYPE_INPUT,
OBS_SOURCE_TYPE_FILTER,
OBS_SOURCE_TYPE_TRANSITION,
OBS_SOURCE_TYPE_SCENE,
};
这四种类型分别对应于struct obs_core 中的:
struct obs_core {
...
obs_source_info_array_t source_types; //每种类型都存储
obs_source_info_array_t input_types; //只存储OBS_SOURCE_TYPE_INPUT
obs_source_info_array_t filter_types;//只存储OBS_SOURCE_TYPE_FILTER
obs_source_info_array_t transition_types;/只存储OBS_SOURCE_TYPE_TRANSITION
...
}
相关的代码如下:
void obs_register_source_s(const struct obs_source_info *info, size_t size){
struct obs_source_info data = {0};
obs_source_info_array_t *array = NULL;
if (info->type == OBS_SOURCE_TYPE_INPUT) {
array = &obs->input_types;
} else if (info->type == OBS_SOURCE_TYPE_FILTER) {
array = &obs->filter_types;
} else if (info->type == OBS_SOURCE_TYPE_TRANSITION) {
array = &obs->transition_types;
} else if (info->type != OBS_SOURCE_TYPE_SCENE) {
source_warn("Tried to register unknown source type: %u",info->type);
goto error;
}
...
if (array)
da_push_back(*array, &data);
da_push_back(obs->source_types, &data);
return;
对于每一个源,其id和version作为惟的标识,通过get_source_info2定位是否已经存在
//判断该id的类型是否已经存在了
if (get_source_info2(info->id, info->version)) {
source_warn("Source '%s' already exists! "
"Duplicate library?",
info->id);
goto error;
}
其判断存在的方法也比较简单,就是在所有中查找比较:
struct obs_source_info *get_source_info2(const char *unversioned_id,
uint32_t ver){
for (size_t i = 0; i < obs->source_types.num; i++)
{
struct obs_source_info *info = &obs->source_types.array[i];
if (strcmp(info->unversioned_id, unversioned_id) == 0
&& info->version == ver)
return info;
}
return NULL;
}