ffmpeg | branch: master | Lynne <d...@lynne.ee> | Fri Mar 14 15:07:45 2025 
+0100| [82864c21112157951ce91b4430a9018edd02f5ab] | committer: Lynne

vulkan_hevc: use VK_KHR_video_maintenance2 if available

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

 libavcodec/vulkan_hevc.c | 49 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 6 deletions(-)

diff --git a/libavcodec/vulkan_hevc.c b/libavcodec/vulkan_hevc.c
index a5bcd88e2d..ca2db20ca5 100644
--- a/libavcodec/vulkan_hevc.c
+++ b/libavcodec/vulkan_hevc.c
@@ -715,15 +715,18 @@ static int vk_hevc_start_frame(AVCodecContext          
*avctx,
     int err;
     HEVCContext *h = avctx->priv_data;
     HEVCLayerContext *l = &h->layers[h->cur_layer];
-    HEVCFrame *pic = h->cur_frame;
     FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data;
+    FFVulkanDecodeShared *ctx = dec->shared_ctx;
+
+    HEVCFrame *pic = h->cur_frame;
     HEVCVulkanDecodePicture *hp = pic->hwaccel_picture_private;
     FFVulkanDecodePicture *vp = &hp->vp;
     const HEVCPPS *pps = h->pps;
     const HEVCSPS *sps = pps->sps;
     int nb_refs = 0;
 
-    if (!dec->session_params) {
+    if (!dec->session_params &&
+        !(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) {
         err = vk_hevc_create_params(avctx, &dec->session_params);
         if (err < 0)
             return err;
@@ -851,6 +854,8 @@ static int vk_hevc_end_frame(AVCodecContext *avctx)
 {
     const HEVCContext *h = avctx->priv_data;
     FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data;
+    FFVulkanDecodeShared *ctx = dec->shared_ctx;
+
     HEVCFrame *pic = h->cur_frame;
     HEVCVulkanDecodePicture *hp = pic->hwaccel_picture_private;
     FFVulkanDecodePicture *vp = &hp->vp;
@@ -858,13 +863,45 @@ static int vk_hevc_end_frame(AVCodecContext *avctx)
     AVFrame *rav[HEVC_MAX_REFS] = { 0 };
     int err;
 
+    const HEVCPPS *pps = h->pps;
+    const HEVCSPS *sps = pps->sps;
+
+#ifdef VK_KHR_video_maintenance2
+    HEVCHeaderPPS vkpps_p;
+    StdVideoH265PictureParameterSet vkpps;
+    HEVCHeaderSPS vksps_p;
+    StdVideoH265SequenceParameterSet vksps;
+    HEVCHeaderVPSSet vkvps_ps[HEVC_MAX_SUB_LAYERS];
+    HEVCHeaderVPS vkvps_p;
+    StdVideoH265VideoParameterSet vkvps;
+    VkVideoDecodeH265InlineSessionParametersInfoKHR h265_params;
+
+    if (ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2) {
+        set_pps(pps, sps, &vkpps_p.scaling, &vkpps, &vkpps_p.pal);
+        set_sps(sps, pps->sps_id, &vksps_p.scaling, &vksps_p.vui_header,
+                &vksps_p.vui, &vksps, vksps_p.nal_hdr,
+                vksps_p.vcl_hdr, &vksps_p.ptl, &vksps_p.dpbm,
+                &vksps_p.pal, vksps_p.str, &vksps_p.ltr);
+
+        vkvps_p.sls = vkvps_ps;
+        set_vps(sps->vps, &vkvps, &vkvps_p.ptl, &vkvps_p.dpbm,
+                vkvps_p.hdr, vkvps_p.sls);
+
+        h265_params = (VkVideoDecodeH265InlineSessionParametersInfoKHR) {
+            .sType = 
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR,
+            .pStdSPS = &vksps,
+            .pStdPPS = &vkpps,
+            .pStdVPS = &vkvps,
+        };
+        hp->h265_pic_info.pNext = &h265_params;
+    }
+#endif
+
     if (!hp->h265_pic_info.sliceSegmentCount)
         return 0;
 
-    if (!dec->session_params) {
-        const HEVCPPS *pps = h->pps;
-        const HEVCSPS *sps = pps->sps;
-
+    if (!dec->session_params &&
+        !(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) {
         if (!pps) {
             unsigned int pps_id = h->sh.pps_id;
             if (pps_id < HEVC_MAX_PPS_COUNT && h->ps.pps_list[pps_id] != NULL)

_______________________________________________
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