ffmpeg | branch: master | Marvin Scholz <epira...@gmail.com> | Tue Jul 23 
11:10:44 2024 +0200| [ca7fcf50891997eb95b4bf6d5cd4e2446e8c8631] | committer: 
Zhao Zhili

avutil/hwcontext_videotoolbox: Fix build with older SDKs

The previous fix was not sufficient.
To make things easier to reason about, split the function and
add the guards there instead of complicating the call site more.

Signed-off-by: Zhao Zhili <zhiliz...@tencent.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ca7fcf50891997eb95b4bf6d5cd4e2446e8c8631
---

 libavutil/hwcontext_videotoolbox.c | 51 +++++++++++++++++++++++++++++---------
 1 file changed, 39 insertions(+), 12 deletions(-)

diff --git a/libavutil/hwcontext_videotoolbox.c 
b/libavutil/hwcontext_videotoolbox.c
index ab7556936d..1794459943 100644
--- a/libavutil/hwcontext_videotoolbox.c
+++ b/libavutil/hwcontext_videotoolbox.c
@@ -532,6 +532,37 @@ CFStringRef av_map_videotoolbox_color_trc_from_av(enum 
AVColorTransferCharacteri
     }
 }
 
+/**
+ * Copy all attachments for the specified mode from the given buffer.
+ */
+static CFDictionaryRef vt_cv_buffer_copy_attachments(CVBufferRef buffer,
+                                                     CVAttachmentMode 
attachment_mode)
+{
+    CFDictionaryRef dict;
+
+    // Check that our SDK is at least macOS 12 / iOS 15 / tvOS 15
+    #if (TARGET_OS_OSX  && defined(__MAC_12_0)    && 
__MAC_OS_X_VERSION_MAX_ALLOWED  >= __MAC_12_0)     || \
+        (TARGET_OS_IOS  && defined(__IPHONE_15_0) && 
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0)  || \
+        (TARGET_OS_TV   && defined(__TVOS_15_0)   && 
__TV_OS_VERSION_MAX_ALLOWED     >= __TVOS_15_0)
+        // On recent enough versions, just use the respective API
+        if (__builtin_available(macOS 12.0, iOS 15.0, tvOS 15.0, *))
+            return CVBufferCopyAttachments(buffer, attachment_mode);
+    #endif
+
+    // Check that the target is lower than macOS 12 / iOS 15 / tvOS 15
+    // else this would generate a deprecation warning and anyway never run 
because
+    // the runtime availability check above would be always true.
+    #if (TARGET_OS_OSX  && (!defined(__MAC_12_0)    || 
__MAC_OS_X_VERSION_MIN_REQUIRED  < __MAC_12_0))     || \
+        (TARGET_OS_IOS  && (!defined(__IPHONE_15_0) || 
__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_15_0))  || \
+        (TARGET_OS_TV   && (!defined(__TVOS_15_0)   || 
__TV_OS_VERSION_MIN_REQUIRED     < __TVOS_15_0))
+        // Fallback on SDKs or runtime versions < macOS 12 / iOS 15 / tvOS 15
+        dict = CVBufferGetAttachments(buffer, attachment_mode);
+        return (dict) ? CFDictionaryCreateCopy(NULL, dict) : NULL;
+    #else
+        return NULL; // Impossible, just make the compiler happy
+    #endif
+}
+
 static int vt_pixbuf_set_colorspace(void *log_ctx,
                                     CVPixelBufferRef pixbuf, const AVFrame 
*src)
 {
@@ -591,24 +622,20 @@ static int vt_pixbuf_set_colorspace(void *log_ctx,
 #if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 100800) || \
     (TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000)
     if (__builtin_available(macOS 10.8, iOS 10, *)) {
-        CFDictionaryRef attachments = NULL;
-        if (__builtin_available(macOS 12.0, iOS 15.0, *))
-            attachments = CVBufferCopyAttachments(pixbuf, 
kCVAttachmentMode_ShouldPropagate);
-#if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED <= 120000) || \
-    (TARGET_OS_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED <= 150000)
-        else {
-            CFDictionaryRef tmp = CVBufferGetAttachments(pixbuf, 
kCVAttachmentMode_ShouldPropagate);
-            if (tmp)
-                attachments = CFDictionaryCreateCopy(NULL, tmp);
-        }
-#endif
+        CFDictionaryRef attachments =
+            vt_cv_buffer_copy_attachments(pixbuf, 
kCVAttachmentMode_ShouldPropagate);
+
         if (attachments) {
-            colorspace = 
CVImageBufferCreateColorSpaceFromAttachments(attachments);
+            colorspace =
+                CVImageBufferCreateColorSpaceFromAttachments(attachments);
             CFRelease(attachments);
         }
     }
 #endif
 
+    // Done outside the above preprocessor code and if's so that
+    // in any case a wrong kCVImageBufferCGColorSpaceKey is removed
+    // if the above code is not used or fails.
     if (colorspace) {
         CVBufferSetAttachment(pixbuf, kCVImageBufferCGColorSpaceKey,
             colorspace, kCVAttachmentMode_ShouldPropagate);

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

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

Reply via email to