[FFmpeg-devel] [PATCH v2] vulkan_encode: set the quality level in session parameters

Lynne dev at lynne.ee
Mon Sep 23 14:45:51 EEST 2024


On 23/09/2024 12:56, Víctor Manuel Jáquez Leal wrote:
> While running this command
> 
> ./ffmpeg_g -loglevel debug -hwaccel vulkan -init_hw_device vulkan=vk:0,debug=1 -hwaccel_output_format vulkan -i input.y4m -vf 'format=nv12,hwupload' -c:v h264_vulkan -quality 2 output.mp4 -y
> 
> It hit this validation error:
> 
> Validation Error: [ VUID-vkCmdEncodeVideoKHR-None-08318 ] Object 0: handle =
> 0x8f000000008f, type = VK_OBJECT_TYPE_VIDEO_SESSION_KHR; Object 1: handle =
> 0xfd00000000fd, type = VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR;
> | MessageID = 0x5dc3dd39
> | vkCmdEncodeVideoKHR(): The currently configured encode quality level (2) for
> VkVideoSessionKHR 0x8f000000008f[] does not match the encode quality level (0)
> VkVideoSessionParametersKHR 0xfd00000000fd[] was created with. The Vulkan spec
> states: The bound video session parameters object must have been created with
> the currently set video encode quality level for the bound video session at the
> time the command is executed on the
> device (https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdEncodeVideoKHR-None-08318)
> 
> This patch adds a new function helper for creating session parameters, which
> also sets the quality level and it's called by the H.264 and H.265 Vulkan
> encoders.
> ---
>   libavcodec/vulkan_encode.c      | 34 +++++++++++++++++++++++++++++++++
>   libavcodec/vulkan_encode.h      |  6 ++++++
>   libavcodec/vulkan_encode_h264.c | 19 +-----------------
>   libavcodec/vulkan_encode_h265.c | 19 +-----------------
>   4 files changed, 42 insertions(+), 36 deletions(-)
> 
> diff --git a/libavcodec/vulkan_encode.c b/libavcodec/vulkan_encode.c
> index 9a9258ce7b..d187b7cdd3 100644
> --- a/libavcodec/vulkan_encode.c
> +++ b/libavcodec/vulkan_encode.c
> @@ -1023,3 +1023,37 @@ av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext *
>   
>       return 0;
>   }
> +
> +int ff_vulkan_encode_create_session_params(AVCodecContext *avctx, FFVulkanEncodeContext *ctx,
> +                                           void *codec_params_pnext)
> +{
> +    VkResult ret;
> +    FFVulkanFunctions *vk = &ctx->s.vkfn;
> +    FFVulkanContext *s = &ctx->s;
> +
> +    VkVideoEncodeQualityLevelInfoKHR q_info;
> +    VkVideoSessionParametersCreateInfoKHR session_params_create;
> +
> +    q_info = (VkVideoEncodeQualityLevelInfoKHR) {
> +        .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,
> +        .pNext = codec_params_pnext,
> +        .qualityLevel = ctx->opts.quality,
> +    };
> +    session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
> +        .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
> +        .pNext = &q_info,
> +        .videoSession = ctx->common.session,
> +        .videoSessionParametersTemplate = VK_NULL_HANDLE,
> +    };
> +
> +    /* Create session parameters */
> +    ret = vk->CreateVideoSessionParametersKHR(s->hwctx->act_dev, &session_params_create,
> +                                              s->hwctx->alloc, &ctx->session_params);
> +    if (ret != VK_SUCCESS) {
> +        av_log(avctx, AV_LOG_ERROR, "Unable to create Vulkan video session parameters: %s!\n",
> +               ff_vk_ret2str(ret));
> +        return AVERROR_EXTERNAL;
> +    }
> +
> +    return 0;
> +}
> diff --git a/libavcodec/vulkan_encode.h b/libavcodec/vulkan_encode.h
> index fd3499dd10..a7a02d5fd0 100644
> --- a/libavcodec/vulkan_encode.h
> +++ b/libavcodec/vulkan_encode.h
> @@ -245,6 +245,12 @@ int ff_vulkan_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt);
>    */
>   void ff_vulkan_encode_uninit(FFVulkanEncodeContext *ctx);
>   
> +/**
> + * Create session parameters.
> + */
> +int ff_vulkan_encode_create_session_params(AVCodecContext *avctx, FFVulkanEncodeContext *ctx,
> +                                           void *codec_params_pnext);
> +
>   /**
>    * Paperwork.
>    */
> diff --git a/libavcodec/vulkan_encode_h264.c b/libavcodec/vulkan_encode_h264.c
> index af229afe52..9964ba5b8b 100644
> --- a/libavcodec/vulkan_encode_h264.c
> +++ b/libavcodec/vulkan_encode_h264.c
> @@ -1005,7 +1005,6 @@ static av_cold int base_unit_to_vk(AVCodecContext *avctx,
>   static int create_session_params(AVCodecContext *avctx)
>   {
>       int err;
> -    VkResult ret;
>       VulkanEncodeH264Context *enc = avctx->priv_data;
>       FFVulkanEncodeContext *ctx = &enc->common;
>       FFVulkanContext *s = &ctx->s;
> @@ -1015,7 +1014,6 @@ static int create_session_params(AVCodecContext *avctx)
>   
>       VkVideoEncodeH264SessionParametersAddInfoKHR h264_params_info;
>       VkVideoEncodeH264SessionParametersCreateInfoKHR h264_params;
> -    VkVideoSessionParametersCreateInfoKHR session_params_create;
>   
>       /* Convert it to Vulkan */
>       err = base_unit_to_vk(avctx, &vk_units);
> @@ -1044,23 +1042,8 @@ static int create_session_params(AVCodecContext *avctx)
>           .maxStdPPSCount = 1,
>           .pParametersAddInfo = &h264_params_info,
>       };
> -    session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
> -        .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
> -        .pNext = &h264_params,
> -        .videoSession = ctx->common.session,
> -        .videoSessionParametersTemplate = NULL,
> -    };
>   
> -    /* Create session parameters */
> -    ret = vk->CreateVideoSessionParametersKHR(s->hwctx->act_dev, &session_params_create,
> -                                              s->hwctx->alloc, &ctx->session_params);
> -    if (ret != VK_SUCCESS) {
> -        av_log(avctx, AV_LOG_ERROR, "Unable to create Vulkan video session parameters: %s!\n",
> -               ff_vk_ret2str(ret));
> -        return AVERROR_EXTERNAL;
> -    }
> -
> -    return 0;
> +    return ff_vulkan_encode_create_session_params(avctx, ctx, &h264_params);
>   }
>   
>   static int parse_feedback_units(AVCodecContext *avctx,
> diff --git a/libavcodec/vulkan_encode_h265.c b/libavcodec/vulkan_encode_h265.c
> index 3cb7a3b7df..54bf071d78 100644
> --- a/libavcodec/vulkan_encode_h265.c
> +++ b/libavcodec/vulkan_encode_h265.c
> @@ -1155,7 +1155,6 @@ static av_cold int base_unit_to_vk(AVCodecContext *avctx,
>   static int create_session_params(AVCodecContext *avctx)
>   {
>       int err;
> -    VkResult ret;
>       VulkanEncodeH265Context *enc = avctx->priv_data;
>       FFVulkanEncodeContext *ctx = &enc->common;
>       FFVulkanContext *s = &ctx->s;
> @@ -1165,7 +1164,6 @@ static int create_session_params(AVCodecContext *avctx)
>   
>       VkVideoEncodeH265SessionParametersAddInfoKHR h265_params_info;
>       VkVideoEncodeH265SessionParametersCreateInfoKHR h265_params;
> -    VkVideoSessionParametersCreateInfoKHR session_params_create;
>   
>       /* Convert it to Vulkan */
>       err = base_unit_to_vk(avctx, &vk_units);
> @@ -1197,23 +1195,8 @@ static int create_session_params(AVCodecContext *avctx)
>           .maxStdVPSCount = 1,
>           .pParametersAddInfo = &h265_params_info,
>       };
> -    session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
> -        .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
> -        .pNext = &h265_params,
> -        .videoSession = ctx->common.session,
> -        .videoSessionParametersTemplate = NULL,
> -    };
>   
> -    /* Create session parameters */
> -    ret = vk->CreateVideoSessionParametersKHR(s->hwctx->act_dev, &session_params_create,
> -                                              s->hwctx->alloc, &ctx->session_params);
> -    if (ret != VK_SUCCESS) {
> -        av_log(avctx, AV_LOG_ERROR, "Unable to create Vulkan video session parameters: %s!\n",
> -               ff_vk_ret2str(ret));
> -        return AVERROR_EXTERNAL;
> -    }
> -
> -    return 0;
> +    return ff_vulkan_encode_create_session_params(avctx, ctx, &h265_params);
>   }
>   
>   static int parse_feedback_units(AVCodecContext *avctx,

Thanks, pushed.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0xA2FEA5F03F034464.asc
Type: application/pgp-keys
Size: 624 bytes
Desc: OpenPGP public key
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20240923/c267658c/attachment.key>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 236 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20240923/c267658c/attachment.sig>


More information about the ffmpeg-devel mailing list