mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 13:08:50 +02:00
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
This commit is contained in:
parent
9e2375726b
commit
4682cfb61b
@ -211,6 +211,9 @@ void obs_source_destroy(struct obs_source *source)
|
|||||||
|
|
||||||
obs_source_dosignal(source, "source_destroy", "destroy");
|
obs_source_dosignal(source, "source_destroy", "destroy");
|
||||||
|
|
||||||
|
if (source->context.data)
|
||||||
|
source->info.destroy(source->context.data);
|
||||||
|
|
||||||
if (source->filter_parent)
|
if (source->filter_parent)
|
||||||
obs_source_filter_remove(source->filter_parent, source);
|
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);
|
texture_destroy(source->async_texture);
|
||||||
gs_leavecontext();
|
gs_leavecontext();
|
||||||
|
|
||||||
if (source->context.data)
|
|
||||||
source->info.destroy(source->context.data);
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_AV_PLANES; i++)
|
for (i = 0; i < MAX_AV_PLANES; i++)
|
||||||
bfree(source->audio_data.data[i]);
|
bfree(source->audio_data.data[i]);
|
||||||
|
|
||||||
|
@ -132,7 +132,12 @@ struct obs_source_info {
|
|||||||
*/
|
*/
|
||||||
void *(*create)(obs_data_t settings, obs_source_t source);
|
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);
|
void (*destroy)(void *data);
|
||||||
|
|
||||||
/** Returns the width of the source. Required if this is an input
|
/** Returns the width of the source. Required if this is an input
|
||||||
|
Loading…
Reference in New Issue
Block a user