From patchwork Tue Sep 6 23:02:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sven C. Dack" X-Patchwork-Id: 456 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp20350vsd; Tue, 6 Sep 2016 16:02:22 -0700 (PDT) X-Received: by 10.194.109.161 with SMTP id ht1mr23494473wjb.190.1473202942138; Tue, 06 Sep 2016 16:02:22 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w66si1162436wme.12.2016.09.06.16.02.21; Tue, 06 Sep 2016 16:02:22 -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=@sky.com; 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 7E6A0680C81; Wed, 7 Sep 2016 02:02:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from nm4-vm5.bullet.mail.ir2.yahoo.com (nm4-vm5.bullet.mail.ir2.yahoo.com [212.82.96.103]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AE68768A02F for ; Wed, 7 Sep 2016 02:02:02 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sky.com; s=s1024; t=1473202931; bh=uXgljYP1VLAKOb7lAdsEqO8rsFw45dFN3JCPJOk6dnI=; h=To:From:Subject:Date:From:Subject; b=L2r4kFMX1XIc2xN/GArAdopQlgmg7D/U3Vl6HdRvS5spPwrvlThU7yZg0GwB4Ugbk/XtgS7W2EItqvPOy61u/cdV7MJRfVxlpoBvmNDuqZmroKFXU8tAgv8yUTO+mJzpjUpYY+rKK184vTrDPCMze8wBGjcxDG5PIX7jKS1wgjI= Received: from [212.82.98.124] by nm4.bullet.mail.ir2.yahoo.com with NNFMP; 06 Sep 2016 23:02:11 -0000 Received: from [46.228.39.77] by tm17.bullet.mail.ir2.yahoo.com with NNFMP; 06 Sep 2016 23:02:11 -0000 Received: from [127.0.0.1] by smtp114.mail.ir2.yahoo.com with NNFMP; 06 Sep 2016 23:02:11 -0000 X-Yahoo-Newman-Id: 160820.12789.bm@smtp114.mail.ir2.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: CT8B4CQVM1k6zY3Jsyxd.sGow7u70DEYanR.tU4ONkNDs3t 1aP.djFZ7RXoFNJBZhG74Oyy207mgM5gP1obRA5ZqGcYYJxH.ynm0tAxUk0F V_m0FXu0x7Hvi1fjneQ2KUHG41Re5NdUd30xh7mzbbNMCG40CZmCVhqZ2qcX PyO4lQAy6M45nI_q_8t27vlgJomkNn_rd8y_AFPIYacdtFUdGZiD_3oqRQU2 yVesaxV0ujNWTjKkZU74uIUn90tq513L4Vm44el6yKtBrzJbn6C4E7kdR4rB Dl.UzJ6f3Mz8k3s3XE_iOooSzzxSKHR._sKzaK8k.0e5fNxCBpOM5PSOzvK9 pdGfMp7osdpYueL5_593Pt50UxK74Y5DmOsIMjBmJUhybtnSNKQF6rDf0YvN _kL_GVuLF.8Zju1G3vs4FJnfScHl1kFDbJpMa.JTenmGwIdLO_g.dkkF_Ze9 OOogCgvthdHWKhEG1Utl30Wbn8dzpdiO6RWdpC5xlpRKLIpu5LvNs.V72GX6 6aHcxOpjYWA0KSDjMck_OjMqy2c69m2b0Ujj2VGyn X-Yahoo-SMTP: vPZU.OKswBC.RMkOW9onWi6Zk8BriyC1yj0kMdBuqpLuLjitZVXhzK.Ofd5b To: ffmpeg-devel@ffmpeg.org From: "Sven C. Dack" Message-ID: <67a158c2-8043-50ab-c3f4-3bbf805deedb@sky.com> Date: Wed, 7 Sep 2016 00:02:08 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.2.0 MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] adding RGBA and BGRA to nvenc.c X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" Hello, I haven't been sending patches in ages. Can somebody walk me through? The patch is a "low hanging fruit" and simply adds the pixel formats RGBA and BGRA to the Nvidia encoder "nvenc", which supports these two formats natively. The gain here is that when one grabs the screen with x11grab and chains it through the encoder does it no longer require a RGB->YUV conversion and so speeds up live streaming (i.e. from 47fp/s to 62fp/s). Note the twist in AV_PIX_FMT_RGBA versus NV_ENC_BUFFER_FORMAT_ABGR. This is intentionally. Thanks, Sven return AVERROR(EINVAL); @@ -1350,6 +1360,14 @@ static int nvenc_copy_frame(AVCodecContext *avctx, NvencSurface *inSurf, av_image_copy_plane(buf, lockBufferParams->pitch, frame->data[2], frame->linesize[2], avctx->width << 1, avctx->height); + } else if (frame->format == AV_PIX_FMT_RGBA) { + av_image_copy_plane(buf, lockBufferParams->pitch, + frame->data[0], frame->linesize[0], + avctx->width << 2, avctx->height); + } else if (frame->format == AV_PIX_FMT_BGRA) { + av_image_copy_plane(buf, lockBufferParams->pitch, + frame->data[0], frame->linesize[0], + avctx->width << 2, avctx->height); } else { av_log(avctx, AV_LOG_FATAL, "Invalid pixel format!\n"); return AVERROR(EINVAL); --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -81,6 +81,8 @@ const enum AVPixelFormat ff_nvenc_pix_fmts[] = { AV_PIX_FMT_P010, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV444P16, + AV_PIX_FMT_RGBA, + AV_PIX_FMT_BGRA, #if CONFIG_CUDA AV_PIX_FMT_CUDA, #endif @@ -1032,6 +1034,14 @@ static av_cold int nvenc_alloc_surface(AVCodecContext *avctx, int idx) ctx->surfaces[idx].format = NV_ENC_BUFFER_FORMAT_YUV444_10BIT; break; + case AV_PIX_FMT_RGBA: + ctx->surfaces[idx].format = NV_ENC_BUFFER_FORMAT_ABGR; + break; + + case AV_PIX_FMT_BGRA: + ctx->surfaces[idx].format = NV_ENC_BUFFER_FORMAT_ARGB; + break; + default: av_log(avctx, AV_LOG_FATAL, "Invalid input pixel format\n");