[vlc-commits] avcapture: Explicitly ask for consent before using the video device

David Fuhrmann git at videolan.org
Sun Oct 21 16:19:11 CEST 2018


vlc | branch: master | David Fuhrmann <dfuhrmann at videolan.org> | Sun Oct 21 16:11:44 2018 +0200| [ad372574e5e3ce5562dc10eedbb7e2a55de93ac4] | committer: David Fuhrmann

avcapture: Explicitly ask for consent before using the video device

On 10.14, the system asks the user for consent for using the video
device. But by default, it does not block the initialization, but
just outputs black frames before user consent is given.

This gives a bad experience for the user, also because the module
is not terminated if the user actually declines.

Instead, ask for consent explicitly, and block the open call to
wait for the response. On decline, Open directly returns with an
error, and the log contains the reason.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ad372574e5e3ce5562dc10eedbb7e2a55de93ac4
---

 modules/access/avcapture.m | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/modules/access/avcapture.m b/modules/access/avcapture.m
index ec0a05148b..f5fa8af1b0 100644
--- a/modules/access/avcapture.m
+++ b/modules/access/avcapture.m
@@ -321,14 +321,32 @@ static int Open(vlc_object_t *p_this)
             goto error;
         }
 
+        if (@available(macOS 10.14, *)) {
+            msg_Dbg(p_demux, "Check user consent for access to the video device");
+
+            dispatch_semaphore_t sema = dispatch_semaphore_create(0);
+            __block bool accessGranted = NO;
+            [AVCaptureDevice requestAccessForMediaType: AVMediaTypeVideo completionHandler:^(BOOL granted) {
+                accessGranted = granted;
+                dispatch_semaphore_signal(sema);
+            } ];
+            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
+            dispatch_release(sema);
+            if (!accessGranted) {
+                msg_Err(p_demux, "Can't use the video device as access has not been granted by the user");
+                goto error;
+            }
+        }
+
         input = [AVCaptureDeviceInput deviceInputWithDevice:(__bridge AVCaptureDevice *)p_sys->device error:&o_returnedError];
 
         if ( !input )
         {
-            msg_Err(p_demux, "can't create a valid capture input facility (%ld)", [o_returnedError code]);
+            msg_Err(p_demux, "can't create a valid capture input facility: %s (%ld)",[[o_returnedError localizedDescription] UTF8String], [o_returnedError code]);
             goto error;
         }
 
+
         int chroma = VLC_CODEC_RGB32;
 
         memset(&p_sys->fmt, 0, sizeof(es_format_t));



More information about the vlc-commits mailing list