From patchwork Wed May 22 06:59:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 13240 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 857DF44892D for ; Wed, 22 May 2019 10:07:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6674D688370; Wed, 22 May 2019 10:07:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f196.google.com (mail-pg1-f196.google.com [209.85.215.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DD03868A3DF for ; Wed, 22 May 2019 10:07:05 +0300 (EEST) Received: by mail-pg1-f196.google.com with SMTP id e17so689051pgo.9 for ; Wed, 22 May 2019 00:07:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zeT1FW7yN6OHXDWXy4GJKD/kNArnWQei8xg/3jHNhdA=; b=rjo3HguJumphjyZy726umvEuhOreGBvdr42el31OTsV4BahieA5oozsj/PpW5CuzuF 6QcZFHEeJl10en0WpBxs5ZDmgFDbvkzDfrm/WD/2tgdFA8pxbC/f3+4yNoUfoyaf5X+M np0RzAz2HyPsOJUYzAhgKsbHUq08uAiohPV236AUS0fn2e4YW+d1peWmX4G4aJ0+wEkD XQR3FVY5q9MTvgH29fK4qCSENK80Nw+DAdLBMmE5F4MU5VdEWSeBrm2MAUDLcY0FrmuV GnNMrDBrPP2RN2mt3QTjc8PUJ5cUChyS2v0qXgPftKLNCG8fJXRO1EdDLN9xTzlSpYxG pKBw== 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:mime-version:content-transfer-encoding; bh=zeT1FW7yN6OHXDWXy4GJKD/kNArnWQei8xg/3jHNhdA=; b=J2EdQYoDl435s9G2lFm1V03dzD+MOhmE7YRgtUe+mduHkgXrjssz2c/QpV16rsRQQ1 iD+ldlUMrGld8ryfHKmULcOBAfkYhoOktvPIHcqyrMxtqMaEQ8s1iKY2m2wwpqJ4PqbH ZMWRTRoGTHGUyynYAiWXYF+7XrWctvErJrhZERu9d0bABZZkFTNzJkkQrkIShbAjB0sP 74fchEmdcdng4KFj0ywRzrjWfYFZY/uLl9lN9O4ugPiofHghARzouqQwh0xI4e+0aDFD pXBGFVyQB/WXjispidgKXLLhl85oEkNkvRM7b22yliMyNUOg7dyG4xN9mQk9vnCxUu4x OwrQ== X-Gm-Message-State: APjAAAWo3nK3dlUlfzK3DKX7n9NAxRb2+2h44BgfOhBS757PmBMErsaa 636eNXjZoTs2A2DZKpHzMdlTqoAZFyo= X-Google-Smtp-Source: APXvYqz8KNfOyQBz2cRr4/bgJKWE3NxESTVd8EQX6/wP8B2pPdx6Xz0VGOOmQjFhrxZbIUyeIUZ2Cw== X-Received: by 2002:a65:48ca:: with SMTP id o10mr88258725pgs.136.1558508441474; Wed, 22 May 2019 00:00:41 -0700 (PDT) Received: from localhost.localdomain ([47.90.99.151]) by smtp.gmail.com with ESMTPSA id k67sm34662706pfb.44.2019.05.22.00.00.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 22 May 2019 00:00:41 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 May 2019 14:59:54 +0800 Message-Id: <20190522065954.62328-3-lance.lmwang@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190522065954.62328-1-lance.lmwang@gmail.com> References: <20190522065954.62328-1-lance.lmwang@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] avcodec/nvenc: add more sei support for SDR HLG 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 Cc: Limin Wang , timo@rothenpieler.org Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Limin Wang The testing command for the HLG output with nvenc: ./ffmpeg_g -y -i 4K.mp4 -c:v hevc_nvenc -g 7 -color_primaries bt2020 -colorspace bt2020_ncl -color_trc smpte2084 -sei hlg test.ts --- libavcodec/nvenc.c | 24 ++++++++++++++++++++++++ libavcodec/nvenc.h | 1 + libavcodec/nvenc_hevc.c | 3 +++ 3 files changed, 28 insertions(+) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 3fd0eca4a5..239788b2d7 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -1019,6 +1019,10 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx) vui->colourMatrix = avctx->colorspace; vui->colourPrimaries = avctx->color_primaries; vui->transferCharacteristics = avctx->color_trc; + if (ctx->sei & SEI_ALTER_TRANSFER_CHAR) { + if (IS_10BIT(ctx->data_pix_fmt)) + vui->transferCharacteristics = AVCOL_TRC_BT2020_10; + } vui->videoFullRangeFlag = (avctx->color_range == AVCOL_RANGE_JPEG || ctx->data_pix_fmt == AV_PIX_FMT_YUVJ420P || ctx->data_pix_fmt == AV_PIX_FMT_YUVJ422P || ctx->data_pix_fmt == AV_PIX_FMT_YUVJ444P); @@ -2239,6 +2243,26 @@ int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) } } + if (ctx->sei & SEI_ALTER_TRANSFER_CHAR) { + if (avctx->codec->id == AV_CODEC_ID_HEVC) { + size_t transfer_sei_size = sizeof(H265RawSEIAlternativeTransferCharacteristics); + H265RawSEIAlternativeTransferCharacteristics transfer_data; + transfer_data.preferred_transfer_characteristics = AVCOL_TRC_ARIB_STD_B67; + + sei_data[sei_count].payloadSize = transfer_sei_size; + sei_data[sei_count].payloadType = HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS; + sei_data[sei_count].payload = av_malloc(transfer_sei_size); + if (sei_data[sei_count].payload) { + PutBitContext pb; + init_put_bits(&pb, sei_data[sei_count].payload, sei_data[sei_count].payloadSize); + put_bits(&pb, 8, transfer_data.preferred_transfer_characteristics); + flush_put_bits(&pb); + + sei_count ++; + } + } + } + nvenc_codec_specific_pic_params(avctx, &pic_params, sei_data, sei_count); } else { pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS; diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index 583c48d090..8be0d341ea 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -55,6 +55,7 @@ typedef void ID3D11Device; #endif enum { + SEI_ALTER_TRANSFER_CHAR = 0x04, SEI_MASTERING_DISPLAY = 0x08, SEI_CONTENT_LIGHT_LEVEL = 0x10, }; diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index 74ebd03d8e..23ba593439 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -134,6 +134,9 @@ static const AVOption options[] = { { "hdr10","Include HDR metadata for mastering display colour volume and content light level information", 0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL }, 0, 0, VE, "sei" }, + { "hlg","Include HLG metadata for alternative transfer characteristics", + 0, AV_OPT_TYPE_CONST, { .i64 = SEI_ALTER_TRANSFER_CHAR }, + 0, 0, VE, "sei" }, { "master_display", "SMPTE ST 2086 master display color volume info SEI (HDR), the string format is: \"G(x,y)B(x,y)R(x,y)WP(x,y)L(max,min)\"", OFFSET(master_display), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VE }, { "max_cll", "content light level info, the string format is: \"cll, fall\"",