nvenc: Allow different const qps for I, P and B frames
authorKonda Raju <kraju@nvidia.com>
Fri, 17 Mar 2017 04:10:05 +0000 (09:40 +0530)
committerLuca Barbato <lu_zero@gentoo.org>
Tue, 21 Mar 2017 11:06:44 +0000 (12:06 +0100)
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
libavcodec/nvenc.c

index 2e76ee8..f16e509 100644 (file)
@@ -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: