OBS源类型注册函数obs_register_source
2024-03-21
130
0
OBS中,各个源是通过同一个结构体obs_source_info实现的。
struct obs_core {
...
DARRAY(struct obs_source_info) source_types; //input_types+filter_types+transition_types+sence
DARRAY(struct obs_source_info) input_types; //OBS_SOURCE_TYPE_INPUT
DARRAY(struct obs_source_info) filter_types;//OBS_SOURCE_TYPE_FILTER
DARRAY(struct obs_source_info) transition_types;//OBS_SOURCE_TYPE_TRANSITION
DARRAY(struct obs_output_info) output_types;
DARRAY(struct obs_encoder_info) encoder_types;
DARRAY(struct obs_service_info) service_types;
DARRAY(struct obs_modal_ui) modal_ui_callbacks; //模式对话框
DARRAY(struct obs_modeless_ui) modeless_ui_callbacks;//非模式对话框
}
分们的注册函数分别为:
| 类型 | 注册函数 |
|---|---|
| source_types | 是input+filter+transsition+scene(OBS_SOURCE_TYPE_SCENE) |
| input_types | obs_register_source(OBS_SOURCE_TYPE_INPUT) |
| filter_types | obs_register_source(OBS_SOURCE_TYPE_FILTER) |
| transition_types | obs_register_source(OBS_SOURCE_TYPE_TRANSITION) |
| output_types | obs_register_output |
| encoder_types | obs_register_encoder |
| obs_register_service_s | obs_register_service_s |
obs_core
OBS源使用obs_source_info结构体标识,并根据类型存储于以下数组中。
struct obs_core {
...
DARRAY(struct obs_source_info) source_types;
DARRAY(struct obs_source_info) input_types;
DARRAY(struct obs_source_info) filter_types;
DARRAY(struct obs_source_info) transition_types;
DARRAY(struct obs_output_info) output_types;
DARRAY(struct obs_encoder_info) encoder_types;
DARRAY(struct obs_service_info) service_types;
...
}
这些源的注册,都是通过各个模块DLL或者OBS内部代码通过调用对应的注册函数注册的。
obs_register_source
通过obs_register_source注册的源包括scene,input,transition,filter.该函数通过obs_source_info结构体提供源相关的属性信息和回调函数。
#define obs_register_source(info) \
obs_register_source_s(info, sizeof(struct obs_source_info))
代码实现:
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;
}
其它注册函数
包括obs_register_encoder_s、obs_register_output_s和obs_register_service_s,这些函数本质是使用REGISTER_OBS_DEF实现的。
REGISTER_OBS_DEF(size, obs_encoder_info, obs->encoder_types, info);
REGISTER_OBS_DEF(size, obs_output_info, obs->output_types, info);
REGISTER_OBS_DEF(size, obs_service_info, obs->service_types, info);
REGISTER_OBS_DEF(size, obs_modal_ui, obs->modal_ui_callbacks, info);
REGISTER_OBS_DEF(size, obs_modeless_ui, obs->modeless_ui_callbacks,info);
#define REGISTER_OBS_DEF(size_var, structure, dest, info) \
do { \
struct structure data = {0}; \
memcpy(&data, info, size_var); \
da_push_back(dest, &data); \
} while (false)
OBS源





