OBS
+ -

OBS源的注册obs_register_source

2024-03-21 5 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;
}

0 篇笔记 写笔记

OBS源的注册obs_register_source
OBS的插件模块通过obs_register_source函数注册“源”。该函数通过obs_source_info结构体提供源相关的属性信息和回调函数。#define obs_register_source(info) obs_register_source_s(info, sizeo......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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