mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-21 07:46:38 +00:00
libs: encoder: h264,vp8,mpeg2: refactor control rate
Instead of filling the control rate param in ensure_misc_params(), this patch refactor it out, as a first step to merge the same code for all the encoders. https://bugzilla.gnome.org/show_bug.cgi?id=783449
This commit is contained in:
parent
5c05a8b436
commit
b538a86d4e
3 changed files with 108 additions and 57 deletions
|
@ -2153,13 +2153,44 @@ error_create_packed_seq_hdr:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
ensure_control_rate_params (GstVaapiEncoderH264 * encoder,
|
||||||
|
GstVaapiEncPicture * picture)
|
||||||
|
{
|
||||||
|
GstVaapiEncMiscParam *misc;
|
||||||
|
|
||||||
|
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* RateControl params */
|
||||||
|
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
||||||
|
if (!misc)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
{
|
||||||
|
VAEncMiscParameterRateControl rate_control = {
|
||||||
|
.bits_per_second = encoder->bitrate_bits,
|
||||||
|
.target_percentage = 70,
|
||||||
|
.window_size = encoder->cpb_length,
|
||||||
|
.initial_qp = encoder->init_qp,
|
||||||
|
.min_qp = encoder->min_qp,
|
||||||
|
};
|
||||||
|
|
||||||
|
memcpy (misc->data, &rate_control, sizeof (rate_control));
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||||
|
gst_vaapi_codec_object_replace (&misc, NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Generates additional control parameters */
|
/* Generates additional control parameters */
|
||||||
static gboolean
|
static gboolean
|
||||||
ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
|
ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
|
||||||
{
|
{
|
||||||
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
||||||
GstVaapiEncMiscParam *misc = NULL;
|
GstVaapiEncMiscParam *misc;
|
||||||
VAEncMiscParameterRateControl *rate_control;
|
|
||||||
guint num_roi;
|
guint num_roi;
|
||||||
|
|
||||||
/* HRD params */
|
/* HRD params */
|
||||||
|
@ -2170,23 +2201,11 @@ ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
|
||||||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||||
gst_vaapi_codec_object_replace (&misc, NULL);
|
gst_vaapi_codec_object_replace (&misc, NULL);
|
||||||
|
|
||||||
/* RateControl params */
|
if (!ensure_control_rate_params (encoder, picture))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR ||
|
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR ||
|
||||||
GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_VBR) {
|
GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_VBR) {
|
||||||
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
|
||||||
if (!misc)
|
|
||||||
return FALSE;
|
|
||||||
rate_control = misc->data;
|
|
||||||
memset (rate_control, 0, sizeof (VAEncMiscParameterRateControl));
|
|
||||||
rate_control->bits_per_second = encoder->bitrate_bits;
|
|
||||||
rate_control->target_percentage = 70;
|
|
||||||
rate_control->window_size = encoder->cpb_length;
|
|
||||||
rate_control->initial_qp = encoder->init_qp;
|
|
||||||
rate_control->min_qp = encoder->min_qp;
|
|
||||||
rate_control->basic_unit_size = 0;
|
|
||||||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
|
||||||
gst_vaapi_codec_object_replace (&misc, NULL);
|
|
||||||
|
|
||||||
if (!encoder->view_idx) {
|
if (!encoder->view_idx) {
|
||||||
if ((GST_VAAPI_ENC_PICTURE_IS_IDR (picture)) &&
|
if ((GST_VAAPI_ENC_PICTURE_IS_IDR (picture)) &&
|
||||||
(GST_VAAPI_ENCODER_PACKED_HEADERS (encoder) &
|
(GST_VAAPI_ENCODER_PACKED_HEADERS (encoder) &
|
||||||
|
|
|
@ -451,6 +451,38 @@ ensure_picture (GstVaapiEncoderMpeg2 * encoder, GstVaapiEncPicture * picture,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
ensure_control_rate_params (GstVaapiEncoderMpeg2 * encoder,
|
||||||
|
GstVaapiEncPicture * picture)
|
||||||
|
{
|
||||||
|
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
||||||
|
GstVaapiEncMiscParam *misc;
|
||||||
|
|
||||||
|
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* RateControl params */
|
||||||
|
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
||||||
|
if (!misc)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
{
|
||||||
|
VAEncMiscParameterRateControl rate_control = {
|
||||||
|
.bits_per_second = base_encoder->bitrate * 1000,
|
||||||
|
.target_percentage = 70,
|
||||||
|
.window_size = 500,
|
||||||
|
.initial_qp = encoder->cqp,
|
||||||
|
};
|
||||||
|
|
||||||
|
memcpy (misc->data, &rate_control, sizeof (rate_control));
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||||
|
gst_vaapi_codec_object_replace (&misc, NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
|
set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
|
||||||
GstVaapiEncPicture * picture)
|
GstVaapiEncPicture * picture)
|
||||||
|
@ -458,7 +490,6 @@ set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
|
||||||
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
||||||
GstVaapiEncMiscParam *misc = NULL;
|
GstVaapiEncMiscParam *misc = NULL;
|
||||||
VAEncMiscParameterHRD *hrd;
|
VAEncMiscParameterHRD *hrd;
|
||||||
VAEncMiscParameterRateControl *rate_control;
|
|
||||||
|
|
||||||
/* add hrd */
|
/* add hrd */
|
||||||
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (HRD, encoder);
|
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (HRD, encoder);
|
||||||
|
@ -475,26 +506,8 @@ set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
|
||||||
}
|
}
|
||||||
gst_vaapi_codec_object_replace (&misc, NULL);
|
gst_vaapi_codec_object_replace (&misc, NULL);
|
||||||
|
|
||||||
/* add ratecontrol */
|
if (!ensure_control_rate_params (encoder, picture))
|
||||||
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR) {
|
return FALSE;
|
||||||
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
|
||||||
if (!misc)
|
|
||||||
return FALSE;
|
|
||||||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
|
||||||
rate_control = misc->data;
|
|
||||||
memset (rate_control, 0, sizeof (VAEncMiscParameterRateControl));
|
|
||||||
if (base_encoder->bitrate)
|
|
||||||
rate_control->bits_per_second = base_encoder->bitrate * 1000;
|
|
||||||
else
|
|
||||||
rate_control->bits_per_second = 0;
|
|
||||||
rate_control->target_percentage = 70;
|
|
||||||
rate_control->window_size = 500;
|
|
||||||
rate_control->initial_qp = encoder->cqp;
|
|
||||||
rate_control->min_qp = 0;
|
|
||||||
rate_control->basic_unit_size = 0;
|
|
||||||
gst_vaapi_codec_object_replace (&misc, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_vaapi_encoder_ensure_param_quality_level (base_encoder, picture))
|
if (!gst_vaapi_encoder_ensure_param_quality_level (base_encoder, picture))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -257,6 +257,41 @@ error:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
ensure_control_rate_params (GstVaapiEncoderVP8 * encoder,
|
||||||
|
GstVaapiEncPicture * picture)
|
||||||
|
{
|
||||||
|
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
||||||
|
GstVaapiEncMiscParam *misc;
|
||||||
|
|
||||||
|
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* RateControl params */
|
||||||
|
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
||||||
|
if (!misc)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
{
|
||||||
|
VAEncMiscParameterRateControl rate_control = {
|
||||||
|
.bits_per_second = base_encoder->bitrate * 1000,
|
||||||
|
.target_percentage = 70,
|
||||||
|
/* CPB (Coded picture buffer) length in milliseconds, which
|
||||||
|
* could be provided as a property */
|
||||||
|
.window_size = 500,
|
||||||
|
.initial_qp = encoder->yac_qi,
|
||||||
|
.min_qp = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
memcpy (misc->data, &rate_control, sizeof (rate_control));
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||||
|
gst_vaapi_codec_object_replace (&misc, NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
|
ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
|
||||||
{
|
{
|
||||||
|
@ -266,6 +301,9 @@ ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
|
||||||
if (!gst_vaapi_encoder_ensure_param_quality_level (base_encoder, picture))
|
if (!gst_vaapi_encoder_ensure_param_quality_level (base_encoder, picture))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (!ensure_control_rate_params (encoder, picture))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) != GST_VAAPI_RATECONTROL_CBR)
|
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) != GST_VAAPI_RATECONTROL_CBR)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -297,25 +335,6 @@ ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
|
||||||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||||
gst_vaapi_codec_object_replace (&misc, NULL);
|
gst_vaapi_codec_object_replace (&misc, NULL);
|
||||||
|
|
||||||
/* RateControl params */
|
|
||||||
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
|
||||||
if (!misc)
|
|
||||||
return FALSE;
|
|
||||||
{
|
|
||||||
VAEncMiscParameterRateControl *rate_control;
|
|
||||||
rate_control = misc->data;
|
|
||||||
rate_control->bits_per_second = base_encoder->bitrate * 1000;
|
|
||||||
rate_control->target_percentage = 70;
|
|
||||||
/* CPB (Coded picture buffer) length in milliseconds, which could
|
|
||||||
* be provided as a property */
|
|
||||||
rate_control->window_size = 500;
|
|
||||||
rate_control->initial_qp = encoder->yac_qi;
|
|
||||||
rate_control->min_qp = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
|
||||||
gst_vaapi_codec_object_replace (&misc, NULL);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue