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.
This commit is contained in:
gxalpha
2023-02-12 17:38:21 +01:00
committed by Patrick Heyer
parent 7a838e877f
commit 67e6b8649a
+18 -5
View File
@@ -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)