mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 03:19:40 +00:00
libs: encoder: h264/h265: keep min_qp as is unless it's over init_qp
Creates new variable for QP for I frame and keep it at configuration and use this for pic_init_qp and slice_qp_delta setting. Since changing min qp doesn't make sense, keep min qp as is. https://bugzilla.gnome.org/show_bug.cgi?id=785923
This commit is contained in:
parent
e7c099b957
commit
5796750604
2 changed files with 11 additions and 10 deletions
|
@ -708,6 +708,7 @@ struct _GstVaapiEncoderH264
|
||||||
guint32 idr_period;
|
guint32 idr_period;
|
||||||
guint32 init_qp;
|
guint32 init_qp;
|
||||||
guint32 min_qp;
|
guint32 min_qp;
|
||||||
|
guint32 qp_i;
|
||||||
guint32 num_slices;
|
guint32 num_slices;
|
||||||
guint32 num_bframes;
|
guint32 num_bframes;
|
||||||
guint32 mb_width;
|
guint32 mb_width;
|
||||||
|
@ -2003,7 +2004,7 @@ fill_picture (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture,
|
||||||
pic_param->seq_parameter_set_id = encoder->view_idx ? 1 : 0;
|
pic_param->seq_parameter_set_id = encoder->view_idx ? 1 : 0;
|
||||||
pic_param->last_picture = 0; /* means last encoding picture */
|
pic_param->last_picture = 0; /* means last encoding picture */
|
||||||
pic_param->frame_num = picture->frame_num;
|
pic_param->frame_num = picture->frame_num;
|
||||||
pic_param->pic_init_qp = encoder->init_qp;
|
pic_param->pic_init_qp = encoder->qp_i;
|
||||||
pic_param->num_ref_idx_l0_active_minus1 =
|
pic_param->num_ref_idx_l0_active_minus1 =
|
||||||
(ref_pool->max_reflist0_count ? (ref_pool->max_reflist0_count - 1) : 0);
|
(ref_pool->max_reflist0_count ? (ref_pool->max_reflist0_count - 1) : 0);
|
||||||
pic_param->num_ref_idx_l1_active_minus1 =
|
pic_param->num_ref_idx_l1_active_minus1 =
|
||||||
|
@ -2152,9 +2153,10 @@ add_slice_headers (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture,
|
||||||
sizeof (slice_param->chroma_offset_l1));
|
sizeof (slice_param->chroma_offset_l1));
|
||||||
|
|
||||||
slice_param->cabac_init_idc = 0;
|
slice_param->cabac_init_idc = 0;
|
||||||
slice_param->slice_qp_delta = encoder->init_qp - encoder->min_qp;
|
slice_param->slice_qp_delta = encoder->qp_i - encoder->init_qp;
|
||||||
if (slice_param->slice_qp_delta > 4)
|
if (slice_param->slice_qp_delta > 4)
|
||||||
slice_param->slice_qp_delta = 4;
|
slice_param->slice_qp_delta = 4;
|
||||||
|
|
||||||
slice_param->disable_deblocking_filter_idc = 0;
|
slice_param->disable_deblocking_filter_idc = 0;
|
||||||
slice_param->slice_alpha_c0_offset_div2 = 2;
|
slice_param->slice_alpha_c0_offset_div2 = 2;
|
||||||
slice_param->slice_beta_offset_div2 = 2;
|
slice_param->slice_beta_offset_div2 = 2;
|
||||||
|
@ -2535,10 +2537,9 @@ reset_properties (GstVaapiEncoderH264 * encoder)
|
||||||
if (encoder->idr_period > MAX_IDR_PERIOD)
|
if (encoder->idr_period > MAX_IDR_PERIOD)
|
||||||
encoder->idr_period = MAX_IDR_PERIOD;
|
encoder->idr_period = MAX_IDR_PERIOD;
|
||||||
|
|
||||||
if (encoder->min_qp > encoder->init_qp ||
|
if (encoder->min_qp > encoder->init_qp)
|
||||||
(GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP &&
|
|
||||||
encoder->min_qp < encoder->init_qp))
|
|
||||||
encoder->min_qp = encoder->init_qp;
|
encoder->min_qp = encoder->init_qp;
|
||||||
|
encoder->qp_i = encoder->init_qp;
|
||||||
|
|
||||||
mb_size = encoder->mb_width * encoder->mb_height;
|
mb_size = encoder->mb_width * encoder->mb_height;
|
||||||
g_assert (gst_vaapi_encoder_ensure_num_slices (base_encoder, encoder->profile,
|
g_assert (gst_vaapi_encoder_ensure_num_slices (base_encoder, encoder->profile,
|
||||||
|
|
|
@ -99,6 +99,7 @@ struct _GstVaapiEncoderH265
|
||||||
guint32 idr_period;
|
guint32 idr_period;
|
||||||
guint32 init_qp;
|
guint32 init_qp;
|
||||||
guint32 min_qp;
|
guint32 min_qp;
|
||||||
|
guint32 qp_i;
|
||||||
guint32 num_slices;
|
guint32 num_slices;
|
||||||
guint32 num_bframes;
|
guint32 num_bframes;
|
||||||
guint32 ctu_width; /* CTU == Coding Tree Unit */
|
guint32 ctu_width; /* CTU == Coding Tree Unit */
|
||||||
|
@ -1594,7 +1595,7 @@ fill_picture (GstVaapiEncoderH265 * encoder, GstVaapiEncPicture * picture,
|
||||||
pic_param->collocated_ref_pic_index = 0xFF;
|
pic_param->collocated_ref_pic_index = 0xFF;
|
||||||
|
|
||||||
pic_param->last_picture = 0;
|
pic_param->last_picture = 0;
|
||||||
pic_param->pic_init_qp = encoder->init_qp;
|
pic_param->pic_init_qp = encoder->qp_i;
|
||||||
pic_param->num_ref_idx_l0_default_active_minus1 =
|
pic_param->num_ref_idx_l0_default_active_minus1 =
|
||||||
(ref_pool->max_reflist0_count ? (ref_pool->max_reflist0_count - 1) : 0);
|
(ref_pool->max_reflist0_count ? (ref_pool->max_reflist0_count - 1) : 0);
|
||||||
pic_param->num_ref_idx_l1_default_active_minus1 =
|
pic_param->num_ref_idx_l1_default_active_minus1 =
|
||||||
|
@ -1721,7 +1722,7 @@ add_slice_headers (GstVaapiEncoderH265 * encoder, GstVaapiEncPicture * picture,
|
||||||
}
|
}
|
||||||
|
|
||||||
slice_param->max_num_merge_cand = 5; /* MaxNumMergeCand */
|
slice_param->max_num_merge_cand = 5; /* MaxNumMergeCand */
|
||||||
slice_param->slice_qp_delta = encoder->init_qp - encoder->min_qp;
|
slice_param->slice_qp_delta = encoder->qp_i - encoder->init_qp;
|
||||||
|
|
||||||
slice_param->slice_fields.bits.
|
slice_param->slice_fields.bits.
|
||||||
slice_loop_filter_across_slices_enabled_flag = TRUE;
|
slice_loop_filter_across_slices_enabled_flag = TRUE;
|
||||||
|
@ -2006,10 +2007,9 @@ reset_properties (GstVaapiEncoderH265 * encoder)
|
||||||
if (encoder->idr_period > MAX_IDR_PERIOD)
|
if (encoder->idr_period > MAX_IDR_PERIOD)
|
||||||
encoder->idr_period = MAX_IDR_PERIOD;
|
encoder->idr_period = MAX_IDR_PERIOD;
|
||||||
|
|
||||||
if (encoder->min_qp > encoder->init_qp ||
|
if (encoder->min_qp > encoder->init_qp)
|
||||||
(GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP &&
|
|
||||||
encoder->min_qp < encoder->init_qp))
|
|
||||||
encoder->min_qp = encoder->init_qp;
|
encoder->min_qp = encoder->init_qp;
|
||||||
|
encoder->qp_i = encoder->init_qp;
|
||||||
|
|
||||||
ctu_size = encoder->ctu_width * encoder->ctu_height;
|
ctu_size = encoder->ctu_width * encoder->ctu_height;
|
||||||
g_assert (gst_vaapi_encoder_ensure_num_slices (base_encoder, encoder->profile,
|
g_assert (gst_vaapi_encoder_ensure_num_slices (base_encoder, encoder->profile,
|
||||||
|
|
Loading…
Reference in a new issue