From: U. Artie Eoff Date: Wed, 1 May 2019 19:56:55 +0000 (-0700) Subject: libs: encoder: add target-percentage property X-Git-Tag: 1.19.3~503^2~525 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=be496a66c5e8f93849c7c206032c179edc88824b;p=platform%2Fupstream%2Fgstreamer.git libs: encoder: add target-percentage property Allow users to set the target-percentage for variable rate controls. The default value is 70 (as hard-coded prior). v2: minimum allowed value changed from 0 to 1 v3: target-percentage unchanged if CBR used Resolves #129 --- diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.c b/gst-libs/gst/vaapi/gstvaapiencoder.c index ecea336..8c87429 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder.c @@ -145,8 +145,6 @@ gst_vaapi_encoder_properties_get_default (const GstVaapiEncoderClass * klass) * 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 - * - * Note that target percentage is set as 70 currently in GStreamer VA-API. */ GST_VAAPI_ENCODER_PROPERTIES_APPEND (props, GST_VAAPI_ENCODER_PROP_BITRATE, @@ -156,6 +154,18 @@ gst_vaapi_encoder_properties_get_default (const GstVaapiEncoderClass * klass) 0, 100 * 1024, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** + * GstVaapiEncoder:target-percentage: + * + * The desired target percentage of bitrate for variable rate controls. + */ + GST_VAAPI_ENCODER_PROPERTIES_APPEND (props, + GST_VAAPI_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. @@ -1035,7 +1045,7 @@ gst_vaapi_encoder_reconfigure_internal (GstVaapiEncoder * encoder) target_percentage = (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR) ? - 100 : 70; + 100 : encoder->target_percentage; /* *INDENT-OFF* */ /* Default values for rate control parameter */ @@ -1199,6 +1209,10 @@ set_property (GstVaapiEncoder * encoder, gint prop_id, const GValue * value) status = gst_vaapi_encoder_set_bitrate (encoder, g_value_get_uint (value)); break; + case GST_VAAPI_ENCODER_PROP_TARGET_PERCENTAGE: + status = gst_vaapi_encoder_set_target_percentage (encoder, + g_value_get_uint (value)); + break; case GST_VAAPI_ENCODER_PROP_KEYFRAME_PERIOD: status = gst_vaapi_encoder_set_keyframe_period (encoder, g_value_get_uint (value)); @@ -1368,6 +1382,28 @@ gst_vaapi_encoder_set_bitrate (GstVaapiEncoder * encoder, guint bitrate) return GST_VAAPI_ENCODER_STATUS_SUCCESS; } +GstVaapiEncoderStatus +gst_vaapi_encoder_set_target_percentage (GstVaapiEncoder * encoder, + guint target_percentage) +{ + g_return_val_if_fail (encoder != NULL, 0); + + if (encoder->target_percentage != target_percentage + && encoder->num_codedbuf_queued > 0) { + if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) != GST_VAAPI_RATECONTROL_CBR) { + GST_INFO ("Target percentage is changed to %d on runtime", + target_percentage); + encoder->target_percentage = target_percentage; + return gst_vaapi_encoder_reconfigure_internal (encoder); + } + GST_WARNING ("Target percentage is ignored for CBR rate-control"); + return GST_VAAPI_ENCODER_STATUS_SUCCESS; + } + + encoder->target_percentage = target_percentage; + return GST_VAAPI_ENCODER_STATUS_SUCCESS; +} + /** * gst_vaapi_encoder_set_keyframe_period: * @encoder: a #GstVaapiEncoder diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.h b/gst-libs/gst/vaapi/gstvaapiencoder.h index 7c53517..b22fde9 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.h +++ b/gst-libs/gst/vaapi/gstvaapiencoder.h @@ -114,6 +114,8 @@ typedef enum { * GstVaapiEncoderProp: * @GST_VAAPI_ENCODER_PROP_RATECONTROL: Rate control (#GstVaapiRateControl). * @GST_VAAPI_ENCODER_PROP_BITRATE: Bitrate expressed in kbps (uint). + * @GST_VAAPI_ENCODER_PROP_TARGET_PERCENTAGE: Desired target percentage of + * bitrate for variable rate controls. * @GST_VAAPI_ENCODER_PROP_KEYFRAME_PERIOD: The maximal distance * between two keyframes (uint). * @GST_VAAPI_ENCODER_PROP_TUNE: The tuning options (#GstVaapiEncoderTune). @@ -126,6 +128,7 @@ typedef enum { typedef enum { GST_VAAPI_ENCODER_PROP_RATECONTROL = 1, GST_VAAPI_ENCODER_PROP_BITRATE, + GST_VAAPI_ENCODER_PROP_TARGET_PERCENTAGE, GST_VAAPI_ENCODER_PROP_KEYFRAME_PERIOD, GST_VAAPI_ENCODER_PROP_TUNE, GST_VAAPI_ENCODER_PROP_QUALITY_LEVEL, @@ -181,6 +184,10 @@ GstVaapiEncoderStatus gst_vaapi_encoder_set_bitrate (GstVaapiEncoder * encoder, guint bitrate); GstVaapiEncoderStatus +gst_vaapi_encoder_set_target_percentage (GstVaapiEncoder * encoder, + guint target_percentage); + +GstVaapiEncoderStatus gst_vaapi_encoder_put_frame (GstVaapiEncoder * encoder, GstVideoCodecFrame * frame); diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_priv.h b/gst-libs/gst/vaapi/gstvaapiencoder_priv.h index 8126220..4dd340c 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_priv.h +++ b/gst-libs/gst/vaapi/gstvaapiencoder_priv.h @@ -262,6 +262,7 @@ struct _GstVaapiEncoder GstVaapiRateControl rate_control; guint32 rate_control_mask; guint bitrate; /* kbps */ + guint target_percentage; guint keyframe_period; /* Maximum number of reference frames supported