Browse Source

Fix an issue with async (video) source destruction

obs_source_output_video can cause cached frames to be freed twice if
called with a partially destroyed source, among other undesirable
effects; freeing the source private data right after the destroy signal
has been processed ensures proper behavior
Palana 11 years ago
parent
commit
4682cfb61b
2 changed files with 9 additions and 4 deletions
  1. 3 3
      libobs/obs-source.c
  2. 6 1
      libobs/obs-source.h

+ 3 - 3
libobs/obs-source.c

@@ -211,6 +211,9 @@ void obs_source_destroy(struct obs_source *source)
 
 	obs_source_dosignal(source, "source_destroy", "destroy");
 
+	if (source->context.data)
+		source->info.destroy(source->context.data);
+
 	if (source->filter_parent)
 		obs_source_filter_remove(source->filter_parent, source);
 
@@ -225,9 +228,6 @@ void obs_source_destroy(struct obs_source *source)
 	texture_destroy(source->async_texture);
 	gs_leavecontext();
 
-	if (source->context.data)
-		source->info.destroy(source->context.data);
-
 	for (i = 0; i < MAX_AV_PLANES; i++)
 		bfree(source->audio_data.data[i]);
 

+ 6 - 1
libobs/obs-source.h

@@ -132,7 +132,12 @@ struct obs_source_info {
 	 */
 	void *(*create)(obs_data_t settings, obs_source_t source);
 
-	/** Destroys the private data for the source */
+	/**
+	 * Destroys the private data for the source
+	 *
+	 * Async sources must not call obs_source_output_video after returning
+	 * from destroy
+	 */
 	void (*destroy)(void *data);
 
 	/** Returns the width of the source.  Required if this is an input