diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 1811ef9525..392230526d 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -337,6 +337,16 @@ static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level) av_log(avctx, level, "The minimum required Nvidia driver for nvenc is %s or newer\n", minver); } +#if NVENCAPI_CHECK_VERSION(12, 0) +#define to_nv_color_matrix(n) (NV_ENC_VUI_MATRIX_COEFFS)(n) +#define to_nv_color_pri(n) (NV_ENC_VUI_COLOR_PRIMARIES)(n) +#define to_nv_color_trc(n) (NV_ENC_VUI_TRANSFER_CHARACTERISTIC)(n) +#else +#define to_nv_color_matrix(n) (uint32_t)(n) +#define to_nv_color_pri(n) (uint32_t)(n) +#define to_nv_color_trc(n) (uint32_t)(n) +#endif + static av_cold int nvenc_load_libraries(AVCodecContext *avctx) { NvencContext *ctx = avctx->priv_data; @@ -1266,14 +1276,14 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx) const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(ctx->data_pix_fmt); if ((pixdesc->flags & AV_PIX_FMT_FLAG_RGB) && !IS_GBRP(ctx->data_pix_fmt)) { - vui->colourMatrix = AVCOL_SPC_BT470BG; - vui->colourPrimaries = avctx->color_primaries; - vui->transferCharacteristics = avctx->color_trc; + vui->colourMatrix = to_nv_color_matrix(AVCOL_SPC_BT470BG); + vui->colourPrimaries = to_nv_color_pri(avctx->color_primaries); + vui->transferCharacteristics = to_nv_color_trc(avctx->color_trc); vui->videoFullRangeFlag = 0; } else { - vui->colourMatrix = IS_GBRP(ctx->data_pix_fmt) ? AVCOL_SPC_RGB : avctx->colorspace; - vui->colourPrimaries = avctx->color_primaries; - vui->transferCharacteristics = avctx->color_trc; + vui->colourMatrix = to_nv_color_matrix(IS_GBRP(ctx->data_pix_fmt) ? AVCOL_SPC_RGB : avctx->colorspace); + vui->colourPrimaries = to_nv_color_pri(avctx->color_primaries); + vui->transferCharacteristics = to_nv_color_trc(avctx->color_trc); 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); } @@ -1457,14 +1467,14 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx) const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(ctx->data_pix_fmt); if ((pixdesc->flags & AV_PIX_FMT_FLAG_RGB) && !IS_GBRP(ctx->data_pix_fmt)) { - vui->colourMatrix = AVCOL_SPC_BT470BG; - vui->colourPrimaries = avctx->color_primaries; - vui->transferCharacteristics = avctx->color_trc; + vui->colourMatrix = to_nv_color_matrix(AVCOL_SPC_BT470BG); + vui->colourPrimaries = to_nv_color_pri(avctx->color_primaries); + vui->transferCharacteristics = to_nv_color_trc(avctx->color_trc); vui->videoFullRangeFlag = 0; } else { - vui->colourMatrix = IS_GBRP(ctx->data_pix_fmt) ? AVCOL_SPC_RGB : avctx->colorspace; - vui->colourPrimaries = avctx->color_primaries; - vui->transferCharacteristics = avctx->color_trc; + vui->colourMatrix = to_nv_color_matrix(IS_GBRP(ctx->data_pix_fmt) ? AVCOL_SPC_RGB : avctx->colorspace); + vui->colourPrimaries = to_nv_color_pri(avctx->color_primaries); + vui->transferCharacteristics = to_nv_color_trc(avctx->color_trc); 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); } @@ -1655,14 +1665,14 @@ static av_cold int nvenc_setup_av1_config(AVCodecContext *avctx) const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(ctx->data_pix_fmt); if ((pixdesc->flags & AV_PIX_FMT_FLAG_RGB) && !IS_GBRP(ctx->data_pix_fmt)) { - av1->matrixCoefficients = AVCOL_SPC_BT470BG; - av1->colorPrimaries = avctx->color_primaries; - av1->transferCharacteristics = avctx->color_trc; + av1->matrixCoefficients = to_nv_color_matrix(AVCOL_SPC_BT470BG); + av1->colorPrimaries = to_nv_color_pri(avctx->color_primaries); + av1->transferCharacteristics = to_nv_color_trc(avctx->color_trc); av1->colorRange = 0; } else { - av1->matrixCoefficients = IS_GBRP(ctx->data_pix_fmt) ? AVCOL_SPC_RGB : avctx->colorspace; - av1->colorPrimaries = avctx->color_primaries; - av1->transferCharacteristics = avctx->color_trc; + av1->matrixCoefficients = to_nv_color_matrix(IS_GBRP(ctx->data_pix_fmt) ? AVCOL_SPC_RGB : avctx->colorspace); + av1->colorPrimaries = to_nv_color_pri(avctx->color_primaries); + av1->transferCharacteristics = to_nv_color_trc(avctx->color_trc); av1->colorRange = (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); }