Skip to content

Commit d753765

Browse files
authored
Fix: [macOS] OF nightly minimum system requirement >13 (#8242)
* Fix macOS 13 SDK issue with AVCaptureDeviceTypeExternal. * iOS Update AVFoundationVideoGrabber Device Types to latest available 17+ (LiDARDepth, TrueDepth, Continuity, External (iPad))
1 parent 4777b61 commit d753765

File tree

2 files changed

+75
-72
lines changed

2 files changed

+75
-72
lines changed

addons/ofxiOS/src/video/AVFoundationVideoGrabber.mm

+39-33
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,23 @@ - (instancetype)init {
5353
}
5454

5555
- (BOOL)initCapture:(int)framerate capWidth:(int)w capHeight:(int)h{
56-
AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[
57-
AVCaptureDeviceTypeBuiltInWideAngleCamera,
58-
AVCaptureDeviceTypeBuiltInTelephotoCamera,
59-
AVCaptureDeviceTypeBuiltInUltraWideCamera,
60-
AVCaptureDeviceTypeBuiltInDualCamera,
61-
AVCaptureDeviceTypeBuiltInDualWideCamera,
62-
AVCaptureDeviceTypeBuiltInTripleCamera,
63-
AVCaptureDeviceTypeExternal
64-
] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
56+
57+
NSMutableArray *deviceTypes = [NSMutableArray arrayWithObjects:AVCaptureDeviceTypeBuiltInWideAngleCamera,
58+
AVCaptureDeviceTypeBuiltInTelephotoCamera,
59+
AVCaptureDeviceTypeBuiltInUltraWideCamera,
60+
AVCaptureDeviceTypeBuiltInDualCamera,
61+
AVCaptureDeviceTypeBuiltInDualWideCamera,
62+
AVCaptureDeviceTypeBuiltInTripleCamera,
63+
AVCaptureDeviceTypeBuiltInTrueDepthCamera, nil];
64+
if (@available(iOS 17.0, macCatalyst 17.0, tvOS 17.0, *)) {
65+
if (&AVCaptureDeviceTypeContinuityCamera != nil) {
66+
[deviceTypes addObject:AVCaptureDeviceTypeContinuityCamera];
67+
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInLiDARDepthCamera];
68+
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInTrueDepthCamera];
69+
[deviceTypes addObject:AVCaptureDeviceTypeExternal];
70+
}
71+
}
72+
AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:deviceTypes mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
6573

