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 |
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 |
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 --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,