From 90a409fe586daf7b3430ea3be9581efc93998cc1 Mon Sep 17 00:00:00 2001 From: tududweb Date: Thu, 18 Aug 2022 00:23:06 +0800 Subject: [PATCH] libobs: Correctly set texture size Correctly set texture size according to the frame to be rendered this time. Fixes the mismatch between frame and texture when async-delay-filter on. --- libobs/obs-internal.h | 1 - libobs/obs-source.c | 17 +++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 9e6c5a76d..d0077c1e7 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -744,7 +744,6 @@ struct obs_source { bool async_flip; bool async_linear_alpha; bool async_active; - bool async_update_texture; bool async_unbuffered; bool async_decoupled; struct obs_source_frame *async_preload_frame; diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 832fef6fb..4416e7101 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -1206,10 +1206,6 @@ static void async_tick(obs_source_t *source) source->last_sys_timestamp = sys_time; pthread_mutex_unlock(&source->async_mutex); - - if (source->cur_async_frame) - source->async_update_texture = - set_async_texture_size(source, source->cur_async_frame); } void obs_source_video_tick(obs_source_t *source, float seconds) @@ -1975,9 +1971,6 @@ static inline bool init_gpu_conversion(struct obs_source *source, bool set_async_texture_size(struct obs_source *source, const struct obs_source_frame *frame) { - enum convert_type cur = - get_convert_type(frame->format, frame->full_range, frame->trc); - if (source->async_width == frame->width && source->async_height == frame->height && source->async_format == frame->format && @@ -2007,7 +2000,9 @@ bool set_async_texture_size(struct obs_source *source, const enum gs_color_format format = convert_video_format(frame->format, frame->trc); - const bool async_gpu_conversion = (cur != CONVERT_NONE) && + const enum convert_type type = + get_convert_type(frame->format, frame->full_range, frame->trc); + const bool async_gpu_conversion = (type != CONVERT_NONE) && init_gpu_conversion(source, frame); source->async_gpu_conversion = async_gpu_conversion; if (async_gpu_conversion) { @@ -2382,6 +2377,9 @@ static void obs_source_update_async_video(obs_source_t *source) source->async_rendered = true; if (frame) { + const bool async_update_texture = + set_async_texture_size(source, frame); + check_to_swap_bgrx_bgra(source, frame); if (!source->async_decoupled || @@ -2391,11 +2389,10 @@ static void obs_source_update_async_video(obs_source_t *source) source->timing_set = true; } - if (source->async_update_texture) { + if (async_update_texture) { update_async_textures(source, frame, source->async_textures, source->async_texrender); - source->async_update_texture = false; } obs_source_release_frame(source, frame);