diff --git a/modules/videoio/src/cap_avfoundation_mac.mm b/modules/videoio/src/cap_avfoundation_mac.mm index dfc7e64d86..5d496288fe 100644 --- a/modules/videoio/src/cap_avfoundation_mac.mm +++ b/modules/videoio/src/cap_avfoundation_mac.mm @@ -45,7 +45,7 @@ #include "precomp.hpp" #include "opencv2/imgproc.hpp" #include -#include +#include #import #define CV_CAP_MODE_BGR CV_FOURCC_MACRO('B','G','R','3') @@ -324,6 +324,28 @@ void CvCaptureCAM::stopCaptureDevice() { int CvCaptureCAM::startCaptureDevice(int cameraNum) { NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; +#if defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 + AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; + if (status == AVAuthorizationStatusDenied) + { + fprintf(stderr, "OpenCV: camera access has been denied. Either run 'tccutil reset Camera' " + "command in same terminal to reset application authorization status, " + "either modify 'System Preferences -> Security & Privacy -> Camera' " + "settings for your application.\n"); + [localpool drain]; + return 0; + } + else if (status != AVAuthorizationStatusAuthorized) + { + fprintf(stderr, "OpenCV: not authorized to capture video (status %ld), requesting...\n", status); + // TODO: doesn't work via ssh + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL) { /* we don't care */}]; + // we do not wait for completion + [localpool drain]; + return 0; + } +#endif + // get capture device NSArray *devices = [[AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo] arrayByAddingObjectsFromArray:[AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]];