PR #21361 opened by averne
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21361
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21361.patch


>From 3f0069bd9b3af1df0096a9bb312f74e69cc276c4 Mon Sep 17 00:00:00 2001
From: averne <[email protected]>
Date: Fri, 2 Jan 2026 19:38:06 +0100
Subject: [PATCH 1/3] lavu/videotoolbox: add 16-bit bayer format mapping

---
 configure                          | 2 ++
 libavutil/hwcontext_videotoolbox.c | 6 ++++++
 2 files changed, 8 insertions(+)

diff --git a/configure b/configure
index 301a3e5e3e..6db36a604a 100755
--- a/configure
+++ b/configure
@@ -2537,6 +2537,7 @@ TYPES_LIST="
     kCVPixelFormatType_444YpCbCr8BiPlanarVideoRange
     kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange
     kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange
+    kCVPixelFormatType_16VersatileBayer
     kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ
     kCVImageBufferTransferFunction_ITU_R_2100_HLG
     kCVImageBufferTransferFunction_Linear
@@ -6950,6 +6951,7 @@ enabled videotoolbox && {
     check_func_headers CoreVideo/CVPixelBuffer.h 
kCVPixelFormatType_444YpCbCr8BiPlanarVideoRange "-framework CoreVideo"
     check_func_headers CoreVideo/CVPixelBuffer.h 
kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange "-framework CoreVideo"
     check_func_headers CoreVideo/CVPixelBuffer.h 
kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange "-framework CoreVideo"
+    check_func_headers CoreVideo/CVPixelBuffer.h 
kCVPixelFormatType_16VersatileBayer "-framework CoreVideo"
     check_func_headers CoreVideo/CVImageBuffer.h 
kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ "-framework CoreVideo"
     check_func_headers CoreVideo/CVImageBuffer.h 
kCVImageBufferTransferFunction_ITU_R_2100_HLG "-framework CoreVideo"
     check_func_headers CoreVideo/CVImageBuffer.h 
kCVImageBufferTransferFunction_Linear "-framework CoreVideo"
diff --git a/libavutil/hwcontext_videotoolbox.c 
b/libavutil/hwcontext_videotoolbox.c
index 102fa485e5..419dc5b8c0 100644
--- a/libavutil/hwcontext_videotoolbox.c
+++ b/libavutil/hwcontext_videotoolbox.c
@@ -82,6 +82,9 @@ static const struct {
 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
     { kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange, false, AV_PIX_FMT_P416 
},
 #endif
+#if HAVE_KCVPIXELFORMATTYPE_16VERSATILEBAYER
+    { kCVPixelFormatType_16VersatileBayer,              false, 
AV_PIX_FMT_BAYER_RGGB16 },
+#endif
 };
 
 static const enum AVPixelFormat supported_formats[] = {
@@ -112,6 +115,9 @@ static const enum AVPixelFormat supported_formats[] = {
 #endif
 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
     AV_PIX_FMT_P416,
+#endif
+#if HAVE_KCVPIXELFORMATTYPE_16VERSATILEBAYER
+    AV_PIX_FMT_BAYER_RGGB16,
 #endif
     AV_PIX_FMT_BGRA,
 };
-- 
2.49.1


>From f040dd0ba16edb71d5aba456abfcc06f757161fd Mon Sep 17 00:00:00 2001
From: averne <[email protected]>
Date: Fri, 2 Jan 2026 19:43:12 +0100
Subject: [PATCH 2/3] lavc/videotoolbox: select 16-bit bayer format when
 applicable

---
 libavcodec/videotoolbox.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index 2cd22cba1a..a4d9cd355b 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -818,9 +818,11 @@ static CFDictionaryRef 
videotoolbox_buffer_attributes_create(int width,
     CFDictionarySetValue(buffer_attributes, kCVPixelBufferWidthKey, w);
     CFDictionarySetValue(buffer_attributes, kCVPixelBufferHeightKey, h);
 #if TARGET_OS_IPHONE
-    CFDictionarySetValue(buffer_attributes, 
kCVPixelBufferOpenGLESCompatibilityKey, kCFBooleanTrue);
+    CFDictionarySetValue(buffer_attributes, 
kCVPixelBufferOpenGLESCompatibilityKey,
+                         pix_fmt != kCVPixelFormatType_16VersatileBayer ? 
kCFBooleanTrue : kCFBooleanFalse);
 #else
-    CFDictionarySetValue(buffer_attributes, 
kCVPixelBufferIOSurfaceOpenGLTextureCompatibilityKey, kCFBooleanTrue);
+    CFDictionarySetValue(buffer_attributes, 
kCVPixelBufferIOSurfaceOpenGLTextureCompatibilityKey,
+                         pix_fmt != kCVPixelFormatType_16VersatileBayer ? 
kCFBooleanTrue : kCFBooleanFalse);
 #endif
 
     CFRelease(io_surface_properties);
@@ -1200,6 +1202,11 @@ static enum AVPixelFormat 
videotoolbox_best_pixel_format(AVCodecContext *avctx)
     if (descriptor->flags & AV_PIX_FMT_FLAG_ALPHA)
         return (depth > 8) ? AV_PIX_FMT_AYUV64 : AV_PIX_FMT_AYUV;
 
+#if HAVE_KCVPIXELFORMATTYPE_16VERSATILEBAYER
+    if (descriptor->flags & AV_PIX_FMT_FLAG_BAYER)
+        return AV_PIX_FMT_BAYER_RGGB16;
+#endif
+
 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
     if (depth > 10)
         return descriptor->log2_chroma_w == 0 ? AV_PIX_FMT_P416 : 
AV_PIX_FMT_P216;
-- 
2.49.1


>From 3987f6bbe6b0b07e857a82b75e9d8d12ff3b8c31 Mon Sep 17 00:00:00 2001
From: averne <[email protected]>
Date: Fri, 2 Jan 2026 19:39:31 +0100
Subject: [PATCH 3/3] lavc: add a ProRes RAW VideoToolboox hwaccel

---
 libavcodec/hwaccels.h     |  1 +
 libavcodec/prores_raw.c   |  6 +++++
 libavcodec/videotoolbox.c | 54 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h
index 3de191288a..35c5d57377 100644
--- a/libavcodec/hwaccels.h
+++ b/libavcodec/hwaccels.h
@@ -69,6 +69,7 @@ extern const struct FFHWAccel ff_mpeg4_vdpau_hwaccel;
 extern const struct FFHWAccel ff_mpeg4_videotoolbox_hwaccel;
 extern const struct FFHWAccel ff_prores_videotoolbox_hwaccel;
 extern const struct FFHWAccel ff_prores_vulkan_hwaccel;
+extern const struct FFHWAccel ff_prores_raw_videotoolbox_hwaccel;
 extern const struct FFHWAccel ff_prores_raw_vulkan_hwaccel;
 extern const struct FFHWAccel ff_vc1_d3d11va_hwaccel;
 extern const struct FFHWAccel ff_vc1_d3d11va2_hwaccel;
diff --git a/libavcodec/prores_raw.c b/libavcodec/prores_raw.c
index 8be566ed36..f9a688760c 100644
--- a/libavcodec/prores_raw.c
+++ b/libavcodec/prores_raw.c
@@ -313,6 +313,9 @@ static enum AVPixelFormat get_pixel_format(AVCodecContext 
*avctx,
                                            enum AVPixelFormat pix_fmt)
 {
     enum AVPixelFormat pix_fmts[] = {
+#if CONFIG_PRORES_RAW_VIDEOTOOLBOX_HWACCEL
+        AV_PIX_FMT_VIDEOTOOLBOX,
+#endif
 #if CONFIG_PRORES_RAW_VULKAN_HWACCEL
         AV_PIX_FMT_VULKAN,
 #endif
@@ -548,6 +551,9 @@ const FFCodec ff_prores_raw_decoder = {
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP |
                       FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
     .hw_configs     = (const AVCodecHWConfigInternal *const []) {
+#if CONFIG_PRORES_RAW_VIDEOTOOLBOX_HWACCEL
+        HWACCEL_VIDEOTOOLBOX(prores_raw),
+#endif
 #if CONFIG_PRORES_RAW_VULKAN_HWACCEL
         HWACCEL_VULKAN(prores_raw),
 #endif
diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index a4d9cd355b..af7d297b58 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -37,6 +37,7 @@
 #include "hwaccel_internal.h"
 #include "mpegvideo.h"
 #include "proresdec.h"
+#include "prores_raw.h"
 #include <Availability.h>
 #include <AvailabilityMacros.h>
 #include <TargetConditionals.h>
@@ -948,6 +949,17 @@ static int videotoolbox_start(AVCodecContext *avctx)
             break;
         }
         break;
+    case AV_CODEC_ID_PRORES_RAW :
+        switch (avctx->codec_tag) {
+        default:
+            av_log(avctx, AV_LOG_WARNING, "Unknown prores raw profile %d\n", 
avctx->codec_tag);
+        // fall-through
+        case MKTAG('a', 'p', 'r', 'n'): // kCMVideoCodecType_AppleProResRAW
+        case MKTAG('a', 'p', 'r', 'h'): // kCMVideoCodecType_AppleProResRAWHQ
+            videotoolbox->cm_codec_type = av_bswap32(avctx->codec_tag);
+            break;
+        }
+        break;
     case AV_CODEC_ID_VP9 :
         videotoolbox->cm_codec_type = kCMVideoCodecType_VP9;
         break;
@@ -959,7 +971,7 @@ static int videotoolbox_start(AVCodecContext *avctx)
     }
 
 #if defined(MAC_OS_X_VERSION_10_9) && !TARGET_OS_IPHONE && 
(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9) && 
AV_HAS_BUILTIN(__builtin_available)
-    if (avctx->codec_id == AV_CODEC_ID_PRORES) {
+    if (avctx->codec_id == AV_CODEC_ID_PRORES || avctx->codec_id == 
AV_CODEC_ID_PRORES_RAW) {
         if (__builtin_available(macOS 10.9, *)) {
             VTRegisterProfessionalVideoWorkflowVideoDecoders();
         }
@@ -1191,6 +1203,31 @@ static int videotoolbox_prores_end_frame(AVCodecContext 
*avctx)
     return ff_videotoolbox_common_end_frame(avctx, frame);
 }
 
+static int videotoolbox_prores_raw_start_frame(AVCodecContext *avctx,
+                                               const AVBufferRef *buffer_ref,
+                                               const uint8_t *buffer,
+                                               uint32_t size)
+{
+    VTContext *vtctx = avctx->internal->hwaccel_priv_data;
+
+    return ff_videotoolbox_buffer_copy(vtctx, buffer, size);
+}
+
+static int videotoolbox_prores_raw_decode_slice(AVCodecContext *avctx,
+                                                const uint8_t *buffer,
+                                                uint32_t size)
+{
+    return 0;
+}
+
+static int videotoolbox_prores_raw_end_frame(AVCodecContext *avctx)
+{
+    ProResRAWContext *s = avctx->priv_data;
+    AVFrame *frame = s->frame;
+
+    return ff_videotoolbox_common_end_frame(avctx, frame);
+}
+
 static enum AVPixelFormat videotoolbox_best_pixel_format(AVCodecContext 
*avctx) {
     int depth;
     const AVPixFmtDescriptor *descriptor = 
av_pix_fmt_desc_get(avctx->sw_pix_fmt);
@@ -1457,4 +1494,19 @@ const FFHWAccel ff_prores_videotoolbox_hwaccel = {
     .priv_data_size = sizeof(VTContext),
 };
 
+const FFHWAccel ff_prores_raw_videotoolbox_hwaccel = {
+    .p.name         = "prores_raw_videotoolbox",
+    .p.type         = AVMEDIA_TYPE_VIDEO,
+    .p.id           = AV_CODEC_ID_PRORES_RAW,
+    .p.pix_fmt      = AV_PIX_FMT_VIDEOTOOLBOX,
+    .alloc_frame    = ff_videotoolbox_alloc_frame,
+    .start_frame    = videotoolbox_prores_raw_start_frame,
+    .decode_slice   = videotoolbox_prores_raw_decode_slice,
+    .end_frame      = videotoolbox_prores_raw_end_frame,
+    .frame_params   = ff_videotoolbox_frame_params,
+    .init           = ff_videotoolbox_common_init,
+    .uninit         = ff_videotoolbox_uninit,
+    .priv_data_size = sizeof(VTContext),
+};
+
 #endif /* CONFIG_VIDEOTOOLBOX */
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to