libs: encoder: h264: support ICQ/QVBR bitrate control mode
authorWangfei <fei.w.wang@intel.com>
Thu, 18 Jul 2019 05:32:46 +0000 (13:32 +0800)
committerWangfei <fei.w.wang@intel.com>
Mon, 5 Aug 2019 03:01:19 +0000 (11:01 +0800)
ICQ is Intelligent Constant Quality. It will use the initial QP
vaule of icq-quality-factor to adjust QP at MB level intelligently
to improve subjective quality.

QVBR is Quality defined VBR. It will use qvbr-quality-factor to
adjust QP for each MB to get enough quality picture without waste
of bits.

gst-libs/gst/vaapi/gstvaapiencoder_h264.c
gst-libs/gst/vaapi/gstvaapiencoder_h264.h
gst-libs/gst/vaapi/gstvaapitypes.h
gst-libs/gst/vaapi/gstvaapiutils.c
gst-libs/gst/vaapi/gstvaapivalue.c

index 3abd23c..1f81e40 100644 (file)
@@ -54,7 +54,9 @@
   (GST_VAAPI_RATECONTROL_MASK (CQP)  |                  \
    GST_VAAPI_RATECONTROL_MASK (CBR)  |                  \
    GST_VAAPI_RATECONTROL_MASK (VBR)  |                  \
-   GST_VAAPI_RATECONTROL_MASK (VBR_CONSTRAINED))
+   GST_VAAPI_RATECONTROL_MASK (VBR_CONSTRAINED)  |      \
+   GST_VAAPI_RATECONTROL_MASK (ICQ)  |                  \
+   GST_VAAPI_RATECONTROL_MASK (QVBR))
 
 /* Supported set of tuning options, within this implementation */
 #define SUPPORTED_TUNE_OPTIONS                          \
@@ -753,6 +755,7 @@ struct _GstVaapiEncoderH264
   guint32 num_bframes;
   guint32 mb_width;
   guint32 mb_height;
+  guint32 quality_factor;
   gboolean use_cabac;
   gboolean use_dct8x8;
   guint temporal_levels;        /* Number of temporal levels */
@@ -2514,6 +2517,14 @@ ensure_control_rate_params (GstVaapiEncoderH264 * encoder)
   if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
     return TRUE;
 
+#if VA_CHECK_VERSION(1,1,0)
+  if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_ICQ) {
+    GST_VAAPI_ENCODER_VA_RATE_CONTROL (encoder).ICQ_quality_factor =
+        encoder->quality_factor;
+    return TRUE;
+  }
+#endif
+
   /* RateControl params */
   GST_VAAPI_ENCODER_VA_RATE_CONTROL (encoder).bits_per_second =
       encoder->bitrate_bits;
@@ -2530,6 +2541,11 @@ ensure_control_rate_params (GstVaapiEncoderH264 * encoder)
       (guint) encoder->mbbrc;
 #endif
 
+#if VA_CHECK_VERSION(1,3,0)
+  GST_VAAPI_ENCODER_VA_RATE_CONTROL (encoder).quality_factor =
+      encoder->quality_factor;
+#endif
+
   /* HRD params */
   fill_hrd_params (encoder, &GST_VAAPI_ENCODER_VA_HRD (encoder));
 
@@ -2681,6 +2697,7 @@ ensure_bitrate (GstVaapiEncoderH264 * encoder)
     case GST_VAAPI_RATECONTROL_CBR:
     case GST_VAAPI_RATECONTROL_VBR:
     case GST_VAAPI_RATECONTROL_VBR_CONSTRAINED:
