OBS源
+ -

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)

0 篇笔记 写笔记

OBS源类型注册函数obs_register_source
OBS中,各个源是通过同一个结构体obs_source_info实现的。struct obs_core { ... DARRAY(struct obs_source_info) source_types; //input_types+filter_types+transition_......
scene注册obs_register_source
obs_init函数中最后一项功能是注册一个输入源:scene类型。这样用户就可以在OBS界面中创建场景了。static bool obs_init(void){ obs = bzalloc(sizeof(struct obs_core)); if (!obs_init_dat......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!