Browse Source

image-source: Fix gif not working in studio mode

GIFs wouldn't render on the preview side in studio mode.
Clayton Groeneveld 4 years ago
parent
commit
cb317f2b3b
1 changed files with 30 additions and 11 deletions
  1. 30 11
      plugins/image-source/image-source.c

+ 30 - 11
plugins/image-source/image-source.c

@@ -22,6 +22,7 @@ struct image_source {
 	float update_time_elapsed;
 	uint64_t last_time;
 	bool active;
+	bool restart_gif;
 
 	gs_image_file3_t if3;
 };
@@ -115,6 +116,29 @@ static void image_source_hide(void *data)
 		image_source_unload(context);
 }
 
+static void restart_gif(void *data)
+{
+	struct image_source *context = data;
+
+	if (context->if3.image2.image.is_animated_gif) {
+		context->if3.image2.image.cur_frame = 0;
+		context->if3.image2.image.cur_loop = 0;
+		context->if3.image2.image.cur_time = 0;
+
+		obs_enter_graphics();
+		gs_image_file3_update_texture(&context->if3);
+		obs_leave_graphics();
+
+		context->restart_gif = false;
+	}
+}
+
+static void image_source_activate(void *data)
+{
+	struct image_source *context = data;
+	context->restart_gif = true;
+}
+
 static void *image_source_create(obs_data_t *settings, obs_source_t *source)
 {
 	struct image_source *context = bzalloc(sizeof(struct image_source));
@@ -190,25 +214,19 @@ static void image_source_tick(void *data, float seconds)
 		}
 	}
 
-	if (obs_source_active(context->source)) {
+	if (obs_source_showing(context->source)) {
 		if (!context->active) {
 			if (context->if3.image2.image.is_animated_gif)
 				context->last_time = frame_time;
 			context->active = true;
 		}
 
+		if (context->restart_gif)
+			restart_gif(context);
+
 	} else {
 		if (context->active) {
-			if (context->if3.image2.image.is_animated_gif) {
-				context->if3.image2.image.cur_frame = 0;
-				context->if3.image2.image.cur_loop = 0;
-				context->if3.image2.image.cur_time = 0;
-
-				obs_enter_graphics();
-				gs_image_file3_update_texture(&context->if3);
-				obs_leave_graphics();
-			}
-
+			restart_gif(context);
 			context->active = false;
 		}
 
@@ -323,6 +341,7 @@ static struct obs_source_info image_source_info = {
 	.missing_files = image_source_missingfiles,
 	.get_properties = image_source_properties,
 	.icon_type = OBS_ICON_TYPE_IMAGE,
+	.activate = image_source_activate,
 };
 
 OBS_DECLARE_MODULE()