From patchwork Fri Jul 16 16:09:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jai Luthra X-Patchwork-Id: 28940 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp1910408ios; Fri, 16 Jul 2021 09:09:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzCc5H/jRkufIvzDGt/dL3roNNgBYWayo6SEKDlTF7ZBidWVsfiemKd5NyvZpKRFT/U/nG3 X-Received: by 2002:a05:6402:3584:: with SMTP id y4mr12565302edc.218.1626451799442; Fri, 16 Jul 2021 09:09:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626451799; cv=none; d=google.com; s=arc-20160816; b=bPAbHKJsd8owKJh+j1iCEMwwDmz/euRl+TyA3KLC59ydb2ATkiouFJJz7z32KTTrVB MEce7GzvO+yIGQCl8vb1T8HkXlMMXtZUi3MAu6zFgZdvE1JGB9ZF9l6PFv2e2IO8i2gi uJRyfuEeUjN9HqfBQoHTYt/EF4DCqzE7DcDt1zN36476/gvq8LmEZLZsjtm/kJOvBouS f6Luxic6XZjS+n4d6bYeXwVadZyOk2DAz5rlARIaVER0uyp1vIBf9lVbBoOxTdFvOvKJ YW1wzBFanwT2Ltpi/cdECtl+oN674wsXEJGJsFfnAMKDGEDi1KUUmcn7DYoA7L+O5Qr2 Bnow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; 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:dkim-signature:delivered-to; bh=RaDKMc86I3bj7b9EnAArfd18P5iLA9OgDtZYpRloB/w=; b=e13CL+nZsKGLzoY0KiPA1iSIU6mMDG67dVbfDK4NQt8quuwgSaxZX2mUzDmqsndFxd kz73NEkZgagDXiNulzrUbYwOeTtVopW8ZJZHSV5NvTWTLtG0wwdSkozG1Ps5tAbe7bNd QYQ0d261v0aPfc9MTLIT4/tnjW8q4d8IVcGFoOASiPCVaS2sA9mcc7822z+kPjMR1v9T dde9itN8kTTVVcg26QLQ9rqY+9l+BrGiunbyVTXB5TkAoZwqgJquiEfpv0Wi7FZbJVPj aJInTQ3x26c/Jgr5O5fWBNzeJrenCmKzFAa61xVZLbGJbgkpT5SfH0pSZsjeB46ZpTvD T99A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jailuthra.in header.s=fm2 header.b=UBgev7Qx; dkim=neutral (body hash did not verify) header.i=@messagingengine.com header.s=fm3 header.b=s57QsM5i; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x2si13903990ejy.385.2021.07.16.09.09.58; Fri, 16 Jul 2021 09:09:59 -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=@jailuthra.in header.s=fm2 header.b=UBgev7Qx; dkim=neutral (body hash did not verify) header.i=@messagingengine.com header.s=fm3 header.b=s57QsM5i; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 342DA689EB2; Fri, 16 Jul 2021 19:09:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from wout3-smtp.messagingengine.com (wout3-smtp.messagingengine.com [64.147.123.19]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 90D54689EB2 for ; Fri, 16 Jul 2021 19:09:48 +0300 (EEST) Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.west.internal (Postfix) with ESMTP id C697132000E5 for ; Fri, 16 Jul 2021 12:09:46 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Fri, 16 Jul 2021 12:09:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jailuthra.in; h= from:to:subject:date:message-id:mime-version :content-transfer-encoding; s=fm2; bh=tEnp7GaNHwMxkZcmdvPs/wvlm6 dscGxHwkYPlNfnqwk=; b=UBgev7QxliA9ifWBs1HPkE8a4AH34AGr2CGbDV2VxK s4XHqJSQVh/MaVkVHJl5OQhv+9zB2ozAnIduuf+fioiCV9OVcNajYmErieMir8/1 a5xhv84/oVs7G6AzOo0rjVG1I0KcXuSyNonnkJAuWeD5jZSr8yRFMIr9H8TSGaBk hEYKCbpgEMT8udEcqxB/915eczhXb2hfOnuUrZBpmadZsHWV4Hh7r76jrOa25lCc cR7kblWi8hDAhsE3Rov16uP2XuGuplikFPJK+IBg3ZYEad0cpBqD7cH8lrZ01Xqf /0c0Z4sCWEDMe6dzRwmE1+7B72198ysxg7WU6fKFQAWg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:date:from :message-id:mime-version:subject:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=tEnp7GaNHwMxkZcmd vPs/wvlm6dscGxHwkYPlNfnqwk=; b=s57QsM5iW+ihUba8pqcFeZRd2p+gKBXEH o9gptGkXj2v1mDF8pwZmnK5DYrsYnqCdQI17lHpwUONIV3+zo+r+0o2wlbgJqz2d OWHxg0tYrXZyVrvv1uUSoW58X/cGkvr6afnbbmNdDaQGvsGI00cT7tW+6iKvVZTF 9o7A1em9Y2omVSabbW6gi0KqhbhZeldHUqsXFnuPY9rKZj+yu8rJ0dnAU8wgD8aW l0u1jUo8Ty14kaip++lkU6TgujtT+yLYzvvyN5hdcfFA28VAuAhAlP8TK5bW/pfD QvKyD0sjNCTZ+yMBjrc6E+pt6glHTq9/hUifTNZAvnTrJTYL9gDzQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddrvdefgdelfecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhephffvufffkffoggfgsedtkeertdertd dtnecuhfhrohhmpeflrghiucfnuhhthhhrrgcuoehmvgesjhgrihhluhhthhhrrgdrihhn qeenucggtffrrghtthgvrhhnpeevffefteegfffhteeijedugfeiheeftdelkeetvdettd eijeehffehudefveegheenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgr ihhlfhhrohhmpehmvgesjhgrihhluhhthhhrrgdrihhn X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Fri, 16 Jul 2021 12:09:44 -0400 (EDT) From: Jai Luthra To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Jul 2021 21:39:42 +0530 Message-Id: <20210716160942.266207-1-me@jailuthra.in> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avcodec/nvenc: fix flushing for encoder-reuse 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: FLYHfa58zgNj Recent encode API restructure (827d6fe73d) removed some state - which broke the API for flushing without closing the encoder. This functionality was originally added in 3ea7057677 and is useful for segmented video, where we don't want to do expensive re-init of HW sessions for every segment. --- v2: Forgot to rebase off master in v1 libavcodec/nvenc.c | 16 +++++++++++----- libavcodec/nvenc.h | 2 ++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index ee046b9cef..ee0beb4795 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -2281,6 +2281,11 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) return AVERROR(EINVAL); if (frame && frame->buf[0]) { + if (ctx->encoder_flushing) { + ctx->encoder_flushing = 0; + av_fifo_reset(ctx->timestamp_list); + } + in_surf = get_free_frame(ctx); if (!in_surf) return AVERROR(EAGAIN); @@ -2335,6 +2340,7 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) nvenc_codec_specific_pic_params(avctx, &pic_params, ctx->sei_data, sei_count); } else { pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS; + ctx->encoder_flushing = 1; } res = nvenc_push_context(avctx); @@ -2384,8 +2390,11 @@ int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt) if (!frame->buf[0]) { res = ff_encode_get_frame(avctx, frame); - if (res < 0 && res != AVERROR_EOF) + if (res == AVERROR_EOF || (ctx->encoder_flushing && res == AVERROR(EAGAIN))) { + // flushing mode, continue to send packets + } else if (res < 0) { return res; + } } res = nvenc_send_frame(avctx, frame); @@ -2395,7 +2404,7 @@ int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt) } else av_frame_unref(frame); - if (output_ready(avctx, avctx->internal->draining)) { + if (output_ready(avctx, ctx->encoder_flushing)) { av_fifo_generic_read(ctx->output_surface_ready_queue, &tmp_out_surf, sizeof(tmp_out_surf), NULL); res = nvenc_push_context(avctx); @@ -2423,8 +2432,5 @@ int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt) av_cold void ff_nvenc_encode_flush(AVCodecContext *avctx) { - NvencContext *ctx = avctx->priv_data; - nvenc_send_frame(avctx, NULL); - av_fifo_reset(ctx->timestamp_list); } diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index 85d3a33601..6af3aaf0ce 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -169,6 +169,8 @@ typedef struct NvencContext NV_ENC_SEI_PAYLOAD *sei_data; int sei_data_size; + int encoder_flushing; + struct { void *ptr; int ptr_index;