From e37b15e26fbc7bc31a86a4a2c7c798e20d4f4c2c Mon Sep 17 00:00:00 2001 From: xufuji456 <839789740@qq.com> Date: Sat, 9 Dec 2023 20:09:38 +0800 Subject: [PATCH] avdevice/avfoundation: replace deprecated AVCaptureDevice Building with iOS platform, the compiler has a warning: "'devicesWithMediaType:' is deprecated: first deprecated in iOS 10.0 - Use AVCaptureDeviceDiscoverySession instead" Signed-off-by: xufuji456 <839789740@qq.com> --- libavdevice/avfoundation.m | 65 +++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m index 36ad834753..aa892fae60 100644 --- a/libavdevice/avfoundation.m +++ b/libavdevice/avfoundation.m @@ -761,6 +761,61 @@ static int get_audio_config(AVFormatContext *s) return 0; } +static NSArray* getDevicesWithMediaType(AVMediaType mediaType) { +#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000) || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101500)) + NSMutableArray *deviceTypes = nil; + if (mediaType == AVMediaTypeVideo) { + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]]; + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000) + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualCamera]; + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTelephotoCamera]; + #endif + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110100) + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTrueDepthCamera]; + #endif + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000) + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTripleCamera]; + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualWideCamera]; + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInUltraWideCamera]; + #endif + #if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 130000) + [deviceTypes addObject: AVCaptureDeviceTypeDeskViewCamera]; + #endif + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 150400) + [deviceTypes addObject: AVCaptureDeviceTypeBuiltInLiDARDepthCamera]; + #endif + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000)) + [deviceTypes addObject: AVCaptureDeviceTypeContinuityCamera]; + #endif + } else if (mediaType == AVMediaTypeAudio) { + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000)) + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeMicrophone]]; + #else + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeBuiltInMicrophone]]; + #endif + } else if (mediaType == AVMediaTypeMuxed) { + #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000)) + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternal]]; + #elseif (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED < 140000) + deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternalUnknown]]; + #else + return nil; + #endif + } else { + return nil; + } + + AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession = + [AVCaptureDeviceDiscoverySession + discoverySessionWithDeviceTypes:deviceTypes + mediaType:mediaType + position:AVCaptureDevicePositionUnspecified]; + return [captureDeviceDiscoverySession devices]; +#else + return [AVCaptureDevice devicesWithMediaType:mediaType]; +#endif +} + static int avf_read_header(AVFormatContext *s) { int ret = 0; @@ -770,8 +825,8 @@ static int avf_read_header(AVFormatContext *s) AVCaptureDevice *video_device = nil; AVCaptureDevice *audio_device = nil; // Find capture device - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - NSArray *devices_muxed = [AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]; + NSArray *devices = getDevicesWithMediaType(AVMediaTypeVideo); + NSArray *devices_muxed = getDevicesWithMediaType(AVMediaTypeMuxed); ctx->num_video_devices = [devices count] + [devices_muxed count]; @@ -806,7 +861,7 @@ static int avf_read_header(AVFormatContext *s) #endif av_log(ctx, AV_LOG_INFO, "AVFoundation audio devices:\n"); - devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]; + devices = getDevicesWithMediaType(AVMediaTypeAudio); for (AVCaptureDevice *device in devices) { const char *name = [[device localizedName] UTF8String]; int index = [devices indexOfObject:device]; @@ -930,7 +985,7 @@ static int avf_read_header(AVFormatContext *s) // get audio device if (ctx->audio_device_index >= 0) { - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]; + NSArray *devices = getDevicesWithMediaType(AVMediaTypeAudio); if (ctx->audio_device_index >= [devices count]) { av_log(ctx, AV_LOG_ERROR, "Invalid audio device index\n"); @@ -943,7 +998,7 @@ static int avf_read_header(AVFormatContext *s) if (!strncmp(ctx->audio_filename, "default", 7)) { audio_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; } else { - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]; + NSArray *devices = getDevicesWithMediaType(AVMediaTypeAudio); for (AVCaptureDevice *device in devices) { if (!strncmp(ctx->audio_filename, [[device localizedName] UTF8String], strlen(ctx->audio_filename))) {