From patchwork Thu Sep 2 10:38:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 29955 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp151181iov; Thu, 2 Sep 2021 03:39:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzTJO+tSPYHcFmAuSCHR9Fg5CQJS5SOGYC0gMHt+QIYShzIjKQqlYL+QuaBkC9wFSEGM+WK X-Received: by 2002:a17:907:98e3:: with SMTP id ke3mr3167556ejc.317.1630579180847; Thu, 02 Sep 2021 03:39:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630579180; cv=none; d=google.com; s=arc-20160816; b=NCrGE6teAFht3s5GvFdDFSV18eXohEMgWeelkKy8sdoRLj8XDmeQMFV00i1YEQxXMk df8MFxCYzRhnJc9YMz7oAXGhRnn6cJ2lqm8uuAQb6bs0Igz7B7Csb4hyXGDj4IT7+U3M jdLtfRwgAVvaV2OiuhQiXiX49HyKfhRS8S0PoUJV5oNrgA7L16xhQLP+SAMDuZz32KQy BC51/TYlvjuRu6fwd/6gSy0vQw1pUlw1Yh+ws0gAwOPDZn1iu1/EjmuM6F9m9yQn9Lwh /zcPOsL5bit/Lqf95A/+at5hbhzY/ifa8oqkPVsNl6IVmI9Ok+03xcLDC3kdMRvDa5h3 5P8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=MyC8EzPRvXgN3WAkBe5i6/RfU98Cy4r0oj8r+1Uy/EE=; b=PatYx6bOX6pg2Bj8DR0DzmGlCTUaOQmdY2M+3QHLOdq3MW99AcNJ1bHI9arYFwHiVj UYCZsneyUMZ/OBqwT+OIfs8xaoN5W0gCInL/ILficIcaPzJAHMpYHWcIeepsLz8mf+hh c75KTVNOdv/CnBbjJobGsXYHvGY698YDsntFj64lltotoH0iQXz7AH9HMJcKH636cawo fONV4OxnIv0PEZgI9QmqBriF1CycSpqeFHXRqrT4EsNt75et+duzkhy3Knld9gut3W+H FF+DMR9LdBd6XM0z9H22NLuzBDc1N5CsRzn1XrvsuMTEDGL7jZ/+hzpfh/jt3athayf4 5aHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=morBhfCJ; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i5si1818796eds.477.2021.09.02.03.39.39; Thu, 02 Sep 2021 03:39:40 -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=@gmail.com header.s=20210112 header.b=morBhfCJ; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C1CF568A5AF; Thu, 2 Sep 2021 13:39:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9EC468008A for ; Thu, 2 Sep 2021 13:39:06 +0300 (EEST) Received: by mail-pg1-f172.google.com with SMTP id t1so1470703pgv.3 for ; Thu, 02 Sep 2021 03:39:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6KX+/x+10IYTbY52Q3kyNUE7mu2DKBhLDtDEb+UN3O0=; b=morBhfCJdc3QmEyrg61RtAa036fU5rsoUNidgOOPO0SUGbICQoK1+y7T3MD60iuoi2 zeyFv4Odn1OBVyaUib+ZsaF2NjJTyKbqTFwrz8zi/l27LvwaYen02I1dfJ9xp77gi4kM 7noXQCg0ehvS5Y5+Um91aUqrX4bQJWjk+hjoDoGLQQlAFKeyk9wFGY1YXP1Z789Mc5l3 P2DnMtPlw0m4f9Z/c3MPZ/LNN8nrL91DuX9LMqqKetQv3okasGS1aysSHp8GBXMj2+mv lCY0Aa0Iz4rtp3erxha38Aerx8dqD9AzpiRCLYCY526hfrfefg5tYVwha1I+qQIjwH6t m4nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6KX+/x+10IYTbY52Q3kyNUE7mu2DKBhLDtDEb+UN3O0=; b=VsIz58y12oLoRQKbELSUVOnWMlxRSIWyTE8HFd+A3Wkggl11YSGKmr9B7zxDcH8Rju ie37hiqnSzY5omygm2/dWT014jgeutoUccLk0M4/JS5hKKNYUOlPLEL/wyBZsq0hA8JX wO4wnMiiMawYxXMFAxrDxKcNlTq+LFZzP5EelX4MW+05ClCJv04dlx3annV5IynAamsI vqv6CIOMIHW2gcIZyyg2bHw8KMO3ICmnGY+fXnzt9fmAj/DIeRGEG+aZosA43/x0W5yG fX0flb4kRGNLPYGUy8+ktyMjh4mgvxtVaPXIxFWqWuwk9+rL4mjb8GJkSR3hLTzklnoN UBUg== X-Gm-Message-State: AOAM533y+x5aVuStD1JWCGBFHTQzfV4PPr38BtTSCwu661cIFNpn9u2K S095h7uN1W5dlX/kW2SnW7H5mYYo/RU= X-Received: by 2002:a63:df06:: with SMTP id u6mr2583144pgg.148.1630579145116; Thu, 02 Sep 2021 03:39:05 -0700 (PDT) Received: from vpn2.localdomain ([161.117.202.209]) by smtp.gmail.com with ESMTPSA id c16sm1998646pfb.196.2021.09.02.03.39.04 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Sep 2021 03:39:04 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 2 Sep 2021 18:38:57 +0800 Message-Id: <1630579138-6145-3-git-send-email-lance.lmwang@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1630579138-6145-1-git-send-email-lance.lmwang@gmail.com> References: <1630579138-6145-1-git-send-email-lance.lmwang@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/4] avcodec/nvenc: Add single slice intra refresh 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: Limin Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: tLqtiVDDdtTs From: Limin Wang Signed-off-by: Limin Wang --- libavcodec/nvenc.c | 23 +++++++++++++++++++++++ libavcodec/nvenc.h | 2 ++ libavcodec/nvenc_h264.c | 2 ++ libavcodec/nvenc_hevc.c | 2 ++ 4 files changed, 29 insertions(+) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index e739f8b..79f3253 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -529,6 +529,23 @@ static int nvenc_check_capabilities(AVCodecContext *avctx) } #endif +#ifdef NVENC_HAVE_SINGLE_SLICE_INTRA_REFRESH + ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH); + if(ctx->single_slice_intra_refresh && ret <= 0) { + av_log(avctx, AV_LOG_WARNING, "Single slice intra refresh not supported by the device\n"); + return AVERROR(ENOSYS); + } +#else + if(ctx->single_slice_intra_refresh) { + av_log(avctx, AV_LOG_WARNING, "Single slice intra refresh need SDK 11.1 at build time\n"); + return AVERROR(ENOSYS); + } +#endif + + /* force to enable intra refresh */ + if(ctx->single_slice_intra_refresh) + ctx->intra_refresh = 1; + ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_INTRA_REFRESH); if(ctx->intra_refresh && ret <= 0) { av_log(avctx, AV_LOG_WARNING, "Intra refresh not supported by the device\n"); @@ -1086,6 +1103,9 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx) h264->enableIntraRefresh = 1; h264->intraRefreshPeriod = avctx->gop_size; h264->intraRefreshCnt = avctx->gop_size - 1; +#ifdef NVENC_HAVE_SINGLE_SLICE_INTRA_REFRESH + h264->singleSliceIntraRefresh = ctx->single_slice_intra_refresh; +#endif } h264->disableSPSPPS = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) ? 1 : 0; @@ -1189,6 +1209,9 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx) hevc->enableIntraRefresh = 1; hevc->intraRefreshPeriod = avctx->gop_size; hevc->intraRefreshCnt = avctx->gop_size - 1; +#ifdef NVENC_HAVE_SINGLE_SLICE_INTRA_REFRESH + hevc->singleSliceIntraRefresh = ctx->single_slice_intra_refresh; +#endif } hevc->disableSPSPPS = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) ? 1 : 0; diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index e7cc0e6..1e756a6 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -73,6 +73,7 @@ typedef void ID3D11Device; // SDK 11.1 compile time feature checks #if NVENCAPI_CHECK_VERSION(11, 1) #define NVENC_HAVE_QP_CHROMA_OFFSETS +#define NVENC_HAVE_SINGLE_SLICE_INTRA_REFRESH #endif typedef struct NvencSurface @@ -231,6 +232,7 @@ typedef struct NvencContext int ldkfs; int extra_sei; int intra_refresh; + int single_slice_intra_refresh; } NvencContext; int ff_nvenc_encode_init(AVCodecContext *avctx); diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c index 532dff3..1a46e70 100644 --- a/libavcodec/nvenc_h264.c +++ b/libavcodec/nvenc_h264.c @@ -190,6 +190,8 @@ static const AVOption options[] = { OFFSET(extra_sei), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, { "intra_refresh", "Use Periodic Intra Refresh instead of IDR frames.", OFFSET(intra_refresh),AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + { "single_slice_intra_refresh", "Use single slice intra refresh.", + OFFSET(single_slice_intra_refresh), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { NULL } }; diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index 6814fe1..8c89d6e 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -171,6 +171,8 @@ static const AVOption options[] = { OFFSET(extra_sei), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, { "intra_refresh", "Use Periodic Intra Refresh instead of IDR frames.", OFFSET(intra_refresh),AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + { "single_slice_intra_refresh", "Use single slice intra refresh.", + OFFSET(single_slice_intra_refresh), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { NULL } };