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".