You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avcodec/nvenc: deprecated old rc modes, add new ones
This commit is contained in:
		| @@ -33,8 +33,8 @@ | |||||||
|  |  | ||||||
| #define NVENC_CAP 0x30 | #define NVENC_CAP 0x30 | ||||||
| #define IS_CBR(rc) (rc == NV_ENC_PARAMS_RC_CBR ||             \ | #define IS_CBR(rc) (rc == NV_ENC_PARAMS_RC_CBR ||             \ | ||||||
|                     rc == NV_ENC_PARAMS_RC_2_PASS_QUALITY ||    \ |                     rc == NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ || \ | ||||||
|                     rc == NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP) |                     rc == NV_ENC_PARAMS_RC_CBR_HQ) | ||||||
|  |  | ||||||
| const enum AVPixelFormat ff_nvenc_pix_fmts[] = { | const enum AVPixelFormat ff_nvenc_pix_fmts[] = { | ||||||
|     AV_PIX_FMT_YUV420P, |     AV_PIX_FMT_YUV420P, | ||||||
| @@ -633,13 +633,13 @@ static void nvenc_override_rate_control(AVCodecContext *avctx) | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         /* fall through */ |         /* fall through */ | ||||||
|     case NV_ENC_PARAMS_RC_2_PASS_VBR: |     case NV_ENC_PARAMS_RC_VBR_HQ: | ||||||
|     case NV_ENC_PARAMS_RC_VBR: |     case NV_ENC_PARAMS_RC_VBR: | ||||||
|         set_vbr(avctx); |         set_vbr(avctx); | ||||||
|         break; |         break; | ||||||
|     case NV_ENC_PARAMS_RC_CBR: |     case NV_ENC_PARAMS_RC_CBR: | ||||||
|     case NV_ENC_PARAMS_RC_2_PASS_QUALITY: |     case NV_ENC_PARAMS_RC_CBR_HQ: | ||||||
|     case NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP: |     case NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ: | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -715,19 +715,29 @@ static av_cold void nvenc_setup_rate_control(AVCodecContext *avctx) | |||||||
|  |  | ||||||
|         if (ctx->cbr) { |         if (ctx->cbr) { | ||||||
|             if (ctx->twopass) { |             if (ctx->twopass) { | ||||||
|                 ctx->rc = NV_ENC_PARAMS_RC_2_PASS_QUALITY; |                 ctx->rc = NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ; | ||||||
|             } else { |             } else { | ||||||
|                 ctx->rc = NV_ENC_PARAMS_RC_CBR; |                 ctx->rc = NV_ENC_PARAMS_RC_CBR; | ||||||
|             } |             } | ||||||
|         } else if (ctx->cqp >= 0) { |         } else if (ctx->cqp >= 0) { | ||||||
|             ctx->rc = NV_ENC_PARAMS_RC_CONSTQP; |             ctx->rc = NV_ENC_PARAMS_RC_CONSTQP; | ||||||
|         } else if (ctx->twopass) { |         } 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) { |         } else if (avctx->qmin >= 0 && avctx->qmax >= 0) { | ||||||
|             ctx->rc = NV_ENC_PARAMS_RC_VBR_MINQP; |             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) { |     if (ctx->flags & NVENC_LOSSLESS) { | ||||||
|         set_lossless(avctx); |         set_lossless(avctx); | ||||||
|     } else if (ctx->rc >= 0) { |     } else if (ctx->rc >= 0) { | ||||||
| @@ -830,9 +840,9 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx) | |||||||
|         h264->outputPictureTimingSEI   = 1; |         h264->outputPictureTimingSEI   = 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_2_PASS_QUALITY || |     if (cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ || | ||||||
|         cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP || |         cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_CBR_HQ || | ||||||
|         cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_2_PASS_VBR) { |         cc->rcParams.rateControlMode == NV_ENC_PARAMS_RC_VBR_HQ) { | ||||||
|         h264->adaptiveTransformMode = NV_ENC_H264_ADAPTIVE_TRANSFORM_ENABLE; |         h264->adaptiveTransformMode = NV_ENC_H264_ADAPTIVE_TRANSFORM_ENABLE; | ||||||
|         h264->fmoMode = NV_ENC_H264_FMO_DISABLE; |         h264->fmoMode = NV_ENC_H264_FMO_DISABLE; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -30,6 +30,8 @@ | |||||||
| #include "avcodec.h" | #include "avcodec.h" | ||||||
|  |  | ||||||
| #define MAX_REGISTERED_FRAMES 64 | #define MAX_REGISTERED_FRAMES 64 | ||||||
|  | #define RC_MODE_DEPRECATED 0x800000 | ||||||
|  | #define RCD(rc_mode) ((rc_mode) | RC_MODE_DEPRECATED) | ||||||
|  |  | ||||||
| typedef struct NvencSurface | typedef struct NvencSurface | ||||||
| { | { | ||||||
|   | |||||||
| @@ -72,12 +72,15 @@ static const AVOption options[] = { | |||||||
|     { "constqp",      "Constant QP mode",                   0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP },                   0, 0, 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" }, |     { "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" }, |     { "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" }, |     { "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 (only for low-latency presets)", |     { "ll_2pass_quality", "Multi-pass optimized for image quality (deprecated)", | ||||||
|                                                             0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_QUALITY },       0, 0, VE, "rc" }, |                                                             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 (only for low-latency presets)", |     { "ll_2pass_size", "Multi-pass optimized for constant frame size (deprecated)", | ||||||
|                                                             0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP }, 0, 0, VE, "rc" }, |                                                             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",   0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_VBR },           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", |     { "rc-lookahead", "Number of frames to look ahead for rate-control", | ||||||
|                                                             OFFSET(rc_lookahead), AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, INT_MAX, VE }, |                                                             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 }, |     { "surfaces",     "Number of concurrent surfaces",      OFFSET(nb_surfaces),  AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, MAX_REGISTERED_FRAMES, VE }, | ||||||
|   | |||||||
| @@ -71,12 +71,15 @@ static const AVOption options[] = { | |||||||
|     { "constqp",      "Constant QP mode",                   0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP },                   0, 0, 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" }, |     { "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" }, |     { "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" }, |     { "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 (only for low-latency presets)", |     { "ll_2pass_quality", "Multi-pass optimized for image quality (deprecated)", | ||||||
|                                                             0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_QUALITY },       0, 0, VE, "rc" }, |                                                             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 (only for low-latency presets)", |     { "ll_2pass_size", "Multi-pass optimized for constant frame size (deprecated)", | ||||||
|                                                             0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP }, 0, 0, VE, "rc" }, |                                                             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",   0,                    AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_VBR },           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", |     { "rc-lookahead", "Number of frames to look ahead for rate-control", | ||||||
|                                                             OFFSET(rc_lookahead), AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, INT_MAX, VE }, |                                                             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 }, |     { "surfaces",     "Number of concurrent surfaces",      OFFSET(nb_surfaces),  AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, MAX_REGISTERED_FRAMES, VE }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user