From: Timo Rothenpieler <timo@rothenpieler.org> To: ffmpeg-devel@ffmpeg.org Cc: Diego de Souza <ddesouza@nvidia.com> Subject: [FFmpeg-devel] [PATCH 3/9] avcodec/cuviddec: add HEVC/H.264 4:2:2 and H.264 10-bit support Date: Thu, 30 Jan 2025 20:40:40 +0100 Message-ID: <20250130194124.21836-4-timo@rothenpieler.org> (raw) In-Reply-To: <20250130194124.21836-1-timo@rothenpieler.org> From: Diego de Souza <ddesouza@nvidia.com> This commit adds support for 4:2:2 decoding for HEVC and H.264 on NVIDIA Blackwell GPUs for cuviddec. Moreover, it supports 10-bit decoding for H.264 on Blackwell GPUs. Signed-off-by: Diego de Souza <ddesouza@nvidia.com> --- libavcodec/cuviddec.c | 83 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index 502bcc7fc2..67076a1752 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -178,15 +178,39 @@ static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT* form switch (format->bit_depth_luma_minus8) { case 0: // 8-bit - pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_NV12; + if (chroma_444) { + pix_fmts[1] = AV_PIX_FMT_YUV444P; +#ifdef NVDEC_HAVE_422_SUPPORT + } else if (format->chroma_format == cudaVideoChromaFormat_422) { + pix_fmts[1] = AV_PIX_FMT_NV16; +#endif + } else { + pix_fmts[1] = AV_PIX_FMT_NV12; + } caps = &ctx->caps8; break; case 2: // 10-bit - pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P010; + if (chroma_444) { + pix_fmts[1] = AV_PIX_FMT_YUV444P16; +#ifdef NVDEC_HAVE_422_SUPPORT + } else if (format->chroma_format == cudaVideoChromaFormat_422) { + pix_fmts[1] = AV_PIX_FMT_P216LE; +#endif + } else { + pix_fmts[1] = AV_PIX_FMT_P016; + } caps = &ctx->caps10; break; case 4: // 12-bit - pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P016; + if (chroma_444) { + pix_fmts[1] = AV_PIX_FMT_YUV444P16; +#ifdef NVDEC_HAVE_422_SUPPORT + } else if (format->chroma_format == cudaVideoChromaFormat_422) { + pix_fmts[1] = AV_PIX_FMT_P216LE; +#endif + } else { + pix_fmts[1] = AV_PIX_FMT_P016; + } caps = &ctx->caps12; break; default: @@ -304,6 +328,14 @@ static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT* form case AV_PIX_FMT_P016: cuinfo.OutputFormat = cudaVideoSurfaceFormat_P016; break; +#ifdef NVDEC_HAVE_422_SUPPORT + case AV_PIX_FMT_NV16: + cuinfo.OutputFormat = cudaVideoSurfaceFormat_NV16; + break; + case AV_PIX_FMT_P216: + cuinfo.OutputFormat = cudaVideoSurfaceFormat_P216; + break; +#endif case AV_PIX_FMT_YUV444P: cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444; break; @@ -578,6 +610,10 @@ static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame) } else if (avctx->pix_fmt == AV_PIX_FMT_NV12 || avctx->pix_fmt == AV_PIX_FMT_P010 || avctx->pix_fmt == AV_PIX_FMT_P016 || +#ifdef NVDEC_HAVE_422_SUPPORT + avctx->pix_fmt == AV_PIX_FMT_NV16 || + avctx->pix_fmt == AV_PIX_FMT_P216 || +#endif avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUV444P16) { unsigned int offset = 0; @@ -734,6 +770,7 @@ static int cuvid_test_capabilities(AVCodecContext *avctx, { CuvidContext *ctx = avctx->priv_data; CUVIDDECODECAPS *caps; + cudaVideoChromaFormat chroma_format; int res8 = 0, res10 = 0, res12 = 0; if (!ctx->cvdl->cuvidGetDecoderCaps) { @@ -753,8 +790,28 @@ static int cuvid_test_capabilities(AVCodecContext *avctx, ctx->caps8.eCodecType = ctx->caps10.eCodecType = ctx->caps12.eCodecType = cuparseinfo->CodecType; + switch (avctx->pix_fmt) { + case AV_PIX_FMT_YUV444P16: + case AV_PIX_FMT_YUV444P: + chroma_format = cudaVideoChromaFormat_444; + break; +#ifdef NVDEC_HAVE_422_SUPPORT + case AV_PIX_FMT_P216: + case AV_PIX_FMT_P210: + case AV_PIX_FMT_NV16: + chroma_format = cudaVideoChromaFormat_422; + break; +#endif + case AV_PIX_FMT_P016: + case AV_PIX_FMT_P010: + case AV_PIX_FMT_NV12: + chroma_format = cudaVideoChromaFormat_420; + break; + default: + chroma_format = cudaVideoChromaFormat_Monochrome; + } ctx->caps8.eChromaFormat = ctx->caps10.eChromaFormat = ctx->caps12.eChromaFormat - = cudaVideoChromaFormat_420; + = chroma_format; ctx->caps8.nBitDepthMinus8 = 0; ctx->caps10.nBitDepthMinus8 = 2; @@ -790,12 +847,12 @@ static int cuvid_test_capabilities(AVCodecContext *avctx, } if (!ctx->caps8.bIsSupported) { - av_log(avctx, AV_LOG_ERROR, "Codec %s is not supported.\n", avctx->codec->name); + av_log(avctx, AV_LOG_ERROR, "Codec %s is not supported with this chroma format.\n", avctx->codec->name); return AVERROR(EINVAL); } if (!caps->bIsSupported) { - av_log(avctx, AV_LOG_ERROR, "Bit depth %d is not supported.\n", bit_depth); + av_log(avctx, AV_LOG_ERROR, "Bit depth %d with this chroma format is not supported.\n", bit_depth); return AVERROR(EINVAL); } @@ -839,7 +896,7 @@ static av_cold int cuvid_decode_init(AVCodecContext *avctx) int probed_width = avctx->coded_width ? avctx->coded_width : 1280; int probed_height = avctx->coded_height ? avctx->coded_height : 720; - int probed_bit_depth = 8, is_yuv444 = 0; + int probed_bit_depth = 8, is_yuv444 = 0, is_yuv422 = 0; const AVPixFmtDescriptor *probe_desc = av_pix_fmt_desc_get(avctx->pix_fmt); if (probe_desc && probe_desc->nb_components) @@ -848,17 +905,21 @@ static av_cold int cuvid_decode_init(AVCodecContext *avctx) if (probe_desc && !probe_desc->log2_chroma_w && !probe_desc->log2_chroma_h) is_yuv444 = 1; +#ifdef NVDEC_HAVE_422_SUPPORT + if (probe_desc && probe_desc->log2_chroma_w && !probe_desc->log2_chroma_h) + is_yuv422 = 1; +#endif + // Pick pixel format based on bit depth and chroma sampling. - // Only 420 and 444 sampling are supported by HW so far, no need to check for 422. switch (probed_bit_depth) { case 10: - pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P010; + pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P16 : (is_yuv422 ? AV_PIX_FMT_P216 : AV_PIX_FMT_P010); break; case 12: - pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P016; + pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P16 : (is_yuv422 ? AV_PIX_FMT_P216 : AV_PIX_FMT_P016); break; default: - pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_NV12; + pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P : (is_yuv422 ? AV_PIX_FMT_NV16 : AV_PIX_FMT_NV12); break; } -- 2.45.2 _______________________________________________ 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:[~2025-01-30 19:42 UTC|newest] Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-01-30 19:40 [FFmpeg-devel] [PATCH 0/9] Nvidia Video Codec SDK 13.0 support Timo Rothenpieler 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 1/9] avutil/hwcontext_cuda: add 4:2:2 pixel format support Timo Rothenpieler 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 2/9] avcodec/nvdec: add 4:2:2 decoding and 10-bit support Timo Rothenpieler 2025-01-30 19:40 ` Timo Rothenpieler [this message] 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 4/9] avcodec/nvenc: add 4:2:2 encoding and H.264 " Timo Rothenpieler 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 5/9] avcodec/nvenc: add UHQ to AV1 for NVENC Timo Rothenpieler 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 6/9] avcodec/nvenc: add Temporal Filtering for AV1 and H.264 in NVENC Timo Rothenpieler 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 7/9] avcodec/nvenc: add MV-HEVC encoding support Timo Rothenpieler 2025-01-30 20:17 ` James Almer 2025-01-30 23:23 ` [FFmpeg-devel] [PATCH v2 " Timo Rothenpieler 2025-01-31 3:26 ` James Almer 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 8/9] avcodec/nvenc: use encoder level options for qmin/qmax Timo Rothenpieler 2025-01-31 6:16 ` Zhao Zhili 2025-01-31 13:20 ` Timo Rothenpieler 2025-01-30 19:40 ` [FFmpeg-devel] [PATCH 9/9] avcodec/nvenc: finalize SDK 13.0 support Timo Rothenpieler 2025-02-01 21:15 ` [FFmpeg-devel] [PATCH 0/9] Nvidia Video Codec " Timo Rothenpieler 2025-02-02 19:05 ` 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=20250130194124.21836-4-timo@rothenpieler.org \ --to=timo@rothenpieler.org \ --cc=ddesouza@nvidia.com \ --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