[FFmpeg-devel,v3,06/12] vaapi_encode_vp9: Enable support for more RC modes

Submitted by Mark Thompson on Feb. 10, 2019, 7:46 p.m.

Details

Message ID 20190210194705.3598-6-sw@jkqxz.net
State Accepted
Commit 28e619e268ccd992848404600c45c12c5227acde
Headers show

Commit Message

Mark Thompson Feb. 10, 2019, 7:46 p.m.
---
 libavcodec/vaapi_encode_vp9.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c
index 97142dcc49..8fb399f115 100644
--- a/libavcodec/vaapi_encode_vp9.c
+++ b/libavcodec/vaapi_encode_vp9.c
@@ -178,23 +178,29 @@  static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx,
 
 static av_cold int vaapi_encode_vp9_configure(AVCodecContext *avctx)
 {
+    VAAPIEncodeContext     *ctx = avctx->priv_data;
     VAAPIEncodeVP9Context *priv = avctx->priv_data;
 
-    priv->q_idx_p = av_clip(avctx->global_quality, 0, VP9_MAX_QUANT);
+    if (ctx->rc_mode->quality) {
+    priv->q_idx_p = av_clip(ctx->rc_quality, 0, VP9_MAX_QUANT);
     if (avctx->i_quant_factor > 0.0)
-        priv->q_idx_idr = av_clip((avctx->global_quality *
+        priv->q_idx_idr = av_clip((priv->q_idx_p *
                                    avctx->i_quant_factor +
                                    avctx->i_quant_offset) + 0.5,
                                   0, VP9_MAX_QUANT);
     else
         priv->q_idx_idr = priv->q_idx_p;
     if (avctx->b_quant_factor > 0.0)
-        priv->q_idx_b = av_clip((avctx->global_quality *
+        priv->q_idx_b = av_clip((priv->q_idx_p *
                                  avctx->b_quant_factor +
                                  avctx->b_quant_offset) + 0.5,
                                 0, VP9_MAX_QUANT);
     else
         priv->q_idx_b = priv->q_idx_p;
+    } else {
+        // Arbitrary value.
+        priv->q_idx_idr = priv->q_idx_p = priv->q_idx_b = 100;
+    }
 
     return 0;
 }
@@ -211,6 +217,8 @@  static const VAAPIEncodeType vaapi_encode_type_vp9 = {
     .flags                 = FLAG_B_PICTURES |
                              FLAG_B_PICTURE_REFERENCES,
 
+    .default_quality       = 100,
+
     .picture_priv_data_size = sizeof(VAAPIEncodeVP9Picture),
 
     .configure             = &vaapi_encode_vp9_configure,
@@ -244,6 +252,8 @@  static av_cold int vaapi_encode_vp9_init(AVCodecContext *avctx)
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 static const AVOption vaapi_encode_vp9_options[] = {
     VAAPI_ENCODE_COMMON_OPTIONS,
+    VAAPI_ENCODE_RC_OPTIONS,
+
     { "loop_filter_level", "Loop filter level",
       OFFSET(loop_filter_level), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, 63, FLAGS },
     { "loop_filter_sharpness", "Loop filter sharpness",
@@ -255,7 +265,6 @@  static const AVCodecDefault vaapi_encode_vp9_defaults[] = {
     { "b",              "0"   },
     { "bf",             "0"   },
     { "g",              "250" },
-    { "global_quality", "100" },
     { "qmin",           "-1"  },
     { "qmax",           "-1"  },
     { NULL },