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)