Re: [FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-05 Thread Thilo Borgmann via ffmpeg-devel

Am 05.12.23 um 15:19 schrieb Thilo Borgmann via ffmpeg-devel:

Am 05.12.23 um 15:16 schrieb Thilo Borgmann via ffmpeg-devel:

Hi,

Am 05.12.23 um 14:33 schrieb xufuji456 via ffmpeg-devel:

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 <839789...@qq.com>
---
  libavdevice/avfoundation.m | 25 -
  1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 36ad834753..1bc99d543a 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -761,6 +761,21 @@ static int get_audio_config(AVFormatContext *s)
  return 0;
  }
+static NSArray* getDevicesWithMediaType(AVMediaType mediaType) {




+#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 10) || (TARGET_OS_OSX 
&& __MAC_OS_X_VERSION_MAX_ALLOWED >= 101500))
+    if (@available(macOS 10.15, iOS 10.0, *)) {


The preprocessor guard is meant to void the @available condition.

Also something appears not yet to achieve what you want, as on MacOS 13.4 I 
still get the deprication warning:

libavdevice/avfoundation.m:776:29: warning: 'devicesWithMediaType:' is 
deprecated: first deprecated in macOS 10.15 - Use 
AVCaptureDeviceDiscoverySession instead. [-Wdeprecated-declarations]
 return [AVCaptureDevice devicesWithMediaType:mediaType];




+    AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+    [AVCaptureDeviceDiscoverySession
+    
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:mediaType
+   
position:AVCaptureDevicePositionUnspecified];
+    return [captureDeviceDiscoverySession devices];
+    }



+#endif


why not #else... #endif ?


#elif
... of course.


#else
... writing faster than thinking is no good...




Also using it, would remove the deprication warning on capable systems. 
Otherwise it is still in the code and warned about.



+    // fallback
+    return [AVCaptureDevice devicesWithMediaType:mediaType];
+}
+


-Thilo

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-05 Thread Thilo Borgmann via ffmpeg-devel

Am 05.12.23 um 15:16 schrieb Thilo Borgmann via ffmpeg-devel:

Hi,

Am 05.12.23 um 14:33 schrieb xufuji456 via ffmpeg-devel:

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 <839789...@qq.com>
---
  libavdevice/avfoundation.m | 25 -
  1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 36ad834753..1bc99d543a 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -761,6 +761,21 @@ static int get_audio_config(AVFormatContext *s)
  return 0;
  }
+static NSArray* getDevicesWithMediaType(AVMediaType mediaType) {




+#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 10) || (TARGET_OS_OSX 
&& __MAC_OS_X_VERSION_MAX_ALLOWED >= 101500))
+    if (@available(macOS 10.15, iOS 10.0, *)) {


The preprocessor guard is meant to void the @available condition.

Also something appears not yet to achieve what you want, as on MacOS 13.4 I 
still get the deprication warning:

libavdevice/avfoundation.m:776:29: warning: 'devicesWithMediaType:' is 
deprecated: first deprecated in macOS 10.15 - Use 
AVCaptureDeviceDiscoverySession instead. [-Wdeprecated-declarations]
     return [AVCaptureDevice devicesWithMediaType:mediaType];




+    AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+    [AVCaptureDeviceDiscoverySession
+    
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:mediaType
+   
position:AVCaptureDevicePositionUnspecified];
+    return [captureDeviceDiscoverySession devices];
+    }



+#endif


why not #else... #endif ?


#elif
... of course.

Also using it, would remove the deprication warning on capable systems. 
Otherwise it is still in the code and warned about.



+    // fallback
+    return [AVCaptureDevice devicesWithMediaType:mediaType];
+}
+


Thanks,
Thilo


-Thilo

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-05 Thread Thilo Borgmann via ffmpeg-devel

Hi,

Am 05.12.23 um 14:33 schrieb xufuji456 via ffmpeg-devel:

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 <839789...@qq.com>
---
  libavdevice/avfoundation.m | 25 -
  1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 36ad834753..1bc99d543a 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -761,6 +761,21 @@ static int get_audio_config(AVFormatContext *s)
  return 0;
  }
  
+static NSArray* getDevicesWithMediaType(AVMediaType mediaType) {




+#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 10) || (TARGET_OS_OSX 
&& __MAC_OS_X_VERSION_MAX_ALLOWED >= 101500))
+if (@available(macOS 10.15, iOS 10.0, *)) {


The preprocessor guard is meant to void the @available condition.

Also something appears not yet to achieve what you want, as on MacOS 13.4 I 
still get the deprication warning:

libavdevice/avfoundation.m:776:29: warning: 'devicesWithMediaType:' is 
deprecated: first deprecated in macOS 10.15 - Use 
AVCaptureDeviceDiscoverySession instead. [-Wdeprecated-declarations]
return [AVCaptureDevice devicesWithMediaType:mediaType];




+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:mediaType
+   
position:AVCaptureDevicePositionUnspecified];
+return [captureDeviceDiscoverySession devices];
+}



