1 #import <AVFoundation/AVCaptureSession.h>
2 #import <AVFoundation/AVCaptureDevice.h>
3 #import <AVFoundation/AVCaptureInput.h>
4 #import <AVFoundation/AVCaptureOutput.h>
5 #import <CoreVideo/CVPixelBuffer.h>
41 [
self checkPermission];
47 - (
void)captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
53 CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
55 CVReturn ret = CVPixelBufferLockBaseAddress(pixelBuffer, 0);
56 if (ret != kCVReturnSuccess)
59 int imgWidth = (int)CVPixelBufferGetWidth(pixelBuffer);
60 int imgHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
61 unsigned char* data = (
unsigned char*)CVPixelBufferGetBaseAddress(pixelBuffer);
65 NSLog(
@"No pixel buffer data");
69 matrix_float3x3* camMatrix = nil;
72 CFTypeRef cameraIntrinsicData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil);
73 if (cameraIntrinsicData != nil)
75 CFDataRef cfdr = (CFDataRef)(cameraIntrinsicData);
76 (CFDataGetBytePtr(cfdr));
77 camMatrix = (matrix_float3x3*)(CFDataGetBytePtr(cfdr));
83 _updateCB(data, imgWidth, imgHeight, camMatrix);
86 CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
90 - (
void)videoCameraStarted:(NSNotification*)note
94 [[NSNotificationCenter defaultCenter] removeObserver:self
95 name:AVCaptureSessionDidStartRunningNotification
96 object:_captureSession];
104 AVCaptureDeviceFormat* currFormat = [_camera activeFormat];
105 CMFormatDescriptionRef formatDesc = [currFormat formatDescription];
108 CMVideoDimensions dims = CMVideoFormatDescriptionGetDimensions(formatDesc);
109 printf(
"active format: w %d h %d", dims.width, dims.height);
113 - (BOOL)startCamera:(NSString*)deviceId
115 andHeight:(
int)height
116 autoFocusState:(BOOL)autoFocusEnabled
117 videoStabilizationState:(BOOL)videoStabilizationEnabled
118 intrinsicsState:(BOOL)provideIntrinsics
124 NSArray* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
126 for (AVCaptureDevice* device in devices)
128 if ([device uniqueID] == deviceId)
142 AVCaptureDeviceFormat* bestFormat = nil;
143 AVFrameRateRange* bestRange = nil;
145 for (AVCaptureDeviceFormat* format in [
_camera formats])
147 CMFormatDescriptionRef formatDesc = [format formatDescription];
150 CMVideoDimensions dims = CMVideoFormatDescriptionGetDimensions(formatDesc);
151 if (dims.width == width && dims.height == height)
154 for (AVFrameRateRange* range in [format videoSupportedFrameRateRanges])
157 if (bestRange == nil || bestRange.maxFrameRate < range.maxFrameRate)
169 if ([
_camera lockForConfiguration:nil])
172 [_camera setActiveFormat:bestFormat];
176 CMTime duration = [bestRange minFrameDuration];
177 [_camera setActiveVideoMinFrameDuration:duration];
178 [_camera setActiveVideoMaxFrameDuration:duration];
181 if (autoFocusEnabled)
182 [_camera setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
184 [_camera setFocusModeLockedWithLensPosition:1.0 completionHandler:nil];
187 if (@available(iOS 13.0, *))
189 if ([
_camera isGeometricDistortionCorrectionSupported])
191 [_camera setGeometricDistortionCorrectionEnabled:NO];
202 [_captureSession setAutomaticallyConfiguresCaptureDeviceForWideColor:NO];
204 if ([
_captureSession canSetSessionPreset:AVCaptureSessionPresetInputPriority])
205 [_captureSession setSessionPreset:AVCaptureSessionPresetInputPriority];
210 NSError* error = nil;
211 _cameraInput = [AVCaptureDeviceInput deviceInputWithDevice:_camera
219 [_captureSession addInput:_cameraInput];
230 dispatch_queue_t captureQueue = dispatch_queue_create(
"captureQueue", DISPATCH_QUEUE_SERIAL);
233 [_videoOutput setSampleBufferDelegate:self queue:captureQueue];
237 [_videoOutput setAlwaysDiscardsLateVideoFrames:YES];
240 NSNumber* framePixelFormat = [NSNumber numberWithInt:kCVPixelFormatType_32BGRA];
241 _videoOutput.videoSettings = [NSDictionary dictionaryWithObject:framePixelFormat
242 forKey:(id)kCVPixelBufferPixelFormatTypeKey];
246 [_captureSession addOutput:_videoOutput];
251 AVCaptureConnection* capCon = [_videoOutput connectionWithMediaType:AVMediaTypeVideo];
255 if ([capCon isVideoStabilizationSupported])
257 if (videoStabilizationEnabled)
258 [capCon setPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto];
260 [capCon setPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeOff];
263 if (provideIntrinsics && [capCon isCameraIntrinsicMatrixDeliverySupported])
265 [capCon setCameraIntrinsicMatrixDeliveryEnabled:YES];
272 [[NSNotificationCenter defaultCenter] addObserver:self
273 selector:@selector(videoCameraStarted:)
274 name:AVCaptureSessionDidStartRunningNotification
275 object:_captureSession];
278 [_captureSession startRunning];
281 [_camera unlockForConfiguration];
294 [_captureSession stopRunning];
308 NSArray* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
310 for (AVCaptureDevice* device in devices)
313 std::string deviceId = [[device uniqueID] UTF8String];
316 if (AVCaptureDevicePositionFront == [device position])
318 else if (AVCaptureDevicePositionBack == [device position])
325 NSArray<AVCaptureDeviceFormat*>* deviceFormats = [device formats];
326 for (AVCaptureDeviceFormat* format in deviceFormats)
328 CMFormatDescriptionRef formatDesc = [format formatDescription];
333 CMVideoDimensions dims = CMVideoFormatDescriptionGetDimensions(formatDesc);
337 if (!characs.contains({w, h}))
340 float horizFovDeg = [format videoFieldOfView];
343 characs.add(w, h, focalLengthPix);
348 characsVec.push_back(characs);
355 NSString* mediaType = AVMediaTypeVideo;
356 AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
357 if (authStatus == AVAuthorizationStatusAuthorized)
362 else if (authStatus == AVAuthorizationStatusDenied)
365 _permissionCB(
false);
367 else if (authStatus == AVAuthorizationStatusRestricted)
371 else if (authStatus == AVAuthorizationStatusNotDetermined)
374 [AVCaptureDevice requestAccessForMediaType:mediaType
375 completionHandler:^(BOOL granted) {
378 NSLog(@"Granted access to %@", mediaType);
384 NSLog(@"Not granted access to %@", mediaType);
386 _permissionCB(false);
SENSCameraFacing
Definition of camera facing.
typedef void(SL_STDCALL *cbOnImGuiBuild)(SLScene *s
Callback function typedef for ImGui build function.
AVCaptureDeviceInput * _cameraInput
AVCaptureDevice * _camera
AVCaptureSession * _captureSession
SENSCaptureProps retrieveCaptureProperties()
AVCaptureVideoDataOutput * _videoOutput
BOOL _cameraIntrinsicsDelivery
float calcFocalLengthPixFromFOVDeg(const float fovDeg, const int imgLength)