diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 620161ccf..3854ee58b 100644 --- a/libobs/obs-source.c +++ b/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]); diff --git a/libobs/obs-source.h b/libobs/obs-source.h index 5f40d8799..479fd4b44 100644 --- a/libobs/obs-source.h +++ b/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