diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index f898034cf..6fd9b1da6 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -710,6 +710,9 @@ extern void add_alignment(struct vec2 *v, uint32_t align, int cx, int cy); extern struct obs_source_frame *filter_async_video(obs_source_t *source, struct obs_source_frame *in); +extern bool update_async_texture(struct obs_source *source, + const struct obs_source_frame *frame, + gs_texture_t *tex, gs_texrender_t *texrender); extern bool set_async_texture_size(struct obs_source *source, const struct obs_source_frame *frame); extern void remove_async_frame(obs_source_t *source, diff --git a/libobs/obs-source.c b/libobs/obs-source.c index e27dd69c6..6dda697ac 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -1382,11 +1382,9 @@ static inline void set_eparam(gs_effect_t *effect, const char *name, float val) } static bool update_async_texrender(struct obs_source *source, - const struct obs_source_frame *frame) + const struct obs_source_frame *frame, + gs_texture_t *tex, gs_texrender_t *texrender) { - gs_texture_t *tex = source->async_texture; - gs_texrender_t *texrender = source->async_convert_texrender; - gs_texrender_reset(texrender); upload_raw_frame(tex, frame); @@ -1439,11 +1437,10 @@ static bool update_async_texrender(struct obs_source *source, return true; } -static bool update_async_texture(struct obs_source *source, - const struct obs_source_frame *frame) +bool update_async_texture(struct obs_source *source, + const struct obs_source_frame *frame, + gs_texture_t *tex, gs_texrender_t *texrender) { - gs_texture_t *tex = source->async_texture; - gs_texrender_t *texrender = source->async_convert_texrender; enum convert_type type = get_convert_type(frame->format); uint8_t *ptr; uint32_t linesize; @@ -1458,7 +1455,7 @@ static bool update_async_texture(struct obs_source *source, sizeof frame->color_range_max); if (source->async_gpu_conversion && texrender) - return update_async_texrender(source, frame); + return update_async_texrender(source, frame, tex, texrender); if (type == CONVERT_NONE) { gs_texture_set_image(tex, frame->data[0], frame->linesize[0], @@ -1565,13 +1562,14 @@ static void obs_source_update_async_video(obs_source_t *source) os_gettime_ns() - frame->timestamp; source->timing_set = true; - if (!set_async_texture_size(source, frame)) - return; - if (!update_async_texture(source, frame)) - return; - } + if (set_async_texture_size(source, frame)) { + update_async_texture(source, frame, + source->async_texture, + source->async_convert_texrender); + } - obs_source_release_frame(source, frame); + obs_source_release_frame(source, frame); + } } }