ffmpeg | branch: master | Lynne <d...@lynne.ee> | Fri Mar 14 13:23:55 2025 +0100| [9a78ebc11a8845a9e9bdc2dd1fa5c474263833bf] | committer: Lynne
vulkan_av1: use VK_KHR_video_maintenance2 if available > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9a78ebc11a8845a9e9bdc2dd1fa5c474263833bf --- libavcodec/vulkan_av1.c | 74 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/libavcodec/vulkan_av1.c b/libavcodec/vulkan_av1.c index 7dd7b204d7..4b49723928 100644 --- a/libavcodec/vulkan_av1.c +++ b/libavcodec/vulkan_av1.c @@ -139,23 +139,15 @@ static int vk_av1_fill_pict(AVCodecContext *avctx, const AV1Frame **ref_src, return 0; } -static int vk_av1_create_params(AVCodecContext *avctx, AVBufferRef **buf) +static void vk_av1_params_fill(AVCodecContext *avctx, + StdVideoAV1TimingInfo *av1_timing_info, + StdVideoAV1ColorConfig *av1_color_config, + StdVideoAV1SequenceHeader *av1_sequence_header) { const AV1DecContext *s = avctx->priv_data; - FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; - FFVulkanDecodeShared *ctx = dec->shared_ctx; - const AV1RawSequenceHeader *seq = s->raw_seq; - StdVideoAV1SequenceHeader av1_sequence_header; - StdVideoAV1TimingInfo av1_timing_info; - StdVideoAV1ColorConfig av1_color_config; - VkVideoDecodeAV1SessionParametersCreateInfoKHR av1_params; - VkVideoSessionParametersCreateInfoKHR session_params_create; - - int err; - - av1_timing_info = (StdVideoAV1TimingInfo) { + *av1_timing_info = (StdVideoAV1TimingInfo) { .flags = (StdVideoAV1TimingInfoFlags) { .equal_picture_interval = seq->timing_info.equal_picture_interval, }, @@ -164,7 +156,7 @@ static int vk_av1_create_params(AVCodecContext *avctx, AVBufferRef **buf) .num_ticks_per_picture_minus_1 = seq->timing_info.num_ticks_per_picture_minus_1, }; - av1_color_config = (StdVideoAV1ColorConfig) { + *av1_color_config = (StdVideoAV1ColorConfig) { .flags = (StdVideoAV1ColorConfigFlags) { .mono_chrome = seq->color_config.mono_chrome, .color_range = seq->color_config.color_range, @@ -179,7 +171,7 @@ static int vk_av1_create_params(AVCodecContext *avctx, AVBufferRef **buf) .matrix_coefficients = seq->color_config.matrix_coefficients, }; - av1_sequence_header = (StdVideoAV1SequenceHeader) { + *av1_sequence_header = (StdVideoAV1SequenceHeader) { .flags = (StdVideoAV1SequenceHeaderFlags) { .still_picture = seq->still_picture, .reduced_still_picture_header = seq->reduced_still_picture_header, @@ -211,9 +203,26 @@ static int vk_av1_create_params(AVCodecContext *avctx, AVBufferRef **buf) .order_hint_bits_minus_1 = seq->order_hint_bits_minus_1, .seq_force_integer_mv = seq->seq_force_integer_mv, .seq_force_screen_content_tools = seq->seq_force_screen_content_tools, - .pTimingInfo = &av1_timing_info, - .pColorConfig = &av1_color_config, + .pTimingInfo = av1_timing_info, + .pColorConfig = av1_color_config, }; +} + +static int vk_av1_create_params(AVCodecContext *avctx, AVBufferRef **buf, + AV1VulkanDecodePicture *ap) +{ + int err; + FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; + FFVulkanDecodeShared *ctx = dec->shared_ctx; + + StdVideoAV1SequenceHeader av1_sequence_header; + StdVideoAV1TimingInfo av1_timing_info; + StdVideoAV1ColorConfig av1_color_config; + VkVideoDecodeAV1SessionParametersCreateInfoKHR av1_params; + VkVideoSessionParametersCreateInfoKHR session_params_create; + + vk_av1_params_fill(avctx, &av1_timing_info, &av1_color_config, + &av1_sequence_header); av1_params = (VkVideoDecodeAV1SessionParametersCreateInfoKHR) { .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR, @@ -244,6 +253,8 @@ static int vk_av1_start_frame(AVCodecContext *avctx, AV1DecContext *s = avctx->priv_data; const AV1Frame *pic = &s->cur_frame; FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; + FFVulkanDecodeShared *ctx = dec->shared_ctx; + AV1VulkanDecodePicture *ap = pic->hwaccel_picture_private; FFVulkanDecodePicture *vp = &ap->vp; @@ -257,8 +268,9 @@ static int vk_av1_start_frame(AVCodecContext *avctx, STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_WIENER, STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SGRPROJ }; - if (!dec->session_params) { - err = vk_av1_create_params(avctx, &dec->session_params); + if (!dec->session_params && + !(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) { + err = vk_av1_create_params(avctx, &dec->session_params, ap); if (err < 0) return err; } @@ -578,17 +590,37 @@ static int vk_av1_end_frame(AVCodecContext *avctx) { const AV1DecContext *s = avctx->priv_data; FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; + FFVulkanDecodeShared *ctx = dec->shared_ctx; + const AV1Frame *pic = &s->cur_frame; AV1VulkanDecodePicture *ap = pic->hwaccel_picture_private; FFVulkanDecodePicture *vp = &ap->vp; FFVulkanDecodePicture *rvp[AV1_NUM_REF_FRAMES] = { 0 }; AVFrame *rav[AV1_NUM_REF_FRAMES] = { 0 }; +#ifdef VK_KHR_video_maintenance2 + StdVideoAV1SequenceHeader av1_sequence_header; + StdVideoAV1TimingInfo av1_timing_info; + StdVideoAV1ColorConfig av1_color_config; + VkVideoDecodeAV1InlineSessionParametersInfoKHR av1_params; + + if (ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2) { + vk_av1_params_fill(avctx, &av1_timing_info, &av1_color_config, + &av1_sequence_header); + av1_params = (VkVideoDecodeAV1InlineSessionParametersInfoKHR) { + .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR, + .pStdSequenceHeader = &av1_sequence_header, + }; + ap->av1_pic_info.pNext = &av1_params; + } +#endif + if (!ap->av1_pic_info.tileCount) return 0; - if (!dec->session_params) { - int err = vk_av1_create_params(avctx, &dec->session_params); + if (!dec->session_params && + !(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) { + int err = vk_av1_create_params(avctx, &dec->session_params, ap); 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".