diff mbox series

[FFmpeg-devel] avfoundation: Fix version checks

Message ID 20231215101112.83475-1-martin@martin.st
State Accepted
Commit 081d69b78df8d1f38f99faaa9b9598592c82303b
Headers show
Series [FFmpeg-devel] avfoundation: Fix version checks | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Martin Storsjö Dec. 15, 2023, 10:11 a.m. UTC
<OS>_VERSION_MAX_ALLOWED indicates what version is available in
the SDK, while <OS>_VERSION_MIN_REQUIRED is the version we can
assume is available, i.e. similar to what is set with e.g.
-miphoneos-version-min on the command line.

This fixes build errors like these:

src/libavdevice/avfoundation.m:788:37: error: 'AVCaptureDeviceTypeContinuityCamera' is only available on macOS 14.0 or newer [-Werror,-Wunguarded-availability-new]
            [deviceTypes addObject: AVCaptureDeviceTypeContinuityCamera];
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVCaptureDevice.h:551:38: note: 'AVCaptureDeviceTypeContinuityCamera' has been marked as being introduced in macOS 14.0 here, but the deployment target is macOS 13.0.0
AVF_EXPORT AVCaptureDeviceType const AVCaptureDeviceTypeContinuityCamera API_AVAILABLE(macos(14.0), ios(17.0), macCatalyst(17.0), tvos(17.0)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos);
                                     ^

Alternatively, we could use these more modern APIs, if enclosed
in suitable @available() checks.
---
 libavdevice/avfoundation.m | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

Comments

Thilo Borgmann Dec. 15, 2023, 10:35 a.m. UTC | #1
Am 15.12.23 um 11:11 schrieb Martin Storsjö:
> <OS>_VERSION_MAX_ALLOWED indicates what version is available in
> the SDK, while <OS>_VERSION_MIN_REQUIRED is the version we can
> assume is available, i.e. similar to what is set with e.g.
> -miphoneos-version-min on the command line.
> 
> This fixes build errors like these:
> 
> src/libavdevice/avfoundation.m:788:37: error: 'AVCaptureDeviceTypeContinuityCamera' is only available on macOS 14.0 or newer [-Werror,-Wunguarded-availability-new]
>              [deviceTypes addObject: AVCaptureDeviceTypeContinuityCamera];
>                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVCaptureDevice.h:551:38: note: 'AVCaptureDeviceTypeContinuityCamera' has been marked as being introduced in macOS 14.0 here, but the deployment target is macOS 13.0.0
> AVF_EXPORT AVCaptureDeviceType const AVCaptureDeviceTypeContinuityCamera API_AVAILABLE(macos(14.0), ios(17.0), macCatalyst(17.0), tvos(17.0)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos);
>                                       ^
> 
> Alternatively, we could use these more modern APIs, if enclosed
> in suitable @available() checks.
> ---
>   libavdevice/avfoundation.m | 20 ++++++++++----------
>   1 file changed, 10 insertions(+), 10 deletions(-)

Pushed, thanks!

-Thilo
Zhao Zhili Dec. 15, 2023, 11:07 a.m. UTC | #2
> On Dec 15, 2023, at 18:11, Martin Storsjö <martin@martin.st> wrote:
> 
> <OS>_VERSION_MAX_ALLOWED indicates what version is available in
> the SDK, while <OS>_VERSION_MIN_REQUIRED is the version we can
> assume is available, i.e. similar to what is set with e.g.
> -miphoneos-version-min on the command line.
>                                     ^

I think we need some utils for version check on Apple’s multiple target OS. It’s hard
to get it right and very lengthy to write. Ping Marvin since he is expert on this
subject.

And can we setup a group of CI for these platforms?
Martin Storsjö Dec. 15, 2023, 11:32 a.m. UTC | #3
On Fri, 15 Dec 2023, Zhao Zhili wrote:

>
>> On Dec 15, 2023, at 18:11, Martin Storsjö <martin@martin.st> wrote:
>> 
>> <OS>_VERSION_MAX_ALLOWED indicates what version is available in
>> the SDK, while <OS>_VERSION_MIN_REQUIRED is the version we can
>> assume is available, i.e. similar to what is set with e.g.
>> -miphoneos-version-min on the command line.
>>                                     ^
>
> I think we need some utils for version check on Apple’s multiple target OS. It’s hard
> to get it right and very lengthy to write. Ping Marvin since he is expert on this
> subject.
>
> And can we setup a group of CI for these platforms?

That would be good.

We do have a mac mini running fate tests; it would probably be good to add 
test configurations that build for both macOS and iOS, for both whatever 
the latest version in the installed SDK is, and with an old deployment 
target (those builds often get broken).

