[FFmpeg-cvslog] nvenc: Allow different const qps for I, P and B frames
Konda Raju
git at videolan.org
Sat Oct 21 20:17:35 EEST 2017
ffmpeg | branch: master | Konda Raju <kraju at nvidia.com> | Fri Mar 17 09:58:05 2017 +0530| [3df77b58e35a30ed550f99936a308f6bd2f47a20] | committer: Luca Barbato
nvenc: Allow different const qps for I, P and B frames
Signed-off-by: Luca Barbato <lu_zero at gentoo.org>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3df77b58e35a30ed550f99936a308f6bd2f47a20
---
libavcodec/nvenc.c | 28 +++++++++++++++++++---------
1 file 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:
More information about the ffmpeg-cvslog
mailing list