+#endif


why not #else... #endif ?


+// fallback
+return [AVCaptureDevice devicesWithMediaType:mediaType];
+}
+


Thanks,
Thilo
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-05 Thread xufuji456 via ffmpeg-devel
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 <839789...@qq.com>
---
 libavdevice/avfoundation.m | 25 -
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 36ad834753..1bc99d543a 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -761,6 +761,21 @@ static int get_audio_config(AVFormatContext *s)
 return 0;
 }
 
+static NSArray* getDevicesWithMediaType(AVMediaType mediaType) {
+#if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 10) || 
(TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101500))
+if (@available(macOS 10.15, iOS 10.0, *)) {
+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:mediaType
+   
position:AVCaptureDevicePositionUnspecified];
+return [captureDeviceDiscoverySession devices];
+}
+#endif
+// fallback
+return [AVCaptureDevice devicesWithMediaType:mediaType];
+}
+
 static int avf_read_header(AVFormatContext *s)
 {
 int ret = 0;
@@ -770,8 +785,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 +821,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 +945,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 +958,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))) {
-- 
2.32.0 (Apple Git-132)

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-05 Thread 徐福隆 via ffmpeg-devel
Thank you for your suggestion.
I will adapt the judgment condition, and submit again.


--Original--
From:   
 "FFmpeg development discussions 
and patches"
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-04 Thread epirat07



On 4 Dec 2023, at 13:47, xufuji456 via ffmpeg-devel wrote:

> 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 <839789...@qq.com>

Thanks for the patch, some remarks inline below:

> ---
>  libavdevice/avfoundation.m | 81 +++---
>  1 file changed, 76 insertions(+), 5 deletions(-)
>
> diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
> index 36ad834753..668c726eb7 100644
> --- a/libavdevice/avfoundation.m
> +++ b/libavdevice/avfoundation.m
> @@ -770,8 +770,38 @@ 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 = nil;
> +NSArray *devices_muxed = nil;
> +
> +if (TARGET_OS_IPHONE) {

This should use a SDK guard, like:

  #if ((TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 10) ||
   (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101500))

(You can check 
https://epir.at/2019/10/30/api-availability-and-target-conditionals/ where
I provided a more details about these)

> +if (@available(iOS 10.0, *)) {

This should be extended for other OSes too, the API is not just deprecated on 
iOS.

> +AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
> +[AVCaptureDeviceDiscoverySession
> +
> discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
> +  mediaType:AVMediaTypeVideo
> +   
> position:AVCaptureDevicePositionUnspecified];
> +devices = [captureDeviceDiscoverySession devices];
> +} else {
> +devices = [AVCaptureDevice 
> devicesWithMediaType:AVMediaTypeVideo];
> +}
> +} else {
> +devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
> +}
> +
> +if (TARGET_OS_IPHONE) {
> +if (@available(iOS 10.0, *)) {
> +AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
> +[AVCaptureDeviceDiscoverySession
> +
> discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
> +  mediaType:AVMediaTypeMuxed
> +   
> position:AVCaptureDevicePositionUnspecified];
> +devices_muxed = [captureDeviceDiscoverySession devices];
> +} else {
> +devices_muxed = [AVCaptureDevice 
> devicesWithMediaType:AVMediaTypeMuxed];
> +}
> +} else {
> +devices_muxed = [AVCaptureDevice 
> devicesWithMediaType:AVMediaTypeMuxed];
> +}
>
>  ctx->num_video_devices = [devices count] + [devices_muxed count];
>
> @@ -806,7 +836,20 @@ static int avf_read_header(AVFormatContext *s)
>  #endif
>
>  av_log(ctx, AV_LOG_INFO, "AVFoundation audio devices:\n");
> -devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
> +if (TARGET_OS_IPHONE) {
> +if (@available(iOS 10.0, *)) {
> +AVCaptureDeviceDiscoverySession 
> *captureDeviceDiscoverySession =
> +[AVCaptureDeviceDiscoverySession
> +
> discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
> +  mediaType:AVMediaTypeAudio
> +   
> position:AVCaptureDevicePositionUnspecified];
> +devices = [captureDeviceDiscoverySession devices];
> +} else {
> +devices = [AVCaptureDevice 
> devicesWithMediaType:AVMediaTypeAudio];
> +}
> +} else {
> +devices = [AVCaptureDevice 
> devicesWithMediaType:AVMediaTypeAudio];
> +}
>  for (AVCaptureDevice *device in devices) {
>  const char *name = [[device localizedName] UTF8String];
>  int index  = [devices indexOfObject:device];
> @@ -930,7 +973,21 @@ static int avf_read_header(AVFormatContext *s)
>
>  // get audio device
>  if (ctx->audio_device_index >= 0) {
> -NSArray *devices = [AVCaptureDevice 
> devicesWithMediaType:AVMediaTypeAudio];
> +NSArray *devices = nil;
> +if (TARGET_OS_IPHONE) {
> +if (@available(iOS 10.0, *)) {
> +AVCaptureDeviceDiscoverySession 
> *captureDeviceDiscoverySession =
> +[AVCaptureDeviceDiscoverySession
> +
> 

Re: [FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-04 Thread Thilo Borgmann via ffmpeg-devel

Am 04.12.23 um 13:47 schrieb xufuji456 via ffmpeg-devel:

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 <839789...@qq.com>
---
  libavdevice/avfoundation.m | 81 +++---
  1 file changed, 76 insertions(+), 5 deletions(-)

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 36ad834753..668c726eb7 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -770,8 +770,38 @@ 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 = nil;
+NSArray *devices_muxed = nil;
+




+if (TARGET_OS_IPHONE) {
+if (@available(iOS 10.0, *)) {


The preprocessor directives should be more reliable especially on older 
machines.
See other parts of the code which are handled that way and adopt for your case.



+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:AVMediaTypeVideo
+   
position:AVCaptureDevicePositionUnspecified];
+devices = [captureDeviceDiscoverySession devices];



+} else {
+devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
+}
+} else {
+devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
+}


Here and in other chunks you can join the if() conditions into one and avoid 
the duplication of the old code.


-Thilo
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] avdevice/avfoundation: replace AVCaptureDevice with new api

2023-12-04 Thread xufuji456 via ffmpeg-devel
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 <839789...@qq.com>
---
 libavdevice/avfoundation.m | 81 +++---
 1 file changed, 76 insertions(+), 5 deletions(-)

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 36ad834753..668c726eb7 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -770,8 +770,38 @@ 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 = nil;
+NSArray *devices_muxed = nil;
+
+if (TARGET_OS_IPHONE) {
+if (@available(iOS 10.0, *)) {
+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:AVMediaTypeVideo
+   
position:AVCaptureDevicePositionUnspecified];
+devices = [captureDeviceDiscoverySession devices];
+} else {
+devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
+}
+} else {
+devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
+}
+
+if (TARGET_OS_IPHONE) {
+if (@available(iOS 10.0, *)) {
+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession =
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:AVMediaTypeMuxed
+   
position:AVCaptureDevicePositionUnspecified];
+devices_muxed = [captureDeviceDiscoverySession devices];
+} else {
+devices_muxed = [AVCaptureDevice 
devicesWithMediaType:AVMediaTypeMuxed];
+}
+} else {
+devices_muxed = [AVCaptureDevice 
devicesWithMediaType:AVMediaTypeMuxed];
+}
 
 ctx->num_video_devices = [devices count] + [devices_muxed count];
 
@@ -806,7 +836,20 @@ static int avf_read_header(AVFormatContext *s)
 #endif
 
 av_log(ctx, AV_LOG_INFO, "AVFoundation audio devices:\n");
-devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
+if (TARGET_OS_IPHONE) {
+if (@available(iOS 10.0, *)) {
+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession 
=
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:AVMediaTypeAudio
+   
position:AVCaptureDevicePositionUnspecified];
+devices = [captureDeviceDiscoverySession devices];
+} else {
+devices = [AVCaptureDevice 
devicesWithMediaType:AVMediaTypeAudio];
+}
+} else {
+devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
+}
 for (AVCaptureDevice *device in devices) {
 const char *name = [[device localizedName] UTF8String];
 int index  = [devices indexOfObject:device];
@@ -930,7 +973,21 @@ static int avf_read_header(AVFormatContext *s)
 
 // get audio device
 if (ctx->audio_device_index >= 0) {
-NSArray *devices = [AVCaptureDevice 
devicesWithMediaType:AVMediaTypeAudio];
+NSArray *devices = nil;
+if (TARGET_OS_IPHONE) {
+if (@available(iOS 10.0, *)) {
+AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession 
=
+[AVCaptureDeviceDiscoverySession
+
discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera]
+  mediaType:AVMediaTypeAudio
+   
position:AVCaptureDevicePositionUnspecified];
+devices = [captureDeviceDiscoverySession devices];
+} else {
+devices = [AVCaptureDevice 
devicesWithMediaType:AVMediaTypeAudio];
+}
+} else {
+devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
+}
 
 if (ctx->audio_device_index >= [devices count]) {
 av_log(ctx, AV_LOG_ERROR, "Invalid audio device index\n");
@@ -943,7 +1000,21 @@ static int avf_read_header(AVFormatContext *s)