diff options
author | Konda Raju <kraju@nvidia.com> | 2017-03-17 09:40:05 +0530 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2017-03-21 12:06:44 +0100 |
commit | 3df77b58e35a30ed550f99936a308f6bd2f47a20 (patch) | |
tree | 0405b938168b2b386672305745563d9c7b40a180 /libavcodec | |
parent | ca960161f087ca38267b88ce90592010c59584f1 (diff) | |
download | ffmpeg-3df77b58e35a30ed550f99936a308f6bd2f47a20.tar.gz |
nvenc: Allow different const qps for I, P and B frames
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/nvenc.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 2e76ee870d..f16e509df3 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -511,10 +511,26 @@ static int nvenc_map_preset(NVENCContext *ctx) static void set_constqp(AVCodecContext *avctx, NV_ENC_RC_PARAMS *rc) { + NVENCContext *ctx = avctx->priv_data; rc->rateControlMode = NV_ENC_PARAMS_RC_CONSTQP; - rc->constQP.qpInterB = avctx->global_quality; - rc->constQP.qpInterP = avctx->global_quality; - rc->constQP.qpIntra = avctx->global_quality; + + if (ctx->init_qp_p >= 0) { + rc->constQP.qpInterP = ctx->init_qp_p; + if (ctx->init_qp_i >= 0 && ctx->init_qp_b >= 0) { + rc->constQP.qpIntra = ctx->init_qp_i; + rc->constQP.qpInterB = ctx->init_qp_b; + } else if (avctx->i_quant_factor != 0.0 && avctx->b_quant_factor != 0.0) { + rc->constQP.qpIntra = av_clip(rc->constQP.qpInterP * fabs(avctx->i_quant_factor) + avctx->i_quant_offset + 0.5, 0, 51); + rc->constQP.qpInterB = av_clip(rc->constQP.qpInterP * fabs(avctx->b_quant_factor) + avctx->b_quant_offset + 0.5, 0, 51); + } else { + rc->constQP.qpIntra = rc->constQP.qpInterP; + rc->constQP.qpInterB = rc->constQP.qpInterP; + } + } else if (avctx->global_quality >= 0) { + rc->constQP.qpInterP = avctx->global_quality; + rc->constQP.qpInterB = avctx->global_quality; + rc->constQP.qpIntra = avctx->global_quality; + } } static void set_vbr(AVCodecContext *avctx, NV_ENC_RC_PARAMS *rc) @@ -575,12 +591,6 @@ static void nvenc_override_rate_control(AVCodecContext *avctx, switch (ctx->rc) { case NV_ENC_PARAMS_RC_CONSTQP: - if (avctx->global_quality < 0) { - av_log(avctx, AV_LOG_WARNING, - "The constant quality rate-control requires " - "the 'global_quality' option set.\n"); - return; - } set_constqp(avctx, rc); return; case NV_ENC_PARAMS_RC_2_PASS_VBR: |