From patchwork Mon Sep 23 10:56:29 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: 51745 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d154:0:b0:48e:c0f8:d0de with SMTP id bt20csp2377528vqb; Mon, 23 Sep 2024 04:14:17 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVjp7OMTcDk6+WRiJ7f2ggOSQGjc3k+cLYUkUCRksCwl48bHjLNbRj96AG/2D1qekOeLl7gAkz26VTiEnuuQYiD@gmail.com X-Google-Smtp-Source: AGHT+IGzbHMgDWJ/e0nzQ1w/HmXYgsdiC8E2hj7Bi1ORKeOhWmryufM9kPS5tLWgn7K5fsiukHj7 X-Received: by 2002:a2e:9087:0:b0:2f3:f1cf:5314 with SMTP id 38308e7fff4ca-2f7cb31faacmr37068461fa.10.1727090057240; Mon, 23 Sep 2024 04:14:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727090057; cv=none; d=google.com; s=arc-20240605; b=cXXiToMArDAjrmqqwNNJR+SUNealHOMS70f4TCvSgq6ATIs5c1i1ekdDLnCNBPYgVb qKOWp3tJuu+mIn+HwxvX+LVVNriALDWcbCffDWxzrQRfynDoB9fkqiIZ8BnYqgkfje8k Sxi6jQhrM4oxhvzeGsmHFSqyDUH3bEdGx03vsxBGdB9Yb/GzeTSVwoG9z8iYzlB6Hxy5 StysnSlI1s4uqkjkGlkY4+u4gKKB4XRUirZ3l9vIQ81jNwqD6cJrqPDPSELLI35Q+rjE HTSHkIktr2JoRA0MCdFGpj6umxyggaxH4OrtXXLr2cVVAbabGDZg4tYeTlB9aUcIUhz6 HDiA== 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=587ideLFBmFKeVs669u5ivTQY8qRTLsLl1Nm9mvUIwg=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Uiz4V3xCo8JLXls/40iOG04yhdZkebgggq33rNx3R/7QY3viwYC7ffoEBEPRNZ/61u FRLEZd6fyGE2zjKxjzt9u5D7blyjAT8w5W5I2clDLYUQyVcNhHWTM9qT4ZWcIHD4vBgK YU0ND51ZmuJS9fTREaSXrsJ9VsTPA7bw9ObeShfAxZaGvhL6PXn5CkvQZgaGUtONq71B HVTOD2ssRLRjZ8UQ8TEgtqVgOObM2WQMk5G97Gg0RaYSF+7jCspAWrCzHgLeeUqlcBAH Lt3/Xtwc+JM/QW4d2De/HYJZNC0UORRb+Gy7gj8qblDaFFNUE+OxF+SqbZYg/mziZXe2 ZyEA==; 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=LZgYGSrV; 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-2f79d2db3d0si61213361fa.153.2024.09.23.04.14.16; Mon, 23 Sep 2024 04:14:17 -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=LZgYGSrV; 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 2EFC168DA92; Mon, 23 Sep 2024 13:56:37 +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 5947068D7C2 for ; Mon, 23 Sep 2024 13:56:30 +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=gwgP43IaLEWpsGwXMu5JP7B8+zTnCZ6Wt9kgtjot2Yc=; b=LZgYGSrVine/3Lxq7T/dYjPkxr p78WkC+P15n5EYKOuPk+NEUH8GQug4VYMcIjXt685MUTr67YTyeLPNGxWkkjJCOqtrP2JhbTyzztF Sn9B5L8UK1SusLqntr4aZRWNHLtNOAEtaG73rwUq9rMSKKEMXgl25aDRnc8tIFrDwArFjIiY8AoqT xsomZBXtxuB6aOvS+Ck94Bpy0d5rrRlQkKZI81S7/jJsMPyeeVmb1XGYPrmKV0LDBH9fK9tl+oqJ2 PyKKW8FW6ujPuiBlgivMKsD/3lge+Uowk7Epccs8OIaCC4JNy3sDCK8tc05ZD2MGYcfr35WafuYWC dVDRh+VQ==; 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 1ssgk1-00HULR-D4 for ; Mon, 23 Sep 2024 12:56:29 +0200 Received: from vjaquez by octavia with local (Exim 4.98) (envelope-from ) id 1ssgk1-000000033xR-0R5Y for ffmpeg-devel@ffmpeg.org; Mon, 23 Sep 2024 12:56:29 +0200 From: =?utf-8?q?V=C3=ADctor_Manuel_J=C3=A1quez_Leal?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Sep 2024 12:56:29 +0200 Message-ID: <20240923105629.730190-1-vjaquez@igalia.com> X-Mailer: git-send-email 2.45.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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: mV2ULjt7cE44 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,