libobs/media-io: Fix leaks and error handling

master
jpark37 2021-08-23 22:02:17 -07:00
parent 8075e8bb65
commit 0c208f1e62
2 changed files with 29 additions and 29 deletions

View File

@ -354,7 +354,6 @@ static inline bool valid_audio_params(const struct audio_output_info *info)
int audio_output_open(audio_t **audio, struct audio_output_info *info)
{
struct audio_output *out;
pthread_mutexattr_t attr;
bool planar = is_audio_planar(info->format);
if (!valid_audio_params(info))
@ -362,7 +361,7 @@ int audio_output_open(audio_t **audio, struct audio_output_info *info)
out = bzalloc(sizeof(struct audio_output));
if (!out)
goto fail;
goto fail0;
memcpy(&out->info, info, sizeof(struct audio_output_info));
out->channels = get_audio_channels(info->speakers);
@ -372,22 +371,22 @@ int audio_output_open(audio_t **audio, struct audio_output_info *info)
out->block_size = (planar ? 1 : out->channels) *
get_audio_bytes_per_channel(info->format);
if (pthread_mutexattr_init(&attr) != 0)
goto fail;
if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
goto fail;
if (pthread_mutex_init(&out->input_mutex, &attr) != 0)
goto fail;
if (pthread_mutex_init_recursive(&out->input_mutex) != 0)
goto fail0;
if (os_event_init(&out->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
goto fail;
goto fail1;
if (pthread_create(&out->thread, NULL, audio_thread, out) != 0)
goto fail;
goto fail2;
out->initialized = true;
*audio = out;
return AUDIO_OUTPUT_SUCCESS;
fail:
fail2:
os_event_destroy(out->stop_event);
fail1:
pthread_mutex_destroy(&out->input_mutex);
fail0:
audio_output_close(out);
return AUDIO_OUTPUT_FAIL;
}
@ -402,6 +401,8 @@ void audio_output_close(audio_t *audio)
if (audio->initialized) {
os_event_signal(audio->stop_event);
pthread_join(audio->thread, &thread_ret);
os_event_destroy(audio->stop_event);
pthread_mutex_destroy(&audio->input_mutex);
}
for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
@ -412,8 +413,6 @@ void audio_output_close(audio_t *audio)
da_free(mix->inputs);
}
os_event_destroy(audio->stop_event);
bfree(audio);
}

View File

@ -225,32 +225,27 @@ static inline void init_cache(struct video_output *video)
int video_output_open(video_t **video, struct video_output_info *info)
{
struct video_output *out;
pthread_mutexattr_t attr;
if (!valid_video_params(info))
return VIDEO_OUTPUT_INVALIDPARAM;
out = bzalloc(sizeof(struct video_output));
if (!out)
goto fail;
goto fail0;
memcpy(&out->info, info, sizeof(struct video_output_info));
out->frame_time =
util_mul_div64(1000000000ULL, info->fps_den, info->fps_num);
out->initialized = false;
if (pthread_mutexattr_init(&attr) != 0)
goto fail;
if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
goto fail;
if (pthread_mutex_init(&out->data_mutex, &attr) != 0)
goto fail;
if (pthread_mutex_init(&out->input_mutex, &attr) != 0)
goto fail;
if (pthread_mutex_init_recursive(&out->data_mutex) != 0)
goto fail0;
if (pthread_mutex_init_recursive(&out->input_mutex) != 0)
goto fail1;
if (os_sem_init(&out->update_semaphore, 0) != 0)
goto fail;
goto fail2;
if (pthread_create(&out->thread, NULL, video_thread, out) != 0)
goto fail;
goto fail3;
init_cache(out);
@ -258,7 +253,13 @@ int video_output_open(video_t **video, struct video_output_info *info)
*video = out;
return VIDEO_OUTPUT_SUCCESS;
fail:
fail3:
os_sem_destroy(out->update_semaphore);
fail2:
pthread_mutex_destroy(&out->input_mutex);
fail1:
pthread_mutex_destroy(&out->data_mutex);
fail0:
video_output_close(out);
return VIDEO_OUTPUT_FAIL;
}
@ -277,9 +278,6 @@ void video_output_close(video_t *video)
for (size_t i = 0; i < video->info.cache_size; i++)
video_frame_free((struct video_frame *)&video->cache[i]);
os_sem_destroy(video->update_semaphore);
pthread_mutex_destroy(&video->data_mutex);
pthread_mutex_destroy(&video->input_mutex);
bfree(video);
}
@ -510,6 +508,9 @@ void video_output_stop(video_t *video)
video->stop = true;
os_sem_post(video->update_semaphore);
pthread_join(video->thread, &thread_ret);
os_sem_destroy(video->update_semaphore);
pthread_mutex_destroy(&video->data_mutex);
pthread_mutex_destroy(&video->input_mutex);
}
}