From 67e6b8649ac4ebe6cd85a9ee1899b2131c51cc46 Mon Sep 17 00:00:00 2001 From: gxalpha Date: Fri, 10 Feb 2023 00:24:52 +0100 Subject: [PATCH] mac-videotoolbox: Load encoders from system asynchronously Copying the encoder list takes a while which blocks the main thread. Doing the copying asynchronously removes instead of blocking the main thread improves startup performance by about 60ms. --- plugins/mac-videotoolbox/encoder.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/plugins/mac-videotoolbox/encoder.c b/plugins/mac-videotoolbox/encoder.c index 4c8c45ba3..7bd212025 100644 --- a/plugins/mac-videotoolbox/encoder.c +++ b/plugins/mac-videotoolbox/encoder.c @@ -1477,8 +1477,23 @@ compare_encoder_list(const void *left_val, const void *right_val, void *unused) OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("mac-videotoolbox", "en-US") +dispatch_group_t encoder_list_dispatch_group; +CFArrayRef encoder_list_const; bool obs_module_load(void) +{ + dispatch_queue_t queue = + dispatch_queue_create("Encoder list load queue", NULL); + encoder_list_dispatch_group = dispatch_group_create(); + dispatch_group_async(encoder_list_dispatch_group, queue, ^{ + VTCopyVideoEncoderList(NULL, &encoder_list_const); + }); + // The group dispatch keeps a reference until it's finished + dispatch_release(queue); + return true; +} + +void obs_module_post_load(void) { struct obs_encoder_info info = { .type = OBS_ENCODER_VIDEO, @@ -1496,8 +1511,8 @@ bool obs_module_load(void) da_init(vt_prores_hardware_encoder_list); da_init(vt_prores_software_encoder_list); - CFArrayRef encoder_list_const; - VTCopyVideoEncoderList(NULL, &encoder_list_const); + dispatch_group_wait(encoder_list_dispatch_group, DISPATCH_TIME_FOREVER); + dispatch_release(encoder_list_dispatch_group); CFIndex size = CFArrayGetCount(encoder_list_const); CFMutableArrayRef encoder_list = CFArrayCreateMutableCopy( @@ -1582,9 +1597,7 @@ bool obs_module_load(void) CFRelease(encoder_list); - VT_LOG(LOG_INFO, "Adding VideoToolbox encoders"); - - return true; + VT_LOG(LOG_INFO, "Added VideoToolbox encoders"); } void obs_module_unload(void)