mac-virtualcam: Replace variable-length arrays with NSMutableData

Co-authored-by: Patrick Heyer <PatTheMav@users.noreply.github.com>
This commit is contained in:
tytan652 2023-07-31 20:08:04 +02:00
parent 54bacd4f10
commit 63a9d372bb

View file

@ -369,27 +369,25 @@ static bool virtualcam_output_start(void *data)
.mScope = kCMIOObjectPropertyScopeGlobal, .mScope = kCMIOObjectPropertyScopeGlobal,
.mElement = kCMIOObjectPropertyElementMain}; .mElement = kCMIOObjectPropertyElementMain};
CMIOObjectGetPropertyDataSize(kCMIOObjectSystemObject, &address, 0, NULL, &size); CMIOObjectGetPropertyDataSize(kCMIOObjectSystemObject, &address, 0, NULL, &size);
size_t num_devices = size / sizeof(CMIOObjectID); NSMutableData *cmioDevices = [NSMutableData dataWithLength:size];
CMIOObjectID cmio_devices[num_devices]; void *device_data = [cmioDevices mutableBytes];
CMIOObjectGetPropertyData(kCMIOObjectSystemObject, &address, 0, NULL, size, &used, &cmio_devices); CMIOObjectGetPropertyData(kCMIOObjectSystemObject, &address, 0, NULL, size, &used, device_data);
vcam->deviceID = 0; vcam->deviceID = 0;
NSString *OBSVirtualCamUUID = [[NSBundle bundleWithIdentifier:@"com.obsproject.mac-virtualcam"] NSString *OBSVirtualCamUUID = [[NSBundle bundleWithIdentifier:@"com.obsproject.mac-virtualcam"]
objectForInfoDictionaryKey:@"OBSCameraDeviceUUID"]; objectForInfoDictionaryKey:@"OBSCameraDeviceUUID"];
for (size_t i = 0; i < num_devices; i++) { for (size_t i = 0; i < (used * sizeof(CMIOObjectID)); i++) {
CMIOObjectID cmio_device = cmio_devices[i]; CMIOObjectID cmioDevice;
[cmioDevices getBytes:&cmioDevice range:NSMakeRange(i * sizeof(CMIOObjectID), sizeof(CMIOObjectID))];
address.mSelector = kCMIODevicePropertyDeviceUID; address.mSelector = kCMIODevicePropertyDeviceUID;
UInt32 device_name_size; UInt32 device_name_size;
CMIOObjectGetPropertyDataSize(cmio_device, &address, 0, NULL, &device_name_size); CMIOObjectGetPropertyDataSize(cmioDevice, &address, 0, NULL, &device_name_size);
CFStringRef uid; CFStringRef uid;
CMIOObjectGetPropertyData(cmio_device, &address, 0, NULL, device_name_size, &used, &uid); CMIOObjectGetPropertyData(cmioDevice, &address, 0, NULL, device_name_size, &used, &uid);
const char *uid_string = CFStringGetCStringPtr(uid, kCFStringEncodingUTF8); const char *uid_string = CFStringGetCStringPtr(uid, kCFStringEncodingUTF8);
if (uid_string && strcmp(uid_string, OBSVirtualCamUUID.UTF8String) == 0) { if (uid_string && strcmp(uid_string, OBSVirtualCamUUID.UTF8String) == 0) {
vcam->deviceID = cmio_device; vcam->deviceID = cmioDevice;
CFRelease(uid); CFRelease(uid);
break; break;
} else { } else {
@ -404,11 +402,15 @@ static bool virtualcam_output_start(void *data)
address.mSelector = kCMIODevicePropertyStreams; address.mSelector = kCMIODevicePropertyStreams;
CMIOObjectGetPropertyDataSize(vcam->deviceID, &address, 0, NULL, &size); CMIOObjectGetPropertyDataSize(vcam->deviceID, &address, 0, NULL, &size);
CMIOStreamID stream_ids[(size / sizeof(CMIOStreamID))]; NSMutableData *streamIds = [NSMutableData dataWithLength:size];
void *stream_data = [streamIds mutableBytes];
CMIOObjectGetPropertyData(vcam->deviceID, &address, 0, NULL, size, &used, stream_data);
CMIOObjectGetPropertyData(vcam->deviceID, &address, 0, NULL, size, &used, &stream_ids); if (used < (2 * sizeof(CMIOStreamID))) {
obs_output_set_last_error(vcam->output, obs_module_text("Error.SystemExtension.CameraNotStarted"));
vcam->streamID = stream_ids[1]; return false;
}
[streamIds getBytes:&vcam->streamID range:NSMakeRange(sizeof(CMIOStreamID), sizeof(CMIOStreamID))];
CMIOStreamCopyBufferQueue( CMIOStreamCopyBufferQueue(
vcam->streamID, [](CMIOStreamID, void *, void *) { vcam->streamID, [](CMIOStreamID, void *, void *) {