libobs: Fix race conditions

Uses obs_source_get_ref on the sources enumerated in the tick_sources
function in obs-video.c to ensure a reference has been incremented
before calling that source's video_tick, and replaces an
obs_source_addref with obs_source_get_ref in the push_audio_tree
function in obs-audio.c to ensure that it cannot increment a source that
has already decremented its reference to 0.
This commit is contained in:
jp9000
2019-02-12 19:16:22 -08:00
parent 131fb7b460
commit 573197af5b
2 changed files with 8 additions and 3 deletions

View File

@@ -31,8 +31,8 @@ static void push_audio_tree(obs_source_t *parent, obs_source_t *source, void *p)
struct obs_core_audio *audio = p;
if (da_find(audio->render_order, &source, 0) == DARRAY_INVALID) {
obs_source_addref(source);
da_push_back(audio->render_order, &source);
obs_source_t *s = obs_source_get_ref(source);
if (s) da_push_back(audio->render_order, &s);
}
UNUSED_PARAMETER(parent);

View File

@@ -58,8 +58,13 @@ static uint64_t tick_sources(uint64_t cur_time, uint64_t last_time)
source = data->first_source;
while (source) {
obs_source_video_tick(source, seconds);
struct obs_source *cur_source = obs_source_get_ref(source);
source = (struct obs_source*)source->context.next;
if (cur_source) {
obs_source_video_tick(cur_source, seconds);
obs_source_release(cur_source);
}
}
pthread_mutex_unlock(&data->sources_mutex);