From patchwork Mon Sep 23 10:49:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?V=C3=ADctor_Manuel_J=C3=A1quez_Leal?= X-Patchwork-Id: 51744 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d154:0:b0:48e:c0f8:d0de with SMTP id bt20csp2364012vqb; Mon, 23 Sep 2024 03:49:46 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVhepCDsAKLVF9hQ/uzoRfKyiZ30GCqYVFyM2L6P2R0LV9BHDBphjEPIwIzk5cj4DgJ6HA23iiIWYB/4fLm8Owq@gmail.com X-Google-Smtp-Source: AGHT+IHyu9bP1ogw3YMnHMieLfXXnSD5zCADAPqjza22oupjz8qfSJcr5Bkk8DG5yCCZLHxgQZri X-Received: by 2002:a2e:4602:0:b0:2f3:f2b6:6ccb with SMTP id 38308e7fff4ca-2f7cc37f7d5mr46004291fa.26.1727088585761; Mon, 23 Sep 2024 03:49:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727088585; cv=none; d=google.com; s=arc-20240605; b=XPb17DQAgRGuEHsLeAKrR7MH2JlTHgbNvek+PDiG5Xz+NnTwtXyQOCC0FHNymlvmi3 XLaFw09E9ppxsPVjKQHdok4JAlJYbXonJYq51sZqxFqsPZP4brz0FkbDK4zNOoY5VIqt 50CuvG45irs6mCmY1bPgHS7gYZnyTy/X+Qe9UMW9/wXpbJPzZpvpIJFyIywjnRfFHAMK iWq23VuUZZRAztq3LlHlNIgWPsBqmBpn3ylvQH+v9FriTY1FN758ldTYprwUp8Ngu33j fc5X2ebE6CAyy2xvfnpQ3/poewpUHAUDels981CGWvb50BDmRGi/jgn77xiBxJk7RHS7 chtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=Eo3NFCGeKzRRpqMZdQDrpz0A5WnBaqsuouL72H1hdD8=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=ZTbvb5Vrkv/+I6O/V5SD4Q6ZQTbUGjRllygISy8pIjzEF7AJAEqZfsYtmhQRF3L+7J hvcOccDL7GQ78plQQgZYx0YIfUiofNCVNBPeOQTU3z+MhkR7PueKR90BTTjPrJ2I4d6/ LsYG5xQZRKxIfbvSYzXkJnNtgRzdAeAfH422ummjHLzKhhhsw69ZMrU+g3/zAquLw5Ko 5rauPbqZ5Y7ShzkAu0o+6ZSbq4I5qMMg0m31kjRmt5zTdveak5QoZyqQ0HvJSKMZ034a r1WYSfrDYLvloJFah4BM2itp8Q4XL93Cif/PBCaVFYuU7WG9TxuN/UEW93oyoWNToo7B VjLQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@igalia.com header.s=20170329 header.b=rosMtoS+; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=igalia.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 38308e7fff4ca-2f79d378c7bsi54273551fa.338.2024.09.23.03.49.45; Mon, 23 Sep 2024 03:49:45 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@igalia.com header.s=20170329 header.b=rosMtoS+; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=igalia.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7F1EA68CB1B; Mon, 23 Sep 2024 13:49:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 09A5C68C53B for ; Mon, 23 Sep 2024 13:49:33 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:Message-ID:Date:Subject: To:From:Sender:Reply-To:Cc:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=L9qiHVP+jBhSNoKZZNNBOTufmcjwpME1rI68/RkUGi0=; b=rosMtoS+6G7g6cKB1QO+K47AkH vzG5aQciUIv7aNPfdhhbdfmRtA2+mfR1D+EdTTLL6tHqLaQyLgeS1DcWgs8OE4C/+LumIqhHAqbvs WYzsCH4cuzRqZzS6eaQhmHVctOdjLSagQAik4ILkJ0aT0KQ79jvn7PwAslyyV7p64xY1SH6HNjHtd o5ggX5Ww3w+CZUib8K7/65F2OxSTjoDS4hsqAqzPQKYaxe3NPnuFW7yMht6VmeE4XK1HaTjqXfnwC Sm+pRfOGrqMM3MZml0nmK+aHEWfAUbAGtAk3F7nkIZrw69bPp/CqPTm9vosIDRBEiuN4sVyXdtbN5 fbviM53g==; Received: from static-149-87-62-95.ipcom.comunitel.net ([95.62.87.149] helo=octavia) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1ssgdI-00HUEN-Lh for ; Mon, 23 Sep 2024 12:49:32 +0200 Received: from vjaquez by octavia with local (Exim 4.98) (envelope-from ) id 1ssgdI-000000030ma-0ejY for ffmpeg-devel@ffmpeg.org; Mon, 23 Sep 2024 12:49:32 +0200 From: =?utf-8?q?V=C3=ADctor_Manuel_J=C3=A1quez_Leal?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Sep 2024 12:49:32 +0200 Message-ID: <20240923104932.717985-1-vjaquez@igalia.com> X-Mailer: git-send-email 2.45.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] vulkan_encode: set the quality level in session parameters X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: JRcInA7HoSFi 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 | 18 +---------------- 4 files changed, 42 insertions(+), 35 deletions(-) diff --git a/libavcodec/vulkan_encode.c b/libavcodec/vulkan_encode.c index 9a9258ce7b..05ac4eb2de 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..72bed94e78 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..6cfa3b0d7b 100644 --- a/libavcodec/vulkan_encode_h265.c +++ b/libavcodec/vulkan_encode_h265.c @@ -1165,7 +1165,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 +1196,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,