diff mbox series

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

Message ID 20240923105629.730190-1-vjaquez@igalia.com
State New
Headers show
Series [FFmpeg-devel,v2] vulkan_encode: set the quality level in session parameters | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Víctor Manuel Jáquez Leal Sept. 23, 2024, 10:56 a.m. UTC
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(-)

Comments

Lynne Sept. 23, 2024, 11:45 a.m. UTC | #1
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.
diff mbox series

Patch

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,