void deinterlace_update_async_video(obs_source_t *source) { struct obs_source_frame *frame; bool updated; if (source->deinterlace_rendered) return; frame = get_prev_frame(source, &updated); source->deinterlace_rendered = true; if (frame) frame = filter_async_video(source, frame); if (frame) { if (set_async_texture_size(source, frame)) { update_async_texture(source, frame, source->async_prev_texture, source->async_prev_texrender); } obs_source_release_frame(source, frame); } else if (updated) { /* swap cur/prev if no previous texture */ gs_texture_t *prev_tex = source->async_prev_texture; source->async_prev_texture = source->async_texture; source->async_texture = prev_tex; if (source->async_texrender) { gs_texrender_t *prev = source->async_prev_texrender; source->async_prev_texrender = source->async_texrender; source->async_texrender = prev; } } }
static void obs_source_render_async_video(obs_source_t source) { struct source_frame *frame = obs_source_getframe(source); if (frame) { if (!set_async_texture_size(source, frame)) return; if (!update_async_texture(source, frame)) return; } if (source->async_texture) obs_source_draw_async_texture(source); obs_source_releaseframe(source, frame); }