(And then, someone would need to check the FATE status as well.)

// Martin
Thilo Borgmann Dec. 15, 2023, 11:41 a.m. UTC | #4
Am 15.12.23 um 12:32 schrieb Martin Storsjö via ffmpeg-devel:
> On Fri, 15 Dec 2023, Zhao Zhili wrote:
> 
>>
>>> On Dec 15, 2023, at 18:11, Martin Storsjö <martin@martin.st> wrote:
>>>
>>> <OS>_VERSION_MAX_ALLOWED indicates what version is available in
>>> the SDK, while <OS>_VERSION_MIN_REQUIRED is the version we can
>>> assume is available, i.e. similar to what is set with e.g.
>>> -miphoneos-version-min on the command line.
>>>                                     ^
>>
>> I think we need some utils for version check on Apple’s multiple target OS. It’s hard
>> to get it right and very lengthy to write. Ping Marvin since he is expert on this
>> subject.
>>
>> And can we setup a group of CI for these platforms?
> 
> That would be good.
> 
> We do have a mac mini running fate tests; it would probably be good to add test configurations that build for both macOS and iOS, for both whatever the latest version in the installed SDK is, and with an old deployment target (those builds often get broken).
> 
> (And then, someone would need to check the FATE status as well.)

That would be great!
Fate on the M1 discovered the other bug about the availability macro in audiotoolbox only because it used the 11.3 SDK on a 12.0 OS.

Marvin knows this OS specific stuff way better than me, it would be great if he wanted to set it up more sophisticated :)

-Thilo
Zhao Zhili Dec. 15, 2023, 11:57 a.m. UTC | #5
> On Dec 15, 2023, at 19:41, Thilo Borgmann via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> wrote:
> 
> Am 15.12.23 um 12:32 schrieb Martin Storsjö via ffmpeg-devel:
>> On Fri, 15 Dec 2023, Zhao Zhili wrote:
>>> 
>>>> On Dec 15, 2023, at 18:11, Martin Storsjö <martin@martin.st> wrote:
>>>> 
>>>> <OS>_VERSION_MAX_ALLOWED indicates what version is available in
>>>> the SDK, while <OS>_VERSION_MIN_REQUIRED is the version we can
>>>> assume is available, i.e. similar to what is set with e.g.
>>>> -miphoneos-version-min on the command line.
>>>>                                     ^
>>> 
>>> I think we need some utils for version check on Apple’s multiple target OS. It’s hard
>>> to get it right and very lengthy to write. Ping Marvin since he is expert on this
>>> subject.
>>> 
>>> And can we setup a group of CI for these platforms?
>> That would be good.
>> We do have a mac mini running fate tests; it would probably be good to add test configurations that build for both macOS and iOS, for both whatever the latest version in the installed SDK is, and with an old deployment target (those builds often get broken).
>> (And then, someone would need to check the FATE status as well.)
> 
> That would be great!
> Fate on the M1 discovered the other bug about the availability macro in audiotoolbox only because it used the 11.3 SDK on a 12.0 OS.
> 
> Marvin knows this OS specific stuff way better than me, it would be great if he wanted to set it up more sophisticated :)


Two other similar bugs:

https://trac.ffmpeg.org/ticket/10690
https://trac.ffmpeg.org/ticket/10695

It’s easy to workaround by !TARGET_OS_IPHONE, but I want to enable it for as many platforms as possible.
I haven’t got the time to read Marvin’s article and figure out how to do it properly yet.

> 
> -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-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index c1432ec80f..a0ef87edff 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -762,41 +762,41 @@  static int get_audio_config(AVFormatContext *s)
 }
 
 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))
+#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_MAX_ALLOWED >= 100000)
+        #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000)
             [deviceTypes addObject: AVCaptureDeviceTypeBuiltInDualCamera];
             [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTelephotoCamera];
         #endif
-        #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110100)
+        #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110100)
             [deviceTypes addObject: AVCaptureDeviceTypeBuiltInTrueDepthCamera];
         #endif
-        #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000)
+        #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_MAX_ALLOWED >= 130000)
+        #if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= 130000)
             [deviceTypes addObject: AVCaptureDeviceTypeDeskViewCamera];
         #endif
-        #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= 150400)
+        #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 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))
+        #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_MAX_ALLOWED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000))
+        #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_MAX_ALLOWED >= 170000 || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 140000))
+        #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_MAX_ALLOWED < 140000)
+        #elif (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 140000)
             deviceTypes = [NSMutableArray arrayWithArray:@[AVCaptureDeviceTypeExternalUnknown]];
         #else
             return nil;