OBS源实例的创建
2024-03-22
8
0
OBS源实例的创建使用的是函数obs_source_create
obs_source_t *obs_source_create(const char *id, const char *name,
obs_data_t *settings, obs_data_t *hotkey_data)
{
return obs_source_create_internal(id, name, NULL, settings, hotkey_data,
false, LIBOBS_API_VER);
}
- id为注册时的obs_source_info结构体中的id
- name:为创建实例时使用的标签名,用户可以随意命名,但不能和别的实例名冲突
obs_source_create_internal函数中首先申空一个obs_source内型的结构体:
struct obs_source {
struct obs_context_data context;
struct obs_source_info info;// 指身注册的源结构体
...
// timing (if video is present, is based upon video)
//audio
//async video data
//async video deinterlacing
//filters
//sources specific hotkeys
//transitions
...
}
这是一个可以代表任何东西的结构体。
2.初始化一些基它基本信息,如标识,配置等
3.如果有的话,调用注册时obs_source_info结构体的get_defaults回调和get_defaults2
static void GetWASAPIDefaultsInput(obs_data_t *settings)
{
obs_data_set_default_string(settings, OPT_DEVICE_ID, "default");
obs_data_set_default_bool(settings, OPT_USE_DEVICE_TIMING, false);
}
static void GetWASAPIDefaultsDeviceOutput(obs_data_t *settings)
{
obs_data_set_default_string(settings, OPT_DEVICE_ID, "default");
obs_data_set_default_bool(settings, OPT_USE_DEVICE_TIMING, true);
}
4.调用时obs_source_info结构体的create回调,用于初始化obs_source实例的内存。
if (info && info->create)
source->context.data = info->create(source->context.settings, source);
可见,context.data竟然是类对象。对于wasapi是WASAPISource。
static void *CreateWASAPIInput(obs_data_t *settings, obs_source_t *source)
{
return CreateWASAPISource(settings, source, SourceType::Input);
}
static void *CreateWASAPIDeviceOutput(obs_data_t *settings,
obs_source_t *source)
{
return CreateWASAPISource(settings, source, SourceType::DeviceOutput);
}
CreateWASAPISource中,地于输入输出设备调用的是:
if (type != SourceType::ProcessOutput)
{
return new WASAPISource(settings, source, type);
}
这就是构造一个WASAPISource类。
这个类也只是做一些环境的初始化,并无实质性的东西。