[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