From 64b80cb04b124eaa979128f0b8557ee2a5ca239b Mon Sep 17 00:00:00 2001 From: Thilo Borgmann Date: Sat, 4 Apr 2020 13:51:17 +0200 Subject: [PATCH] lavd/avfoundation.m: Do not use transport controls for screen capture devices. --- libavdevice/avfoundation.m | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m index 9f8186b4d7..0b1888693f 100644 --- a/libavdevice/avfoundation.m +++ b/libavdevice/avfoundation.m @@ -99,6 +99,7 @@ typedef struct int capture_raw_data; int drop_late_frames; int video_is_muxed; + int video_is_screen; int list_devices; int video_device_index; @@ -545,12 +546,14 @@ static int add_video_device(AVFormatContext *s, AVCaptureDevice *video_device) #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 // check for transport control support and set observer device if supported - int trans_ctrl = [video_device transportControlsSupported]; - AVCaptureDeviceTransportControlsPlaybackMode trans_mode = [video_device transportControlsPlaybackMode]; + if (!ctx->video_is_screen) { + int trans_ctrl = [video_device transportControlsSupported]; + AVCaptureDeviceTransportControlsPlaybackMode trans_mode = [video_device transportControlsPlaybackMode]; - if (trans_ctrl) { - ctx->observed_mode = trans_mode; - ctx->observed_device = video_device; + if (trans_ctrl) { + ctx->observed_mode = trans_mode; + ctx->observed_device = video_device; + } } #endif @@ -750,7 +753,6 @@ static int get_audio_config(AVFormatContext *s) static int avf_read_header(AVFormatContext *s) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - int capture_screen = 0; uint32_t num_screens = 0; AVFContext *ctx = (AVFContext*)s->priv_data; AVCaptureDevice *video_device = nil; @@ -847,7 +849,7 @@ static int avf_read_header(AVFormatContext *s) } video_device = (AVCaptureDevice*) capture_screen_input; - capture_screen = 1; + ctx->video_is_screen = 1; #endif } else { av_log(ctx, AV_LOG_ERROR, "Invalid device index\n"); @@ -884,7 +886,7 @@ static int avf_read_header(AVFormatContext *s) AVCaptureScreenInput* capture_screen_input = [[[AVCaptureScreenInput alloc] initWithDisplayID:screens[idx]] autorelease]; video_device = (AVCaptureDevice*) capture_screen_input; ctx->video_device_index = ctx->num_video_devices + idx; - capture_screen = 1; + ctx->video_is_screen = 1; if (ctx->framerate.num > 0) { capture_screen_input.minFrameDuration = CMTimeMake(ctx->framerate.den, ctx->framerate.num); @@ -975,7 +977,7 @@ static int avf_read_header(AVFormatContext *s) /* Unlock device configuration only after the session is started so it * does not reset the capture formats */ - if (!capture_screen) { + if (!ctx->video_is_screen) { [video_device unlockForConfiguration]; }