From patchwork Wed Apr 17 15:12:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marvin Scholz X-Patchwork-Id: 48109 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:ce4e:b0:1a9:af23:56c1 with SMTP id id14csp1090919pzb; Wed, 17 Apr 2024 08:37:02 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUt/UbDWokaPCucsI2kBjS9CA6TmziAGL9FfkL+YNHs0V93hO6fWvBrPZub/31bj/A4A6Z9uVWPFb8oVRwnP8KDPqU2EexR7BTySg== X-Google-Smtp-Source: AGHT+IGMHFNbHmaMSi78FIEVuL3ydpVqE3LD1o/c0nSAIlN7BeSlVqkDAYnraBi0kaGpQHUMqIAI X-Received: by 2002:a05:6512:684:b0:518:b180:3f94 with SMTP id t4-20020a056512068400b00518b1803f94mr8816355lfe.2.1713368222233; Wed, 17 Apr 2024 08:37:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1713368222; cv=none; d=google.com; s=arc-20160816; b=gojFbBgenxKYZWXi40j2eUv50Z8UiHVCMRwfip01Q3LddECGAxYBL9vP2N/IMK7JJ2 4qpqaBNORaFIZXA0626cZpvKAoNllzWjHt5S9UPI+RsOesS+9QwAAthTGIZWbocI9zFv a2YGKE0bC2Isv3J3Wr5nH+I7FVZgG5GIhDgYdlTzTOaGMbGccOLVw7gpkmYo8JuQQCtq C1oDOkDWv0oF2VXcMt4BnjL8G24Gvl1KghzDeoZ5ka+xeu1IGlLtapf7ip/FDq+Ev4Vy q7s7ZVJtFCgZWUoiTDwuTdElo8GpXpmjAvk9VQ80VDSERYxx1+wxJnMxDQMrvbRc9n53 OELQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:date:from:to:message-id:dkim-signature :delivered-to; bh=q3yX3j6Puh7QJBMAh1OeniCDx/VSt9E8ZLR6XCNv5NM=; fh=5IeVwzS1vbVKjIV8MP3mnmnRtZGb8uteQ9r4QD2keV0=; b=H1frXsSE/FhqDu3W/aMBQoK+51ykZjq0F21ioeyBtMEeHhH0iaDr/RJ6vK/kQhUZOy Q7hELMrtKCSnKplaxdoAEoYl6jTJdfwLXZo8h7r8tMmoOx7IB5ka7Z+oA8+/nagyXIOh g2mDgXyJhH/FHkcJkE2riIjxA+E8GLrjLI98NOSWgLqrrnfU4GrSmajULTXOOsNhfvH+ wRx4eFfyjDXXnqWEb+iy/S1EIpfHZ1Mts//8ywO6f69P9RmIgL+tWL0waWav/jJcMdkA iX2jcPMSM235QjWgJyPT10gn5unkoPhPbCR4nl5pZviH9R1Hy/hP5fn2baYLajU2LeAk K2ww==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b="h1cHtsu/"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id md10-20020a170906ae8a00b00a5563246549si359475ejb.368.2024.04.17.08.37.01; Wed, 17 Apr 2024 08:37:02 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b="h1cHtsu/"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3BC3C68D306; Wed, 17 Apr 2024 18:36:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 515AD68CAA9 for ; Wed, 17 Apr 2024 18:36:50 +0300 (EEST) Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-a5224dfa9adso177018266b.0 for ; Wed, 17 Apr 2024 08:36:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713368209; x=1713973009; darn=ffmpeg.org; h=subject:date:from:to:message-id:from:to:cc:subject:date:message-id :reply-to; bh=C5Q6KpnQ0b/1QYlecxghjBUZAD8h/JIw6aY4GJwn9SU=; b=h1cHtsu/wbcS0YzISnIme9VYsDhIe4Q0YjRx0WRkNv/qIVJwnucLLSvCuifiRyCHb1 SjPyMYuLkQfRClo9dMN29A5Vpxx8aZ3zXqT0CvdL/kwhA1ZTG/p+OsFprH0qgA/8BkiQ o9KYMIqX1i/mifEMNWA0XIQdpuysi/1h5kC73VX06L0v7TR/3KAhORiN1yZrpDpBhcTC FZd4AFda/77jpwE9y/Tht7jlk3CXOFQ2VCdeXQAHZRXVBIWWI6F1uHQBorbCxwQZ1ylp YAvF0BzwYSokBAizuwvgZrJz7mzyeWMd27xFtKyjjmnOTt1cXBqSmzElRu1SNFCPq4xm oJ+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713368209; x=1713973009; h=subject:date:from:to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C5Q6KpnQ0b/1QYlecxghjBUZAD8h/JIw6aY4GJwn9SU=; b=Mz/T+TaEbfyZOoX4ntm0Vm+PhhPaKIPH0V4p3tlhD2Fm17Fotf3xwNzqMGukiRGLoe GR8W4rDlecaA9QJYWpTN9f8qcchaF45Zma85NL8lj1HSsMJsAH1v1OBmiqGh8okK6UY3 /XG84418adTxkvxQBGbIQ81kWjJ1dp7BZfaRpj/z8qzkn0uXN/XjiEoBfcUsC2eDzGCY Z4mKKKdQZ+ZODun53dwovZ9uadrY34ZZacyipFxLYxb0kbNiJEWTo/u6H3bmAZjaPQ0v 8pISGGXhFBvVdq87Zn8H11xcL4TmF4tV47jKpuYuTr7Jkyx7+dYxhogN/OausJh91gyn iwhg== X-Gm-Message-State: AOJu0YzO1+mSx3UwPO6cU89iJvSOLuJ/QDdJ1bZK4lHCgCzJwLdVlPoJ YAJl7R4KK0UImx3R3e5DpZt3WgRLcBhGgQhlDJ+f1WtgW//XFUjlaC9SKQ== X-Received: by 2002:a17:906:cec8:b0:a51:ee80:bae9 with SMTP id si8-20020a170906cec800b00a51ee80bae9mr5294965ejb.17.1713368209387; Wed, 17 Apr 2024 08:36:49 -0700 (PDT) Received: from localhost (dynamic-2a01-0c22-a5ce-8900-88a9-7cc2-792b-664f.c22.pool.telefonica.de. [2a01:c22:a5ce:8900:88a9:7cc2:792b:664f]) by smtp.gmail.com with ESMTPSA id s13-20020a056402520d00b0056bf6287f32sm7310423edd.26.2024.04.17.08.36.48 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 17 Apr 2024 08:36:48 -0700 (PDT) Message-Id: To: From: "Marvin Scholz" Date: Wed, 17 Apr 2024 17:12:34 +0200 Subject: [FFmpeg-devel] [PATCH] avdevice/avfoundation: fix macOS/iOS/tvOS SDK conditional checks X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0KU6j7GqKHBP This fixes the checks to properly use runtime feature detection and check the SDK version (*_MAX_ALLOWED) instead of the targeted version for the relevant APIs. The target is still checked (*_MIN_REQUIRED) to avoid using deprecated methods when targeting new enough versions. --- libavdevice/avfoundation.m | 164 ++++++++++++++++++++++++++----------- 1 file changed, 116 insertions(+), 48 deletions(-) base-commit: 257bc2a82ab6709ddfc8dd9cf570beefcef7d43f diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m index e558ad7d90..a52e7df37b 100644 --- a/libavdevice/avfoundation.m +++ b/libavdevice/avfoundation.m @@ -28,6 +28,7 @@ #import #include +#include "libavutil/avassert.h" #include "libavutil/channel_layout.h" #include "libavutil/mem.h" #include "libavutil/pixdesc.h" @@ -764,57 +765,124 @@ static int get_audio_config(AVFormatContext *s) } static NSArray* getDevicesWithMediaType(AVMediaType mediaType) { -#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000) || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500)) - NSMutableArray *deviceTypes = nil; - if (mediaType == AVMediaTypeVideo) { - deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]]; - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000) - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualCamera]; - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTelephotoCamera]; - #endif - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110100) - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTrueDepthCamera]; - #endif - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 130000) - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTripleCamera]; - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualWideCamera]; - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInUltraWideCamera]; - #endif - #if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= 130000) - [deviceTypes addObject: AVCaptureDeviceTypeDeskViewCamera]; - #endif - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 150400) - [deviceTypes addObject: AVCaptureDeviceTypeBuiltInLiDARDepthCamera]; - #endif - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000)) - [deviceTypes addObject: AVCaptureDeviceTypeContinuityCamera]; - #endif - } else if (mediaType == AVMediaTypeAudio) { - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000)) - deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeMicrophone]]; - #else - deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeBuiltInMicrophone]]; - #endif - } else if (mediaType == AVMediaTypeMuxed) { - #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000)) - deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternal]]; - #elif (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 140000) - deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternalUnknown]]; - #else + +#if (TARGET_OS_OSX && defined(__MAC_10_15) && MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_10_15) || \ + (TARGET_OS_IOS && defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(macOS 10.15, iOS 10, tvOS 17, *)) { + + NSMutableArray *deviceTypes = nil; + + if (mediaType == AVMediaTypeVideo) { + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]]; + + #if (TARGET_OS_IOS || TARGET_OS_TV) + // Devices only available on iOS/tvOS + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualCamera]; + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTelephotoCamera]; + + #if (TARGET_OS_IOS && defined(__IPHONE_11_1) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_1) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(iOS 11.1, tvOS 17, *)) { + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTrueDepthCamera]; + } + #endif + + #if (TARGET_OS_IOS && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(iOS 13.0, tvOS 17, *)) { + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTripleCamera]; + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualWideCamera]; + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInUltraWideCamera]; + } + #endif + + #if (TARGET_OS_IOS && defined(__IPHONE_15_4) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_4) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(iOS 15.4, tvOS 17, *)) { + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInLiDARDepthCamera]; + } + #endif + #endif + + #if (TARGET_OS_OSX && defined(__MAC_13_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_13_0) + if (__builtin_available(macOS 13.0, *)) { + [deviceTypes addObject: AVCaptureDeviceTypeDeskViewCamera]; + } + #endif + + #if (TARGET_OS_OSX && defined(__MAC_14_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_14_0) || \ + (TARGET_OS_IOS && defined(__IPHONE_17_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_17_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(macOS 14.0, iOS 17, tvOS 17, *)) { + [deviceTypes addObject: AVCaptureDeviceTypeContinuityCamera]; + } + #endif + + } else if (mediaType == AVMediaTypeAudio) { + #if (TARGET_OS_OSX && defined(__MAC_14_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_14_0) || \ + (TARGET_OS_IOS && defined(__IPHONE_17_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_17_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(macOS 14.0, iOS 17, tvOS 17, *)) { + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeMicrophone]]; + } else + #endif + { + #if (TARGET_OS_OSX && defined(__MAC_14_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_14_0) || \ + (TARGET_OS_IOS && defined(__IPHONE_17_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_17_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_17_0) + /* If the targeted macOS is new enough, this fallback case can never be reached, so do not + * use a deprecated API to avoid compiler warnings. + */ + av_assert0(!"Unreachable reached!"); + #else + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeBuiltInMicrophone]]; + #endif + } + } else if (mediaType == AVMediaTypeMuxed) { + #if (TARGET_OS_OSX && defined(__MAC_14_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_14_0) || \ + (TARGET_OS_IOS && defined(__IPHONE_17_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_17_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_17_0) + if (__builtin_available(macOS 14.0, iOS 17, tvOS 17, *)) { + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternal]]; + } else + #endif + #if (TARGET_OS_OSX && defined(__MAC_14_0) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_14_0) + // macOS 10.15+ already guaranteed here by previous check + { + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternalUnknown]]; + } + #else + { + return nil; + } + #endif + } else { return nil; - #endif - } else { - return nil; - } + } + + AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession = + [AVCaptureDeviceDiscoverySession + discoverySessionWithDeviceTypes:deviceTypes + mediaType:mediaType + position:AVCaptureDevicePositionUnspecified]; + return [captureDeviceDiscoverySession devices]; + } else +#endif - AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession = - [AVCaptureDeviceDiscoverySession - discoverySessionWithDeviceTypes:deviceTypes - mediaType:mediaType - position:AVCaptureDevicePositionUnspecified]; - return [captureDeviceDiscoverySession devices]; +#if (TARGET_OS_OSX && defined(__MAC_10_15) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) || \ + (TARGET_OS_IOS && defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0) || \ + (TARGET_OS_TV && defined(__TVOS_17_0) && __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_17_0) + { + /* If the targeted macOS is new enough, this fallback case can never be reached, so do not + * use a deprecated API to avoid compiler warnings. + */ + av_assert0(!"Unreachable reached!"); + } #else - return [AVCaptureDevice devicesWithMediaType:mediaType]; + { + return [AVCaptureDevice devicesWithMediaType:mediaType]; + } #endif }