ffmpeg | branch: master | Lynne <d...@lynne.ee> | Fri Mar 14 13:41:10 2025 
+0100| [53f156bccc4886b687f6433ed5e69cf827e9f666] | committer: Lynne

vulkan_h264: use VK_KHR_video_maintenance2 if available

This avoids having to copy and update the entire SPS/PPS stack.

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

 libavcodec/vulkan_h264.c | 36 ++++++++++++++++++++++++++++++++----
 1 file changed, 32 insertions(+), 4 deletions(-)

diff --git a/libavcodec/vulkan_h264.c b/libavcodec/vulkan_h264.c
index 71cf2c3ad7..dc8b542e01 100644
--- a/libavcodec/vulkan_h264.c
+++ b/libavcodec/vulkan_h264.c
@@ -365,12 +365,15 @@ static int vk_h264_start_frame(AVCodecContext          
*avctx,
     int err;
     int dpb_slot_index = 0;
     H264Context *h = avctx->priv_data;
-    H264Picture *pic = h->cur_pic_ptr;
     FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data;
+    FFVulkanDecodeShared *ctx = dec->shared_ctx;
+
+    H264Picture *pic = h->cur_pic_ptr;
     H264VulkanDecodePicture *hp = pic->hwaccel_picture_private;
     FFVulkanDecodePicture *vp = &hp->vp;
 
-    if (!dec->session_params) {
+    if (!dec->session_params &&
+        !(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) {
         err = vk_h264_create_params(avctx, &dec->session_params);
         if (err < 0)
             return err;
@@ -506,20 +509,45 @@ static int vk_h264_decode_slice(AVCodecContext *avctx,
 static int vk_h264_end_frame(AVCodecContext *avctx)
 {
     const H264Context *h = avctx->priv_data;
+    FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data;
+    FFVulkanDecodeShared *ctx = dec->shared_ctx;
+
     H264Picture *pic = h->cur_pic_ptr;
     H264VulkanDecodePicture *hp = pic->hwaccel_picture_private;
-    FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data;
     FFVulkanDecodePicture *vp = &hp->vp;
     FFVulkanDecodePicture *rvp[H264_MAX_PICTURE_COUNT] = { 0 };
     AVFrame *rav[H264_MAX_PICTURE_COUNT] = { 0 };
 
+#ifdef VK_KHR_video_maintenance2
+    StdVideoH264ScalingLists vksps_scaling;
+    StdVideoH264HrdParameters vksps_vui_header;
+    StdVideoH264SequenceParameterSetVui vksps_vui;
+    StdVideoH264SequenceParameterSet vksps;
+    StdVideoH264ScalingLists vkpps_scaling;
+    StdVideoH264PictureParameterSet vkpps;
+    VkVideoDecodeH264InlineSessionParametersInfoKHR h264_params;
+
+    if (ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2) {
+        set_sps(h->ps.sps, &vksps_scaling,
+                &vksps_vui_header, &vksps_vui, &vksps);
+        set_pps(h->ps.pps, h->ps.sps, &vkpps_scaling, &vkpps);
+        h264_params = (VkVideoDecodeH264InlineSessionParametersInfoKHR) {
+            .sType = 
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR,
+            .pStdSPS = &vksps,
+            .pStdPPS = &vkpps,
+        };
+        hp->h264_pic_info.pNext = &h264_params;
+    }
+#endif
+
     if (!hp->h264_pic_info.sliceCount)
         return 0;
 
     if (!vp->slices_buf)
         return AVERROR(EINVAL);
 
-    if (!dec->session_params) {
+    if (!dec->session_params &&
+        !(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) {
         int err = vk_h264_create_params(avctx, &dec->session_params);
         if (err < 0)
             return err;

_______________________________________________
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