mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user