diff options
author | He Junyan <junyan.he@hotmail.com> | 2019-08-19 15:38:09 +0800 |
---|---|---|
committer | He Junyan <junyan.he@hotmail.com> | 2019-08-30 13:30:04 +0800 |
commit | beaf45cc6faf577ba8e4e48febea0c9bcd062561 (patch) | |
tree | 7d3f4080c0b402af45a4cc360e6f9d57a1bb9083 /gst-libs/gst/vaapi/gstvaapiencoder.c | |
parent | 6978eae21a728e1eac9ece5cb7d90e1209279683 (diff) |
libs: encoder: add properties and prop help functions
Add all common properties to encoder base class. rate-control and
tune are moved to sub class.
Diffstat (limited to 'gst-libs/gst/vaapi/gstvaapiencoder.c')
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiencoder.c | 197 |
1 files changed, 194 insertions, 3 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.c b/gst-libs/gst/vaapi/gstvaapiencoder.c index 4c559de9..9a881560 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder.c @@ -1573,12 +1573,121 @@ gst_vaapi_encoder_constructed (GObject * object) G_DEFINE_ABSTRACT_TYPE (GstVaapiEncoder, gst_vaapi_encoder, GST_TYPE_OBJECT); +/** + * GstVaapiEncoderProp: + * @ENCODER_PROP_DISPLAY: The display. + * @ENCODER_PROP_BITRATE: Bitrate expressed in kbps (uint). + * @ENCODER_PROP_TARGET_PERCENTAGE: Desired target percentage of + * bitrate for variable rate controls. + * @ENCODER_PROP_KEYFRAME_PERIOD: The maximal distance + * between two keyframes (uint). + * @ENCODER_PROP_DEFAULT_ROI_VALUE: The default delta qp to apply + * to each region of interest. + * @ENCODER_PROP_TRELLIS: Use trellis quantization method (gboolean). + * + * The set of configurable properties for the encoder. + */ enum { ENCODER_PROP_DISPLAY = 1, + ENCODER_PROP_BITRATE, + ENCODER_PROP_TARGET_PERCENTAGE, + ENCODER_PROP_KEYFRAME_PERIOD, + ENCODER_PROP_QUALITY_LEVEL, + ENCODER_PROP_DEFAULT_ROI_VALUE, + ENCODER_PROP_TRELLIS, ENCODER_N_PROPERTIES }; +static GParamSpec *properties[ENCODER_N_PROPERTIES]; + +__attribute__ ((unused)) + static void + _gst_vaapi_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVaapiEncoder *encoder = GST_VAAPI_ENCODER (object); + GstVaapiEncoderStatus status = GST_VAAPI_ENCODER_STATUS_SUCCESS; + + switch (prop_id) { + case ENCODER_PROP_DISPLAY: + g_assert (encoder->display == NULL); + encoder->display = g_value_dup_object (value); + g_assert (encoder->display != NULL); + encoder->va_display = GST_VAAPI_DISPLAY_VADISPLAY (encoder->display); + break; + case ENCODER_PROP_BITRATE: + status = gst_vaapi_encoder_set_bitrate (encoder, + g_value_get_uint (value)); + break; + case ENCODER_PROP_TARGET_PERCENTAGE: + status = + gst_vaapi_encoder_set_target_percentage (encoder, + g_value_get_uint (value)); + break; + case ENCODER_PROP_KEYFRAME_PERIOD: + status = + gst_vaapi_encoder_set_keyframe_period (encoder, + g_value_get_uint (value)); + break; + case ENCODER_PROP_QUALITY_LEVEL: + status = + gst_vaapi_encoder_set_quality_level (encoder, + g_value_get_uint (value)); + break; + case ENCODER_PROP_DEFAULT_ROI_VALUE: + encoder->default_roi_value = g_value_get_int (value); + status = GST_VAAPI_ENCODER_STATUS_SUCCESS; + break; + case ENCODER_PROP_TRELLIS: + status = + gst_vaapi_encoder_set_trellis (encoder, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + if (status) + GST_WARNING_OBJECT (encoder, "Failed to set the property:%s, error is %d", + g_param_spec_get_name (pspec), status); +} + +__attribute__ ((unused)) + static void + _gst_vaapi_encoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaapiEncoder *encoder = GST_VAAPI_ENCODER (object); + + switch (prop_id) { + case ENCODER_PROP_DISPLAY: + g_value_set_object (value, encoder->display); + break; + case ENCODER_PROP_BITRATE: + g_value_set_uint (value, encoder->bitrate); + break; + case ENCODER_PROP_TARGET_PERCENTAGE: + g_value_set_uint (value, encoder->target_percentage); + break; + case ENCODER_PROP_KEYFRAME_PERIOD: + g_value_set_uint (value, encoder->keyframe_period); + break; + case ENCODER_PROP_QUALITY_LEVEL: + g_value_set_uint (value, GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder)); + break; + case ENCODER_PROP_DEFAULT_ROI_VALUE: + g_value_set_int (value, encoder->default_roi_value); + break; + case ENCODER_PROP_TRELLIS: + g_value_set_boolean (value, encoder->trellis); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static void gst_vaapi_encoder_init (GstVaapiEncoder * encoder) { @@ -1671,10 +1780,92 @@ gst_vaapi_encoder_class_init (GstVaapiEncoderClass * klass) * * #GstVaapiDisplay to be used. */ - g_object_class_install_property (object_class, ENCODER_PROP_DISPLAY, + properties[ENCODER_PROP_DISPLAY] = g_param_spec_object ("display", "Gst VA-API Display", - "The VA-API display object to use", GST_TYPE_VAAPI_DISPLAY, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME)); + "The VA-API display object to use", GST_TYPE_VAAPI_DISPLAY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME); + + /** + * GstVaapiEncoder:bitrate: + * + * The desired bitrate, expressed in kbps. + * This is available when rate-control is CBR or VBR. + * + * CBR: This applies equally to minimum, maximum and target bitrate in the driver. + * VBR: This applies to maximum bitrate in the driver. + * Minimum bitrate will be calculated like the following in the driver. + * if (target percentage < 50) minimum bitrate = 0 + * else minimum bitrate = maximum bitrate * (2 * target percentage -100) / 100 + * Target bitrate will be calculated like the following in the driver. + * target bitrate = maximum bitrate * target percentage / 100 + */ + properties[ENCODER_PROP_BITRATE] = + g_param_spec_uint ("bitrate", + "Bitrate (kbps)", + "The desired bitrate expressed in kbps (0: auto-calculate)", + 0, 2000 * 1024, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GstVaapiEncoder:target-percentage: + * + * The desired target percentage of bitrate for variable rate controls. + */ + properties[ENCODER_PROP_TARGET_PERCENTAGE] = + g_param_spec_uint ("target-percentage", + "Target Percentage", + "The desired target percentage of bitrate for variable rate " + "controls.", 1, 100, 70, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GstVaapiEncoder:keyframe-period: + * + * The maximal distance between two keyframes. + */ + properties[ENCODER_PROP_KEYFRAME_PERIOD] = + g_param_spec_uint ("keyframe-period", + "Keyframe Period", + "Maximal distance between two keyframes (0: auto-calculate)", 0, + G_MAXUINT32, 30, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GstVaapiEncoder:quality-level: + * + * The Encoding quality level. + */ + properties[ENCODER_PROP_QUALITY_LEVEL] = + g_param_spec_uint ("quality-level", + "Quality Level", "Encoding Quality Level " + "(lower value means higher-quality/slow-encode, " + " higher value means lower-quality/fast-encode)", + 1, 7, 4, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GstVapiEncoder:roi-default-delta-qp + * + * Default delta-qp to apply to each Region of Interest + */ + properties[ENCODER_PROP_DEFAULT_ROI_VALUE] = + g_param_spec_int ("default-roi-delta-qp", "Default ROI delta QP", + "The default delta-qp to apply to each Region of Interest" + "(lower value means higher-quality, " + "higher value means lower-quality)", + -10, 10, -10, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * GstVaapiEncoder: trellis: + * + * The trellis quantization method the encoder can use. + * Trellis is an improved quantization algorithm. + * + */ + properties[ENCODER_PROP_TRELLIS] = + g_param_spec_boolean ("trellis", + "Trellis Quantization", + "The Trellis Quantization Method of Encoder", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, ENCODER_N_PROPERTIES, + properties); } static GstVaapiContext * |