| @@ -32,9 +32,9 @@ | |||
| #include "internal.h" | |||
| #define NVENC_CAP 0x30 | |||
| #define IS_CBR(rc) (rc == NV_ENC_PARAMS_RC_CBR || \ | |||
| rc == NV_ENC_PARAMS_RC_2_PASS_QUALITY || \ | |||
| rc == NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP) | |||
| #define IS_CBR(rc) (rc == NV_ENC_PARAMS_RC_CBR || \ | |||
| rc == NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ || \ | |||
| rc == NV_ENC_PARAMS_RC_CBR_HQ) | |||
| const enum AVPixelFormat ff_nvenc_pix_fmts[] = { | |||
| AV_PIX_FMT_YUV420P, | |||
| @@ -633,13 +633,13 @@ static void nvenc_override_rate_control(AVCodecContext *avctx) | |||
| return; | |||
| } | |||
| /* fall through */ | |||
| case NV_ENC_PARAMS_RC_2_PASS_VBR: | |||
| case NV_ENC_PARAMS_RC_VBR_HQ: | |||
| case NV_ENC_PARAMS_RC_VBR: | |||
| set_vbr(avctx); | |||
| break; | |||
| case NV_ENC_PARAMS_RC_CBR: | |||
| case NV_ENC_PARAMS_RC_2_PASS_QUALITY: | |||
| case NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP: | |||
| case NV_ENC_PARAMS_RC_CBR_HQ: | |||
| case NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ: | |||
| break; | |||
| } | |||
| @@ -715,19 +715,29 @@ static av_cold void nvenc_setup_rate_control(AVCodecContext *avctx) | |||
| if (ctx->cbr) { | |||
| if (ctx->twopass) { | |||
| ctx->rc = NV_ENC_PARAMS_RC_2_PASS_QUALITY; | |||
| ctx->rc = NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ; | |||
| } else { | |||
| ctx->rc = NV_ENC_PARAMS_RC_CBR; | |||
| } | |||
| } else if (ctx->cqp >= 0) { | |||
| ctx->rc = NV_ENC_PARAMS_RC_CONSTQP; | |||
| } else if (ctx->twopass) { | |||
| ctx->rc = NV_ENC_PARAMS_RC_2_PASS_VBR; | |||
| ctx->rc = NV_ENC_PARAMS_RC_VBR_HQ; | |||
| } else if (avctx->qmin >= 0 && avctx->qmax >= 0) { | |||
| ctx->rc = NV_ENC_PARAMS_RC_VBR_MINQP; | |||
| } | |||
| } | |||
| if (ctx->rc >= 0 && ctx->rc & RC_MODE_DEPRECATED) { | |||
| av_log(avctx, AV_LOG_WARNING, "Specified rc mode is deprecated.\n"); | |||
| av_log(avctx, AV_LOG_WARNING, "\tll_2pass_quality -> cbr_ld_hq\n"); | |||
| av_log(avctx, AV_LOG_WARNING, "\tll_2pass_size -> cbr_hq\n"); | |||
| av_log(avctx, AV_LOG_WARNING, "\tvbr_2pass -> vbr_hq\n"); | |||
| av_log(avctx, AV_LOG_WARNING, "\tvbr_minqp -> (no replacement)\n"); | |||
| ctx->rc &= ~RC_MODE_DEPRECATED; | |||
| } | |||
| if (ctx->flags & NVENC_LOSSLESS) { | |||
| set_lossless(avctx); | |||
| } else if (ctx->rc >= 0) { | |||
| @@ -830,9 +840,9 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx) | |||
| h264->outputPictureTimingSEI = 1; | |||
| } | |||
| if (cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_2_PASS_QUALITY || | |||
| cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP || | |||
| cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_2_PASS_VBR) { | |||
| if (cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ || | |||
| cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_CBR_HQ || | |||
| cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_VBR_HQ) { | |||
| h264->adaptiveTransformMode = NV_ENC_H264_ADAPTIVE_TRANSFORM_ENABLE; | |||
| h264->fmoMode = NV_ENC_H264_FMO_DISABLE; | |||
| } | |||
| @@ -30,6 +30,8 @@ | |||
| #include "avcodec.h" | |||
| #define MAX_REGISTERED_FRAMES 64 | |||
| #define RC_MODE_DEPRECATED 0x800000 | |||
| #define RCD(rc_mode) ((rc_mode) | RC_MODE_DEPRECATED) | |||
| typedef struct NvencSurface | |||
| { | |||
| @@ -68,16 +68,19 @@ static const AVOption options[] = { | |||
| { "5", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_5 }, 0, 0, VE, "level" }, | |||
| { "5.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_5 }, 0, 0, VE, "level" }, | |||
| { "5.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_51 }, 0, 0, VE, "level" }, | |||
| { "rc", "Override the preset rate-control", OFFSET(rc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, "rc" }, | |||
| { "constqp", "Constant QP mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0, VE, "rc" }, | |||
| { "vbr", "Variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0, VE, "rc" }, | |||
| { "cbr", "Constant bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0, VE, "rc" }, | |||
| { "vbr_minqp", "Variable bitrate mode with MinQP", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR_MINQP }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_quality", "Multi-pass optimized for image quality (only for low-latency presets)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_QUALITY }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_size", "Multi-pass optimized for constant frame size (only for low-latency presets)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP }, 0, 0, VE, "rc" }, | |||
| { "vbr_2pass", "Multi-pass variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_VBR }, 0, 0, VE, "rc" }, | |||
| { "rc", "Override the preset rate-control", OFFSET(rc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, "rc" }, | |||
| { "constqp", "Constant QP mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0, VE, "rc" }, | |||
| { "vbr", "Variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0, VE, "rc" }, | |||
| { "cbr", "Constant bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0, VE, "rc" }, | |||
| { "vbr_minqp", "Variable bitrate mode with MinQP (deprecated)", 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_VBR_MINQP) }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_quality", "Multi-pass optimized for image quality (deprecated)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_2_PASS_QUALITY) }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_size", "Multi-pass optimized for constant frame size (deprecated)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP) }, 0, 0, VE, "rc" }, | |||
| { "vbr_2pass", "Multi-pass variable bitrate mode (deprecated)", 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_2_PASS_VBR) }, 0, 0, VE, "rc" }, | |||
| { "cbr_ld_hq", "Constant bitrate low delay high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ }, 0, 0, VE, "rc" }, | |||
| { "cbr_hq", "Constant bitrate high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR_HQ }, 0, 0, VE, "rc" }, | |||
| { "vbr_hq", "Variable bitrate high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR_HQ }, 0, 0, VE, "rc" }, | |||
| { "rc-lookahead", "Number of frames to look ahead for rate-control", | |||
| OFFSET(rc_lookahead), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, | |||
| { "surfaces", "Number of concurrent surfaces", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MAX_REGISTERED_FRAMES, VE }, | |||
| @@ -67,16 +67,19 @@ static const AVOption options[] = { | |||
| { "tier", "Set the encoding tier", OFFSET(tier), AV_OPT_TYPE_INT, { .i64 = NV_ENC_TIER_HEVC_MAIN }, NV_ENC_TIER_HEVC_MAIN, NV_ENC_TIER_HEVC_HIGH, VE, "tier"}, | |||
| { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TIER_HEVC_MAIN }, 0, 0, VE, "tier" }, | |||
| { "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TIER_HEVC_HIGH }, 0, 0, VE, "tier" }, | |||
| { "rc", "Override the preset rate-control", OFFSET(rc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, "rc" }, | |||
| { "constqp", "Constant QP mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0, VE, "rc" }, | |||
| { "vbr", "Variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0, VE, "rc" }, | |||
| { "cbr", "Constant bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0, VE, "rc" }, | |||
| { "vbr_minqp", "Variable bitrate mode with MinQP", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR_MINQP }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_quality", "Multi-pass optimized for image quality (only for low-latency presets)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_QUALITY }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_size", "Multi-pass optimized for constant frame size (only for low-latency presets)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP }, 0, 0, VE, "rc" }, | |||
| { "vbr_2pass", "Multi-pass variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_VBR }, 0, 0, VE, "rc" }, | |||
| { "rc", "Override the preset rate-control", OFFSET(rc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, "rc" }, | |||
| { "constqp", "Constant QP mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0, VE, "rc" }, | |||
| { "vbr", "Variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0, VE, "rc" }, | |||
| { "cbr", "Constant bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0, VE, "rc" }, | |||
| { "vbr_minqp", "Variable bitrate mode with MinQP (deprecated)", 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_VBR_MINQP) }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_quality", "Multi-pass optimized for image quality (deprecated)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_2_PASS_QUALITY) }, 0, 0, VE, "rc" }, | |||
| { "ll_2pass_size", "Multi-pass optimized for constant frame size (deprecated)", | |||
| 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP) }, 0, 0, VE, "rc" }, | |||
| { "vbr_2pass", "Multi-pass variable bitrate mode (deprecated)", 0, AV_OPT_TYPE_CONST, { .i64 = RCD(NV_ENC_PARAMS_RC_2_PASS_VBR) }, 0, 0, VE, "rc" }, | |||
| { "cbr_ld_hq", "Constant bitrate low delay high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ }, 0, 0, VE, "rc" }, | |||
| { "cbr_hq", "Constant bitrate high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR_HQ }, 0, 0, VE, "rc" }, | |||
| { "vbr_hq", "Variable bitrate high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR_HQ }, 0, 0, VE, "rc" }, | |||
| { "rc-lookahead", "Number of frames to look ahead for rate-control", | |||
| OFFSET(rc_lookahead), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, | |||
| { "surfaces", "Number of concurrent surfaces", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MAX_REGISTERED_FRAMES, VE }, | |||