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

Lynne dev at lynne.ee
Fri Sep 20 20:25:36 EEST 2024


On 20/09/2024 13:33, 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 sets the quality level at session parameter creation for both H.264
> and H.265 Vulkan encoders.
> ---
>   libavcodec/vulkan_encode_h264.c | 8 +++++++-
>   libavcodec/vulkan_encode_h265.c | 8 +++++++-
>   2 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/vulkan_encode_h264.c b/libavcodec/vulkan_encode_h264.c
> index af229afe52..4b78e6f43d 100644
> --- a/libavcodec/vulkan_encode_h264.c
> +++ b/libavcodec/vulkan_encode_h264.c
> @@ -1016,6 +1016,7 @@ static int create_session_params(AVCodecContext *avctx)
>       VkVideoEncodeH264SessionParametersAddInfoKHR h264_params_info;
>       VkVideoEncodeH264SessionParametersCreateInfoKHR h264_params;
>       VkVideoSessionParametersCreateInfoKHR session_params_create;
> +    VkVideoEncodeQualityLevelInfoKHR q_info;
>   
>       /* Convert it to Vulkan */
>       err = base_unit_to_vk(avctx, &vk_units);
> @@ -1044,9 +1045,14 @@ static int create_session_params(AVCodecContext *avctx)
>           .maxStdPPSCount = 1,
>           .pParametersAddInfo = &h264_params_info,
>       };
> +    q_info = (VkVideoEncodeQualityLevelInfoKHR) {
> +        .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,
> +        .pNext = &h264_params,
> +        .qualityLevel = ctx->opts.quality,
> +    };
>       session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
>           .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
> -        .pNext = &h264_params,
> +        .pNext = &q_info,
>           .videoSession = ctx->common.session,
>           .videoSessionParametersTemplate = NULL,
>       };
> diff --git a/libavcodec/vulkan_encode_h265.c b/libavcodec/vulkan_encode_h265.c
> index 3cb7a3b7df..f1e61ab894 100644
> --- a/libavcodec/vulkan_encode_h265.c
> +++ b/libavcodec/vulkan_encode_h265.c
> @@ -1166,6 +1166,7 @@ static int create_session_params(AVCodecContext *avctx)
>       VkVideoEncodeH265SessionParametersAddInfoKHR h265_params_info;
>       VkVideoEncodeH265SessionParametersCreateInfoKHR h265_params;
>       VkVideoSessionParametersCreateInfoKHR session_params_create;
> +    VkVideoEncodeQualityLevelInfoKHR q_info;
>   
>       /* Convert it to Vulkan */
>       err = base_unit_to_vk(avctx, &vk_units);
> @@ -1197,9 +1198,14 @@ static int create_session_params(AVCodecContext *avctx)
>           .maxStdVPSCount = 1,
>           .pParametersAddInfo = &h265_params_info,
>       };
> +    q_info = (VkVideoEncodeQualityLevelInfoKHR) {
> +        .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,
> +        .pNext = &h265_params,
> +        .qualityLevel = ctx->opts.quality,
> +    };
>       session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
>           .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
> -        .pNext = &h265_params,
> +        .pNext = &q_info,
>           .videoSession = ctx->common.session,
>           .videoSessionParametersTemplate = NULL,
>       };

Could you move this to vulkan_encode.c?
Thanks
-------------- 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/20240920/df5ecea4/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/20240920/df5ecea4/attachment.sig>


More information about the ffmpeg-devel mailing list