+    case GST_VAAPI_RATECONTROL_QVBR:
       if (!base_encoder->bitrate) {
         /* According to the literature and testing, CABAC entropy coding
            mode could provide for +10% to +18% improvement in general,
@@ -3552,6 +3569,9 @@ gst_vaapi_encoder_h264_set_property (GstVaapiEncoder * base_encoder,
     case GST_VAAPI_ENCODER_H264_PROP_MAX_QP:
       encoder->max_qp = g_value_get_uint (value);
       break;
+    case GST_VAAPI_ENCODER_H264_PROP_QUALITY_FACTOR:
+      encoder->quality_factor = g_value_get_uint (value);
+      break;
 
     default:
       return GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_PARAMETER;
@@ -3838,6 +3858,19 @@ gst_vaapi_encoder_h264_get_default_properties (void)
           gst_vaapi_encoder_h264_compliance_mode_type (),
           GST_VAAPI_ENCODER_H264_COMPLIANCE_MODE_STRICT, G_PARAM_READWRITE));
 
+  /**
+   * GstVaapiEncoderH264:quality_factor:
+   *
+   * quality factor used under ICQ/QVBR bitrate control mode.
+   */
+  GST_VAAPI_ENCODER_PROPERTIES_APPEND (props,
+      GST_VAAPI_ENCODER_H264_PROP_QUALITY_FACTOR,
+      g_param_spec_uint ("quality-factor",
+          "Quality factor for ICQ/QVBR",
+          "quality factor for ICQ/QVBR bitrate control mode"
+          "(low value means higher-quality, higher value means lower-quality)",
+          1, 51, 26, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   return props;
 }
 
index ab56d29..095fc6b 100644 (file)
@@ -57,6 +57,7 @@ typedef struct _GstVaapiEncoderH264 GstVaapiEncoderH264;
  * @GST_VAAPI_ENCODER_H264_PROP_TEMPORAL_LEVELS: Number of temporal levels
  * @GST_VAAPI_ENCODER_H264_PROP_PREDICTION_TYPE: Reference picture selection modes
  * @GST_VAAPI_ENCODER_H264_PROP_MAX_QP: Maximal quantizer value (uint).
+ * @GST_VAAPI_ENCODER_H264_PROP_QUALITY_FACTOR: Factor for ICQ/QVBR bitrate control mode.
  *
  * The set of H.264 encoder specific configurable properties.
  */
@@ -79,6 +80,7 @@ typedef enum {
   GST_VAAPI_ENCODER_H264_PROP_TEMPORAL_LEVELS = -16,
   GST_VAAPI_ENCODER_H264_PROP_PREDICTION_TYPE = -17,
   GST_VAAPI_ENCODER_H264_PROP_MAX_QP = -18,
+  GST_VAAPI_ENCODER_H264_PROP_QUALITY_FACTOR = -19,
 } GstVaapiEncoderH264Prop;
 
 GstVaapiEncoder *
index 9ddef3c..7bbcb4d 100644 (file)
@@ -148,6 +148,10 @@ typedef enum {
  * @GST_VAAPI_RATECONTROL_VBR_CONSTRAINED: Variable bitrate with peak
  *   rate higher than average bitrate
  * @GST_VAAPI_RATECONTROL_MB: Macroblock based rate control
+ * @GST_VAAPI_RATECONTROL_ICQ: Intelligent Constant QP, use
+ * quality_factor to improve subjective quality base on motion
+ * @GST_VAAPI_RATECONTROL_QVBR: Quality defined VBR, use
+ * quality_factor to get good enough quality and save bits
  *
  * The set of allowed rate control values for #GstVaapiRateControl.
  * Note: this is only valid for encoders.
@@ -160,6 +164,8 @@ typedef enum {
     GST_VAAPI_RATECONTROL_VBR,
     GST_VAAPI_RATECONTROL_VBR_CONSTRAINED,
     GST_VAAPI_RATECONTROL_MB,
+    GST_VAAPI_RATECONTROL_ICQ,
+    GST_VAAPI_RATECONTROL_QVBR,
 } GstVaapiRateControl;
 
 /* Define a mask for GstVaapiRateControl */
index 54eef61..f3fd436 100644 (file)
@@ -342,6 +342,14 @@ string_of_VARateControl (guint rate_control)
     case VA_RC_MB:
       return "MB";
 #endif
+#if VA_CHECK_VERSION(1,1,0)
+    case VA_RC_ICQ:
+      return "VA_RC_ICQ";
+#endif
+#if VA_CHECK_VERSION(1,3,0)
+    case VA_RC_QVBR:
+      return "VA_RC_QVBR";
+#endif
     default:
       break;
   }
@@ -711,6 +719,14 @@ from_GstVaapiRateControl (guint value)
     case GST_VAAPI_RATECONTROL_MB:
       return VA_RC_MB;
 #endif
+#if VA_CHECK_VERSION(1,1,0)
+    case GST_VAAPI_RATECONTROL_ICQ:
+      return VA_RC_ICQ;
+#endif
+#if VA_CHECK_VERSION(1,3,0)
+    case GST_VAAPI_RATECONTROL_QVBR:
+      return VA_RC_QVBR;
+#endif
   }
   GST_ERROR ("unsupported GstVaapiRateControl value %u", value);
   return VA_RC_NONE;
@@ -736,6 +752,15 @@ to_GstVaapiRateControl (guint value)
     case VA_RC_MB:
       return GST_VAAPI_RATECONTROL_MB;
 #endif
+#if VA_CHECK_VERSION(1,1,0)
+    case VA_RC_ICQ:
+      return GST_VAAPI_RATECONTROL_ICQ;
+#endif
+#if VA_CHECK_VERSION(1,3,0)
+    case VA_RC_QVBR:
+      return GST_VAAPI_RATECONTROL_QVBR;
+#endif
+
   }
   GST_ERROR ("unsupported VA-API Rate Control value %u", value);
   return GST_VAAPI_RATECONTROL_NONE;
index d5e192a..65e3e25 100644 (file)
@@ -150,6 +150,10 @@ gst_vaapi_rate_control_get_type (void)
         "Variable bitrate - Constrained", "vbr_constrained"},
     {GST_VAAPI_RATECONTROL_MB,
         "Macroblock based rate control", "mb"},
+    {GST_VAAPI_RATECONTROL_ICQ,
+        "Constant QP - Intelligent", "icq"},
+    {GST_VAAPI_RATECONTROL_QVBR,
+        "Variable bitrate - Quality defined", "qvbr"},
     {0, NULL, NULL},
   };