[FFmpeg-cvslog] vulkan_hevc: switch from a buffer pool to a malloc and simplify

Lynne git at videolan.org
Fri Sep 15 18:37:23 EEST 2023


ffmpeg | branch: master | Lynne <dev at lynne.ee> | Fri Sep 15 01:51:49 2023 +0200| [552a5fa496933c2679cac6774e483bee3f5c2c53] | committer: Lynne

vulkan_hevc: switch from a buffer pool to a malloc and simplify

Simpler and more robust now that contexts are not shared between threads.

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

 libavcodec/vulkan_decode.c |  2 +-
 libavcodec/vulkan_decode.h |  4 ++--
 libavcodec/vulkan_hevc.c   | 52 +++++++++++++++-------------------------------
 3 files changed, 20 insertions(+), 38 deletions(-)

diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c
index 534a76edda..21bebb1677 100644
--- a/libavcodec/vulkan_decode.c
+++ b/libavcodec/vulkan_decode.c
@@ -1104,7 +1104,7 @@ int ff_vk_decode_uninit(AVCodecContext *avctx)
     /* Wait on and free execution pool */
     ff_vk_exec_pool_free(&ctx->s, &dec->exec_pool);
 
-    av_buffer_pool_uninit(&dec->tmp_pool);
+    av_freep(&dec->hevc_headers);
     av_buffer_unref(&dec->session_params);
     av_buffer_unref(&dec->shared_ref);
     av_freep(&dec->slice_off);
diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h
index abf08a98bf..71ba3dbd84 100644
--- a/libavcodec/vulkan_decode.h
+++ b/libavcodec/vulkan_decode.h
@@ -64,8 +64,8 @@ typedef struct FFVulkanDecodeContext {
     uint32_t frame_id_alloc_mask; /* For AV1 only */
 
     /* Thread-local state below */
-    AVBufferPool *tmp_pool; /* Pool for temporary data, if needed (HEVC) */
-    size_t tmp_pool_ele_size;
+    struct HEVCHeaderSet *hevc_headers;
+    size_t hevc_headers_size;
 
     uint32_t                       *slice_off;
     unsigned int                    slice_off_max;
diff --git a/libavcodec/vulkan_hevc.c b/libavcodec/vulkan_hevc.c
index ef371bda67..52f223ceb2 100644
--- a/libavcodec/vulkan_hevc.c
+++ b/libavcodec/vulkan_hevc.c
@@ -68,49 +68,33 @@ typedef struct HEVCHeaderSet {
     HEVCHeaderVPS *hvps;
 } HEVCHeaderSet;
 
-static int get_data_set_buf(FFVulkanDecodeContext *s, AVBufferRef **data_buf,
-                            int nb_vps, AVBufferRef * const vps_list[HEVC_MAX_VPS_COUNT])
+static int alloc_hevc_header_structs(FFVulkanDecodeContext *s,
+                                     int nb_vps,
+                                     AVBufferRef * const vps_list[HEVC_MAX_VPS_COUNT])
 {
     uint8_t *data_ptr;
     HEVCHeaderSet *hdr;
 
-    size_t base_size = sizeof(StdVideoH265SequenceParameterSet)*HEVC_MAX_SPS_COUNT +
-                       sizeof(HEVCHeaderSPS)*HEVC_MAX_SPS_COUNT +
-                       sizeof(StdVideoH265PictureParameterSet)*HEVC_MAX_PPS_COUNT +
-                       sizeof(HEVCHeaderPPS)*HEVC_MAX_PPS_COUNT +
-                       sizeof(StdVideoH265VideoParameterSet)*HEVC_MAX_VPS_COUNT +
-                       sizeof(HEVCHeaderVPS *);
-
-    size_t vps_size = sizeof(StdVideoH265ProfileTierLevel) +
-                      sizeof(StdVideoH265DecPicBufMgr) +
-                      sizeof(StdVideoH265HrdParameters)*HEVC_MAX_LAYER_SETS +
-                      sizeof(HEVCHeaderVPSSet *);
-
-    size_t buf_size = base_size + vps_size*nb_vps;
-
+    size_t buf_size = sizeof(HEVCHeaderSet) + nb_vps*sizeof(HEVCHeaderVPS);
     for (int i = 0; i < nb_vps; i++) {
         const HEVCVPS *vps = (const HEVCVPS *)vps_list[i]->data;
         buf_size += sizeof(HEVCHeaderVPSSet)*vps->vps_num_hrd_parameters;
     }
 
-    if (buf_size > s->tmp_pool_ele_size) {
-        av_buffer_pool_uninit(&s->tmp_pool);
-        s->tmp_pool_ele_size = 0;
-        s->tmp_pool = av_buffer_pool_init(buf_size, NULL);
-        if (!s->tmp_pool)
+    if (buf_size > s->hevc_headers_size) {
+        av_freep(&s->hevc_headers);
+        s->hevc_headers_size = 0;
+        s->hevc_headers = av_mallocz(buf_size);
+        if (!s->hevc_headers)
             return AVERROR(ENOMEM);
-        s->tmp_pool_ele_size = buf_size;
+        s->hevc_headers_size = buf_size;
     }
 
-    *data_buf = av_buffer_pool_get(s->tmp_pool);
-    if (!(*data_buf))
-        return AVERROR(ENOMEM);
-
-    /* Setup pointers */
-    data_ptr = (*data_buf)->data;
-    hdr = (HEVCHeaderSet *)data_ptr;
-    hdr->hvps = (HEVCHeaderVPS *)(data_ptr + base_size);
-    data_ptr += base_size + vps_size*nb_vps;
+    /* Setup struct pointers */
+    hdr = s->hevc_headers;
+    data_ptr = (uint8_t *)hdr;
+    hdr->hvps = (HEVCHeaderVPS *)(data_ptr + sizeof(HEVCHeaderSet));
+    data_ptr += sizeof(HEVCHeaderSet) + nb_vps*sizeof(HEVCHeaderVPS);
     for (int i = 0; i < nb_vps; i++) {
         const HEVCVPS *vps = (const HEVCVPS *)vps_list[i]->data;
         hdr->hvps[i].sls = (HEVCHeaderVPSSet *)data_ptr;
@@ -672,17 +656,16 @@ static int vk_hevc_create_params(AVCodecContext *avctx, AVBufferRef **buf)
     };
 
     int nb_vps = 0;
-    AVBufferRef *data_set;
     HEVCHeaderSet *hdr;
 
     for (int i = 0; h->ps.vps_list[i]; i++)
         nb_vps++;
 
-    err = get_data_set_buf(dec, &data_set, nb_vps, h->ps.vps_list);
+    err = alloc_hevc_header_structs(dec, nb_vps, h->ps.vps_list);
     if (err < 0)
         return err;
 
-    hdr = (HEVCHeaderSet *)data_set->data;
+    hdr = dec->hevc_headers;
 
     h265_params_info.pStdSPSs = hdr->sps;
     h265_params_info.pStdPPSs = hdr->pps;
@@ -719,7 +702,6 @@ static int vk_hevc_create_params(AVCodecContext *avctx, AVBufferRef **buf)
     h265_params.maxStdVPSCount = h265_params_info.stdVPSCount;
 
     err = ff_vk_decode_create_params(buf, avctx, ctx, &session_params_create);
-    av_buffer_unref(&data_set);
     if (err < 0)
         return err;
 



More information about the ffmpeg-cvslog mailing list