mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 12:10:37 +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 */
|
||||
static gboolean
|
||||
ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
|
||||
{
|
||||
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
||||
GstVaapiEncMiscParam *misc = NULL;
|
||||
VAEncMiscParameterRateControl *rate_control;
|
||||
GstVaapiEncMiscParam *misc;
|
||||
guint num_roi;
|
||||
|
||||
/* HRD params */
|
||||
|
@ -2170,23 +2201,11 @@ ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
|
|||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||
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 ||
|
||||
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 ((GST_VAAPI_ENC_PICTURE_IS_IDR (picture)) &&
|
||||
(GST_VAAPI_ENCODER_PACKED_HEADERS (encoder) &
|
||||
|
|
|
@ -451,6 +451,38 @@ ensure_picture (GstVaapiEncoderMpeg2 * encoder, GstVaapiEncPicture * picture,
|
|||
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
|
||||
set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
|
||||
GstVaapiEncPicture * picture)
|
||||
|
@ -458,7 +490,6 @@ set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
|
|||
GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
|
||||
GstVaapiEncMiscParam *misc = NULL;
|
||||
VAEncMiscParameterHRD *hrd;
|
||||
VAEncMiscParameterRateControl *rate_control;
|
||||
|
||||
/* add hrd */
|
||||
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);
|
||||
|
||||
/* add ratecontrol */
|
||||
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR) {
|
||||
misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
|
||||
if (!misc)
|
||||
if (!ensure_control_rate_params (encoder, picture))
|
||||
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))
|
||||
return FALSE;
|
||||
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
|
||||
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))
|
||||
return FALSE;
|
||||
|
||||
if (!ensure_control_rate_params (encoder, picture))
|
||||
return FALSE;
|
||||
|
||||
if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) != GST_VAAPI_RATECONTROL_CBR)
|
||||
return TRUE;
|
||||
|
||||
|
@ -297,25 +335,6 @@ ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
|
|||
gst_vaapi_enc_picture_add_misc_param (picture, misc);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue