@ -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 ) ) ) {