From: Timo Rothenpieler <timo@rothenpieler.org>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH v2] avcodec/nvenc: High bit depth encoding for HEVC
Date: Fri, 19 Apr 2024 13:55:50 +0200
Message-ID: <d13332c1-c08e-4d53-add9-a829dfbfb14c@rothenpieler.org> (raw)
In-Reply-To: <Nvq6fhr--3-9@lynne.ee>
On 19/04/2024 13:29, Lynne wrote:
> Apr 19, 2024, 10:39 by ffmpeg-devel@ffmpeg.org:
>
>> From: Diego Felix de Souza <ddesouza@nvidia.com>
>>
>> Adding 10-bit encoding support for HEVC if the input is 8-bit. In
>> case of 8-bit input content, NVENC performs an internal CUDA 8 to
>> 10-bit conversion of the input prior to encoding. Currently, only
>> AV1 supports encoding 8-bit content as 10-bit.
>>
>> Signed-off-by: Diego Felix de Souza <ddesouza@nvidia.com>
>> ---
>> libavcodec/nvenc.c | 10 +++++-----
>> libavcodec/nvenc_hevc.c | 3 +++
>> 2 files changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
>> index 794174a53f..e48224347d 100644
>> --- a/libavcodec/nvenc.c
>> +++ b/libavcodec/nvenc.c
>> @@ -514,7 +514,7 @@ static int nvenc_check_capabilities(AVCodecContext *avctx)
>> }
>>
>> ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_10BIT_ENCODE);
>> - if (IS_10BIT(ctx->data_pix_fmt) && ret <= 0) {
>> + if ((IS_10BIT(ctx->data_pix_fmt) || ctx->highbitdepth) && ret <= 0) {
>> av_log(avctx, AV_LOG_WARNING, "10 bit encode not supported\n");
>> return AVERROR(ENOSYS);
>> }
>> @@ -1420,8 +1420,8 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx)
>> break;
>> }
>>
>> - // force setting profile as main10 if input is 10 bit
>> - if (IS_10BIT(ctx->data_pix_fmt)) {
>> + // force setting profile as main10 if input is 10 bit or if it should be encoded as 10 bit
>> + if (IS_10BIT(ctx->data_pix_fmt) || ctx->highbitdepth) {
>> cc->profileGUID = NV_ENC_HEVC_PROFILE_MAIN10_GUID;
>> avctx->profile = AV_PROFILE_HEVC_MAIN_10;
>> }
>> @@ -1435,8 +1435,8 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx)
>> hevc->chromaFormatIDC = IS_YUV444(ctx->data_pix_fmt) ? 3 : 1;
>>
>> #ifdef NVENC_HAVE_NEW_BIT_DEPTH_API
>> - hevc->inputBitDepth = hevc->outputBitDepth =
>> - IS_10BIT(ctx->data_pix_fmt) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
>> + hevc->inputBitDepth = IS_10BIT(ctx->data_pix_fmt) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
>> + hevc->outputBitDepth = (IS_10BIT(ctx->data_pix_fmt) || ctx->highbitdepth) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
>> #else
>> hevc->pixelBitDepthMinus8 = IS_10BIT(ctx->data_pix_fmt) ? 2 : 0;
>> #endif
>> diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
>> index b949cb1bd7..d54e5f2512 100644
>> --- a/libavcodec/nvenc_hevc.c
>> +++ b/libavcodec/nvenc_hevc.c
>> @@ -183,6 +183,9 @@ static const AVOption options[] = {
>> { "fullres", "Two Pass encoding is enabled where first Pass is full resolution",
>> 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TWO_PASS_FULL_RESOLUTION }, 0, 0, VE, .unit = "multipass" },
>> #endif
>> +#ifdef NVENC_HAVE_NEW_BIT_DEPTH_API
>> + { "highbitdepth", "Enable 10 bit encode for 8 bit input",OFFSET(highbitdepth),AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
>> +#endif
>> #ifdef NVENC_HAVE_LDKFS
>> { "ldkfs", "Low delay key frame scale; Specifies the Scene Change frame size increase allowed in case of single frame VBV and CBR",
>> OFFSET(ldkfs), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UCHAR_MAX, VE },
>> --
>> 2.34.1
>>
>
> Rather than introducing a new setting, could you
> instead use AVCodecContext.sw_pix_fmt?
> It's currently documented as being unused for encoding,
> but it fits the purpose.
> Vulkan can also use it.
I'm not sure I'm a fan of that.
Setting sw_pix_fmt to some arbitrary 10bit format seems super random.
How would that even look like from a users point of view who wanted to
utilize this up-conversion mode via cli?
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2024-04-19 11:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-15 14:39 [FFmpeg-devel] [PATCH] " Diego Felix de Souza via ffmpeg-devel
2024-04-17 14:27 ` Timo Rothenpieler
2024-04-18 10:43 ` Diego Felix de Souza via ffmpeg-devel
2024-04-18 12:29 ` Roman Arzumanyan
2024-04-18 13:33 ` Timo Rothenpieler
2024-04-19 7:39 ` Roman Arzumanyan
2024-04-19 8:33 ` Diego Felix de Souza via ffmpeg-devel
2024-04-19 8:38 ` [FFmpeg-devel] [PATCH v2] " Diego Felix de Souza via ffmpeg-devel
2024-04-19 11:29 ` Lynne
2024-04-19 11:55 ` Timo Rothenpieler [this message]
2024-04-24 22:43 ` Timo Rothenpieler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d13332c1-c08e-4d53-add9-a829dfbfb14c@rothenpieler.org \
--to=timo@rothenpieler.org \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git