6674
NSArray<AVCaptureDevice *> *devices = discoverySession.devices;
6775
if([devices count] > 0) {
@@ -251,28 +259,26 @@ -(CGImageRef)getCurrentFrame{
251259
-(std::vector <std::string>)listDevices{
252260
std::vector <std::string> deviceNames;
253261
NSArray<AVCaptureDevice *> *devices;
254-
if (@available(iOS 17.0, *)) {
255-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[
256-
AVCaptureDeviceTypeBuiltInWideAngleCamera,
257-
AVCaptureDeviceTypeBuiltInTelephotoCamera,
258-
AVCaptureDeviceTypeBuiltInUltraWideCamera,
259-
AVCaptureDeviceTypeBuiltInDualCamera,
260-
AVCaptureDeviceTypeBuiltInDualWideCamera,
261-
AVCaptureDeviceTypeBuiltInTripleCamera,
262-
AVCaptureDeviceTypeExternal
263-
] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
264-
devices = session.devices;
265-
} else {
266-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[
267-
AVCaptureDeviceTypeBuiltInWideAngleCamera,
268-
AVCaptureDeviceTypeBuiltInTelephotoCamera,
269-
AVCaptureDeviceTypeBuiltInUltraWideCamera,
270-
AVCaptureDeviceTypeBuiltInDualCamera,
271-
AVCaptureDeviceTypeBuiltInDualWideCamera,
272-
AVCaptureDeviceTypeBuiltInTripleCamera,
273-
] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
274-
devices = session.devices;
275-
}
262+
263+
NSMutableArray *deviceTypes = [NSMutableArray arrayWithObjects:AVCaptureDeviceTypeBuiltInWideAngleCamera,
264+
AVCaptureDeviceTypeBuiltInTelephotoCamera,
265+
AVCaptureDeviceTypeBuiltInUltraWideCamera,
266+
AVCaptureDeviceTypeBuiltInDualCamera,
267+
AVCaptureDeviceTypeBuiltInDualWideCamera,
268+
AVCaptureDeviceTypeBuiltInTripleCamera,
269+
AVCaptureDeviceTypeBuiltInTrueDepthCamera,
270+
nil
271+
];
272+
if (@available(iOS 17.0, macCatalyst 17.0, tvOS 17.0, *)) {
273+
if (&AVCaptureDeviceTypeContinuityCamera != nil) {
274+
[deviceTypes addObject:AVCaptureDeviceTypeContinuityCamera];
275+
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInLiDARDepthCamera];
276+
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInTrueDepthCamera];
277+
[deviceTypes addObject:AVCaptureDeviceTypeExternal];
278+
}
279+
}
280+
AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:deviceTypes mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
281+
devices = discoverySession.devices;
276282
int i=0;
277283
for (AVCaptureDevice * captureDevice in devices){
278284
deviceNames.push_back([captureDevice.localizedName UTF8String]);
@@ -320,8 +326,8 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput
320326
// Create a CGImageRef from the CVImageBufferRef
321327
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
322328

323-
CGContextRef newContext = CGBitmapContextCreate(baseAddress, widthIn, heightIn, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
324-
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
329+
CGContextRef newContext = CGBitmapContextCreate(baseAddress, widthIn, heightIn, 8, bytesPerRow, colorSpace, (CGBitmapInfo)kCGBitmapByteOrder32Little | (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
330+
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
325331

326332
CGImageRelease(currentFrame);
327333
currentFrame = CGImageCreateCopy(newImage);

libs/openFrameworks/video/ofAVFoundationGrabber.mm

+36-39
Original file line numberDiff line numberDiff line change
@@ -38,33 +38,29 @@ - (instancetype)init {
3838
- (BOOL)initCapture:(int)framerate capWidth:(int)w capHeight:(int)h{
3939
NSArray * devices;
4040
if (@available(macOS 10.15, *)) {
41-
if (@available(macOS 14.0, *)) {
42-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[
43-
AVCaptureDeviceTypeBuiltInWideAngleCamera,
44-
AVCaptureDeviceTypeExternal
45-
] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
46-
devices = [session devices];
47-
} else {
48-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
49-
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
50-
mediaType:AVMediaTypeVideo
51-
position:AVCaptureDevicePositionUnspecified];
52-
devices = [session devices];
53-
}
41+
NSMutableArray *deviceTypes = [NSMutableArray arrayWithObject:AVCaptureDeviceTypeBuiltInWideAngleCamera];
42+
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000
43+
if (@available(macOS 14.0, *)) {
44+
if (&AVCaptureDeviceTypeExternal != nil) {
45+
[deviceTypes addObject:AVCaptureDeviceTypeExternal];
46+
[deviceTypes addObject:AVCaptureDeviceTypeContinuityCamera];
47+
}
48+
}
49+
#endif
50+
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
51+
discoverySessionWithDeviceTypes:deviceTypes
52+
mediaType:AVMediaTypeVideo
53+
position:AVCaptureDevicePositionUnspecified];
54+
devices = [session devices];
5455
} else {
55-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
56-
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
57-
mediaType:AVMediaTypeVideo
58-
position:AVCaptureDevicePositionUnspecified];
59-
devices = [session devices];
60-
56+
#pragma clang diagnostic push
57+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
58+
devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
59+
#pragma clang diagnostic pop
6160
}
62-
6361
if([devices count] > 0) {
6462
if(deviceID>[devices count]-1)
6563
deviceID = [devices count]-1;
66-
67-
6864
// We set the device
6965
device = [devices objectAtIndex:deviceID];
7066

@@ -267,24 +263,25 @@ -(CGImageRef)getCurrentFrame{
267263
std::vector <std::string> deviceNames;
268264
NSArray * devices;
269265
if (@available(macOS 10.15, *)) {
270-
if (@available(macOS 14.0, *)) {
271-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[
272-
AVCaptureDeviceTypeBuiltInWideAngleCamera,
273-
AVCaptureDeviceTypeExternal
274-
] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
275-
devices = [session devices];
276-
} else {
277-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[
278-
AVCaptureDeviceTypeBuiltInWideAngleCamera
279-
] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
280-
devices = [session devices];
281-
}
266+
NSMutableArray *deviceTypes = [NSMutableArray arrayWithObject:AVCaptureDeviceTypeBuiltInWideAngleCamera];
267+
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000
268+
if (@available(macOS 14.0, *)) {
269+
if (&AVCaptureDeviceTypeExternal != nil) {
270+
[deviceTypes addObject:AVCaptureDeviceTypeExternal];
271+
[deviceTypes addObject:AVCaptureDeviceTypeContinuityCamera];
272+
}
273+
}
274+
#endif
275+
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
276+
discoverySessionWithDeviceTypes:deviceTypes
277+
mediaType:AVMediaTypeVideo
278+
position:AVCaptureDevicePositionUnspecified];
279+
devices = [session devices];
282280
} else {
283-
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
284-
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
285-
mediaType:AVMediaTypeVideo
286-
position:AVCaptureDevicePositionUnspecified];
287-
devices = [session devices];
281+
#pragma clang diagnostic push
282+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
283+
devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
284+
#pragma clang diagnostic pop
288285
}
289286

290287
int i=0;

0 commit comments

Comments
 (0)