[FFmpeg-devel] [PATCH 2/2] lavc/videotoolboxenc: Get the encoder supported properties

Jun Zhao mypopydev at gmail.com
Mon Sep 4 06:53:40 EEST 2023


Get the encoder supported properties list, it will be used for
feature support checks.

Signed-off-by: Jun Zhao <barryjzhao at tencent.com>
---
 libavcodec/videotoolboxenc.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index 5633640a30..8e70915225 100644
--- a/libavcodec/videotoolboxenc.c
+++ b/libavcodec/videotoolboxenc.c
@@ -232,6 +232,7 @@ typedef struct VTEncContext {
     AVClass *class;
     enum AVCodecID codec_id;
     VTCompressionSessionRef session;
+    CFDictionaryRef supported_props;
     CFStringRef ycbcr_matrix;
     CFStringRef color_primaries;
     CFStringRef transfer_function;
@@ -1110,6 +1111,18 @@ static int vtenc_create_encoder(AVCodecContext   *avctx,
         return AVERROR_EXTERNAL;
     }
 
+    status = VTCopySupportedPropertyDictionaryForEncoder(avctx->width,
+                                                         avctx->height,
+                                                         codec_type,
+                                                         enc_info,
+                                                         NULL,
+                                                         &vtctx->supported_props);
+
+    if (status != noErr) {
+        av_log(avctx, AV_LOG_ERROR,"Error retrieving the supported property dictionary err=%"PRId64"", (int64_t)status);
+        return AVERROR_EXTERNAL;
+    }
+
     // Dump the init encoder
     {
         CFStringRef encoderID = NULL;
@@ -1656,6 +1669,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx)
     if (vtctx->profile == FF_PROFILE_UNKNOWN)
         vtctx->profile = avctx->profile;
     vtctx->session = NULL;
+    vtctx->supported_props = NULL;
     status = vtenc_configure_encoder(avctx);
     if (status) return status;
 
@@ -2426,6 +2440,11 @@ static int create_cv_pixel_buffer(AVCodecContext   *avctx,
         if (vtstatus == kVTInvalidSessionErr) {
             CFRelease(vtctx->session);
             vtctx->session = NULL;
+            if (vtctx->supported_props) {
+                CFRelease(vtctx->supported_props);
+                vtctx->supported_props = NULL;
+            }
+
             status = vtenc_configure_encoder(avctx);
             if (status == 0)
                 pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->session);
@@ -2685,6 +2704,10 @@ pe_cleanup:
         CFRelease(vtctx->session);
 
     vtctx->session = NULL;
+    if (vtctx->supported_props) {
+        CFRelease(vtctx->supported_props);
+        vtctx->supported_props = NULL;
+    }
     vtctx->frame_ct_out = 0;
 
     av_assert0(status != 0 || (avctx->extradata && avctx->extradata_size > 0));
@@ -2709,6 +2732,10 @@ static av_cold int vtenc_close(AVCodecContext *avctx)
     pthread_mutex_destroy(&vtctx->lock);
     CFRelease(vtctx->session);
     vtctx->session = NULL;
+    if (vtctx->supported_props) {
+        CFRelease(vtctx->supported_props);
+        vtctx->supported_props = NULL;
+    }
 
     if (vtctx->color_primaries) {
         CFRelease(vtctx->color_primaries);
-- 
2.25.1



More information about the ffmpeg-devel mailing list