From patchwork Fri Dec 30 17:50:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 39816 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp5732636pzb; Fri, 30 Dec 2022 09:51:01 -0800 (PST) X-Google-Smtp-Source: AMrXdXsKF7OJbtJZzo24yLGxSmE60yQDeC52EwXm0IWOdDY+fu8p9lbswyy7jSyZ0YQ95QAM0StU X-Received: by 2002:a17:906:a290:b0:7c1:9eb:845b with SMTP id i16-20020a170906a29000b007c109eb845bmr31794794ejz.16.1672422661540; Fri, 30 Dec 2022 09:51:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672422661; cv=none; d=google.com; s=arc-20160816; b=Y/IGn63sLJUlsznjnVoAMaq4mzyDqSa9Twuth/CAhKsXjCFM0JQEy0mvV+VHZxl0iK ggdmuBhKq7vBqfYE4/DIf+fTUX/LSz+cJ5Ick0cNh0VDPySjlq06iNPd0XpW4ilE3qc3 NPUyzJLAixQvezozDLgxefWIG5/8l3gIceqW1ru7tManc0v/F/yfQ4ox539+mYE55NHf zIKJWVk1EUgQ7T1qBBBH3liYbivzKKCvEXcqAUTz3fA2xhJ2gmYG3mGjPopmhPPm30xu ocY+45kqDzDXZ39LqzKW3QET45CHd9o2zG4SoJPG7UKf72t4GhB+O6eh883Fnmb4kxWc iiNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=sygprKLr+kvijkc/HFHq8qvfNxxFhMvJhXeMMY24rcc=; b=zygv+IQEvW9WjNgkisZ92QlsHiIlWjtLSfNa8XZDVjaJI7KAwXBpqI7xmKfy/oy/2D wAkTZHcH5FmJ7N7P2oFrMqSZbBn3EDyHdKVlq7uIa0p6B8KfHUeaXC0TOhp95Lvj7191 B5FhLzirDZQgwGKO2TE/mtWjpwZoxxctDEzUwVEdUEMSq42VpbW8+9aD/c8Pkym+D7Ec GxaywYxNrUe4JCPg+jpZ0ICnLOVeEY8WCfK7mq6zu9R8nd7bc2JbAoxzYhlsvaN3CaDN gthOd6ih67MI8nPvcgKnnGKneZVK37fvcrK1a+DuweqJsmsBBLmL1qf9e/DOT4Fx/LGO yudg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=CEPor+5Z; 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=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h7-20020a05640250c700b004876785ef7esi9237996edb.489.2022.12.30.09.51.00; Fri, 30 Dec 2022 09:51:01 -0800 (PST) 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=@foxmail.com header.s=s201512 header.b=CEPor+5Z; 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=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8916E68BB22; Fri, 30 Dec 2022 19:50:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out203-205-221-209.mail.qq.com (out203-205-221-209.mail.qq.com [203.205.221.209]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B40DC680741 for ; Fri, 30 Dec 2022 19:50:48 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1672422644; bh=XgJcfm1EbN5otUslkY4678sRnAZzEeDSXBuBr3s19dA=; h=From:To:Cc:Subject:Date; b=CEPor+5ZbGck9LMEAi21dZ1c8bSy7ilC4JEXVmdwd+YplR4fIAcO61Z+tE+G0jUDj yaWj1VSS6Q1iqr7KIblgNJqOpruABqPzNlURCDq4mQ2+4QNy+Vh3M3BTSpeehtLJGr FO3FHDiBlt4XAvf0GjSqJt+TT2968WFnMWRcaVzc= Received: from localhost.localdomain ([121.35.187.62]) by newxmesmtplogicsvrszb1-0.qq.com (NewEsmtp) with SMTP id CAB33489; Sat, 31 Dec 2022 01:50:43 +0800 X-QQ-mid: xmsmtpt1672422643taffaj9sf Message-ID: X-QQ-XMAILINFO: NDz66ktblfzJms37L8HL4jbK3k65TEpZP5aazR4WF10k4wtkhnQ4LbrsKFt3Ib 01PGwqzHLYNNupanobtEWvZeQIfJc1dVIQXnwE24diACtYMF5yP0EIyx01hT/HRz1nmWxvtzDnbY A3t5bYgWKLE5Jq7AsTYK5itxC6iU7XoA95kKXkdxIByxfGoZ//Hrz6t33STZl+P4SP0J/myYfw43 qa0ZvSDyfqt4WLmzZw22Z4JSXkkqWU5c+JgkYkCUmSWLuy0+rX7zNxpNSZZRwV6flXYoLbuSQKoA RX23o3hsrgXCbeRBzL/pmpaXiJDuHTZrNQYS6NE1D7cyML6EndXnSjhd+BWPJzPkrQPUgsa8dkkR GCiZzcM4blhlaJ+v8fv62+wBr43Ed9YxdB37D9s6FWQU3HGzqCIWfkUMjkfk0Mlg+DnyUhYK2w1g TcnBYNIJBIhl+W/UkRlC87V2A63MGm1S9m63O+BD49gYQV8pcp5CkG+rriOPF7GjIDHUfi4lsgj/ SgpmUNJ5RzTr7naA9xGuTfkjO2QOJHyOCUSogJsl4BHholMKPLNwPPgmqavjjepKU0C+tsNZ1T/Y v+CH7jEQ2zN7ZPYX/YnJ78/Kfo9XK80vfjRqvgIs/BsS0cpMEIg0V6X9JkgFUfAorlviL0/IVcF1 XEhkM2fIob+psoW9lpiMR+vNlggMVUZJuHQgNqAcqzpUahuJ3w08kmbkqWcgBgB36n0xJ38EOetT ulkH++81PMArD8RqFZmrQ+WH6A4KfqsNdTVjssK2h2rA32HfOKfjAeePS/xhPgBYgBBr8WXCYK+f WKA3C1iPW2R3dlsbFu6m0nFyhVtez+VJVnuRi2JlfaaSAJFlz+eujgz8jifIwEHOuAsNhZWrau46 7bJTaGNm+yFsKbABPYFyEDLfsWUQRxexOH3pLOWBatzBpiufYuVZVgQA/glZP4wvDLEHLaIF6eHf /setpihXvOsMs3taGB2g== From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Sat, 31 Dec 2022 01:50:19 +0800 X-OQ-MSGID: <20221230175019.191187-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [RFC PATCH] avcodec/nvenc: add alpha layer encoding support 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 Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9Le81aMAagxd From: Zhao Zhili Signed-off-by: Zhao Zhili --- I need help. A lot of things doesn't work as Nvidia's doc: 1. Global header is broken. NV_ENC_SEQUENCE_PARAM_PAYLOAD doesn't work with multi SPS/PPS. It output VPS, SPS_0, SPS_1, PPS_0, with PPS_1 missing. 2. NV_ENC_LOCK_BITSTREAM.alphaLayerSizeInBytes is always 0, although the data is there. 3. The alpha layer bitstream is corrupted. It can be decoded with a lot of errors. libavcodec/nvenc.c | 13 +++++++++++++ libavcodec/nvenc.h | 1 + libavcodec/nvenc_hevc.c | 2 ++ 3 files changed, 16 insertions(+) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index f6df7cb6ac..e46cea4302 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -578,6 +578,12 @@ static int nvenc_check_capabilities(AVCodecContext *avctx) return AVERROR(ENOSYS); } + if (ctx->alpha_bitrate_ratio > 0 && + nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_ALPHA_LAYER_ENCODING) <= 0) { + av_log(avctx, AV_LOG_ERROR, "Alpha layer encoding not supported\n"); + return AVERROR(ENOSYS); + } + ctx->support_dyn_bitrate = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_DYN_BITRATE_CHANGE); return 0; @@ -1290,6 +1296,13 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx) hevc->enableConstrainedEncoding = 1; #endif + if (ctx->alpha_bitrate_ratio > 0 && (pixdesc->flags & AV_PIX_FMT_FLAG_ALPHA)) { + hevc->enableAlphaLayerEncoding = 1; + cc->rcParams.alphaLayerBitrateRatio = ctx->alpha_bitrate_ratio; + av_log(avctx, AV_LOG_DEBUG, "Enable alpha layer encoding for pix_fmt %s\n", + pixdesc->name); + } + hevc->disableSPSPPS = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) ? 1 : 0; hevc->repeatSPSPPS = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) ? 0 : 1; hevc->outputAUD = ctx->aud; diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index 05a7ac48b1..f210d71eeb 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -240,6 +240,7 @@ typedef struct NvencContext int udu_sei; int timing_info; int highbitdepth; + int alpha_bitrate_ratio; } NvencContext; int ff_nvenc_encode_init(AVCodecContext *avctx); diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index 5ad423444a..67a649fad2 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -177,6 +177,8 @@ static const AVOption options[] = { OFFSET(single_slice_intra_refresh), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "constrained-encoding", "Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices", OFFSET(constrained_encoding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + { "alpha-bitrate-ratio", "Specifies the ratio in which bitrate should be split between base and alpha layer, 0 for disable alpha layer encoding", + OFFSET(alpha_bitrate_ratio), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, { NULL } };