* 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,
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.
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 */
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));
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
* 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).
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,
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);