obs_view_render
2024-10-17
16
0
render_main_texture用于将图像渲染至video->render_texture
render_main_texture的主要功能有两个:
- 第一个是回调obs->data.draw_callbacks,这里一般数量为0
- 第二是调用obs_view_render
obs_view_render根据view->channels来进行回调渲染。
void obs_view_render(obs_view_t *view)
{
pthread_mutex_lock(&view->channels_mutex);
for (size_t i = 0; i < MAX_CHANNELS; i++)
{
struct obs_source* source = view->channels[i];
if (source)
{
if (source->removed)
{
obs_source_release(source);
view->channels[i] = NULL;
}
else
{
obs_source_video_render(source);
}
}
}
pthread_mutex_unlock(&view->channels_mutex);
}
obs最大支持64个通道,不过一般只有几个使用。各个通道的功能有:
- 0通道是用于图像渲染的。
- 1通道是桌面音频1
- 2通道是桌面音频2
- 3通道是AuxAudioDevice1
- 4通道是AuxAudioDevice2
- 5通道是AuxAudioDevice3
- 6通道是AuxAudioDevice4
内容详见:https://www.pnpon.com/article/detail-727.html
obs_source_video_render函数极其简单,就是source对像引用计数管理引用,然后调用render_video
void obs_source_video_render(obs_source_t *source)
{
if (!obs_source_valid(source, "obs_source_video_render"))
return;
obs_source_addref(source);
render_video(source);
obs_source_release(source);
}
在render_video函数中,就是根据源的类型或者根据不同的使用方法,注册不同回调函数,然后调用它们来渲染。
if (source->filters.num && !source->rendering_filter)
obs_source_render_filters(source);
else if (source->info.video_render)
obs_source_main_render(source); //111
else if (source->filter_target)
obs_source_video_render(source->filter_target);
else if (deinterlacing_enabled(source))
deinterlace_render(source);
else
obs_source_render_async_video(source);
对于普通的scence类型,直接调用的是obs_source_main_render。
obs_source_main_render其实调用的是video_render函数
static inline void obs_source_main_render(obs_source_t *source)
{
uint32_t flags = source->info.output_flags;
bool custom_draw = (flags & OBS_SOURCE_CUSTOM_DRAW) != 0;
bool srgb_aware = (flags & OBS_SOURCE_SRGB) != 0;
bool default_effect = !source->filter_parent &&
source->filters.num == 0 && !custom_draw;
bool previous_srgb = false;
if (!srgb_aware) {
previous_srgb = gs_get_linear_srgb();
gs_set_linear_srgb(false);
}
if (default_effect)
obs_source_default_render(source);
else if (source->context.data)
source->info.video_render(source->context.data,custom_draw ? NULL : gs_get_effect());///111
if (!srgb_aware)
gs_set_linear_srgb(previous_srgb);
}