OBS图形及渲染
+ -

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);
}

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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