diff --git a/modules/videoio/src/cap_avfoundation_mac.mm b/modules/videoio/src/cap_avfoundation_mac.mm index 124462c6c2..e3c69786fd 100644 --- a/modules/videoio/src/cap_avfoundation_mac.mm +++ b/modules/videoio/src/cap_avfoundation_mac.mm @@ -328,10 +328,28 @@ int CvCaptureCAM::startCaptureDevice(int cameraNum) { } 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 + if (!cv::utils::getConfigurationParameterBool("OPENCV_AVFOUNDATION_SKIP_AUTH", false)) + { + fprintf(stderr, "OpenCV: not authorized to capture video (status %ld), requesting...\n", status); + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL) { /* we don't care */}]; + if ([NSThread isMainThread]) + { + // we run the main loop for 0.1 sec to show the message + [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + } + else + { + fprintf(stderr, "OpenCV: can not spin main run loop from other thread, set " + "OPENCV_AVFOUNDATION_SKIP_AUTH=1 to disable authorization request " + "and perform it in your application.\n"); + } + } + else + { + fprintf(stderr, "OpenCV: not authorized to capture video (status %ld), set " + "OPENCV_AVFOUNDATION_SKIP_AUTH=0 to enable authorization request or " + "perform it in your application.\n", status); + } [localpool drain]; return 0; }