|
@@ -1938,6 +1938,28 @@ static void obs_source_draw_async_texture(struct obs_source *source)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void recreate_async_texture(obs_source_t *source,
|
|
|
+ enum gs_color_format format)
|
|
|
+{
|
|
|
+ uint32_t cx = gs_texture_get_width(source->async_textures[0]);
|
|
|
+ uint32_t cy = gs_texture_get_height(source->async_textures[0]);
|
|
|
+ gs_texture_destroy(source->async_textures[0]);
|
|
|
+ source->async_textures[0] =
|
|
|
+ gs_texture_create(cx, cy, format, 1, NULL, GS_DYNAMIC);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void check_to_swap_bgrx_bgra(obs_source_t *source,
|
|
|
+ struct obs_source_frame *frame)
|
|
|
+{
|
|
|
+ enum gs_color_format format =
|
|
|
+ gs_texture_get_color_format(source->async_textures[0]);
|
|
|
+ if (format == GS_BGRX && frame->format == VIDEO_FORMAT_BGRA) {
|
|
|
+ recreate_async_texture(source, GS_BGRA);
|
|
|
+ } else if (format == GS_BGRA && frame->format == VIDEO_FORMAT_BGRX) {
|
|
|
+ recreate_async_texture(source, GS_BGRX);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void obs_source_update_async_video(obs_source_t *source)
|
|
|
{
|
|
|
if (!source->async_rendered) {
|
|
@@ -1948,6 +1970,8 @@ static void obs_source_update_async_video(obs_source_t *source)
|
|
|
|
|
|
source->async_rendered = true;
|
|
|
if (frame) {
|
|
|
+ check_to_swap_bgrx_bgra(source, frame);
|
|
|
+
|
|
|
if (!source->async_decoupled ||
|
|
|
!source->async_unbuffered) {
|
|
|
source->timing_adjust = obs->video.video_time -
|