From 2fce126cc7968246ce4d0602052d62b12e4662b9 Mon Sep 17 00:00:00 2001 From: Wangfei Date: Thu, 30 Aug 2018 11:08:07 +0800 Subject: [PATCH] libs: encoder: h265: add low delay B frame support. Low delay B frame provide the function of transforming P frame into low delay B frame which frame type is B, but only reference predictive frames. This can be used when P frame unsupported. Especially for P and B both unsupported, in this case, I and low delay B frame can be encoded in a stream. https://bugzilla.gnome.org/show_bug.cgi?id=796984 --- gst-libs/gst/vaapi/gstvaapiencoder_h265.c | 27 +++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapiencoder_h265.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h265.c b/gst-libs/gst/vaapi/gstvaapiencoder_h265.c index e1814d24b1..1348e64b94 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h265.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h265.c @@ -110,6 +110,7 @@ struct _GstVaapiEncoderH265 guint32 luma_height; GstClockTime cts_offset; gboolean config_changed; + gboolean low_delay_b; /* maximum required size of the decoded picture buffer */ guint32 max_dec_pic_buffering; @@ -1684,6 +1685,9 @@ add_slice_headers (GstVaapiEncoderH265 * encoder, GstVaapiEncPicture * picture, } slice_param->num_ctu_in_slice = cur_slice_ctus; slice_param->slice_type = h265_get_slice_type (picture->type); + if (encoder->low_delay_b && slice_param->slice_type == GST_H265_P_SLICE) { + slice_param->slice_type = GST_H265_B_SLICE; + } slice_param->slice_pic_parameter_set_id = 0; slice_param->slice_fields.bits.num_ref_idx_active_override_flag = @@ -1717,6 +1721,13 @@ add_slice_headers (GstVaapiEncoderH265 * encoder, GstVaapiEncPicture * picture, GST_VAAPI_SURFACE_PROXY_SURFACE_ID (reflist_1[i_ref]->pic); slice_param->ref_pic_list1[i_ref].pic_order_cnt = reflist_1[i_ref]->poc; } + } else if (picture->type == GST_VAAPI_PICTURE_TYPE_P + && encoder->low_delay_b) { + for (; i_ref < reflist_0_count; ++i_ref) { + slice_param->ref_pic_list1[i_ref].picture_id = + GST_VAAPI_SURFACE_PROXY_SURFACE_ID (reflist_0[i_ref]->pic); + slice_param->ref_pic_list1[i_ref].pic_order_cnt = reflist_0[i_ref]->poc; + } } for (; i_ref < G_N_ELEMENTS (slice_param->ref_pic_list1); ++i_ref) { slice_param->ref_pic_list1[i_ref].picture_id = VA_INVALID_SURFACE; @@ -2583,6 +2594,10 @@ gst_vaapi_encoder_h265_set_property (GstVaapiEncoder * base_encoder, case GST_VAAPI_ENCODER_H265_PROP_MBBRC: encoder->mbbrc = g_value_get_enum (value); break; + case GST_VAAPI_ENCODER_H265_PROP_LOW_DELAY_B: + encoder->low_delay_b = g_value_get_boolean (value); + break; + default: return GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_PARAMETER; } @@ -2748,6 +2763,18 @@ gst_vaapi_encoder_h265_get_default_properties (void) GST_VAAPI_TYPE_ENCODER_MBBRC, GST_VAAPI_ENCODER_MBBRC_AUTO, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstVaapiEncoderH265:low_delay_b: + * + * Enable low delay b frame, which will change P frame with B frame. + */ + GST_VAAPI_ENCODER_PROPERTIES_APPEND (props, + GST_VAAPI_ENCODER_H265_PROP_LOW_DELAY_B, + g_param_spec_boolean ("low-delay-b", + "Enable low delay b", + "Transforms P frames into predictive B frames. Enable it when P frames are not supported.", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + return props; } diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h265.h b/gst-libs/gst/vaapi/gstvaapiencoder_h265.h index 3496742a30..e53881050f 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h265.h +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h265.h @@ -45,6 +45,7 @@ typedef struct _GstVaapiEncoderH265 GstVaapiEncoderH265; * @GST_VAAPI_ENCODER_H265_PROP_MBBRC: Macroblock level Bitrate Control. * @GST_VAAPI_ENCODER_H265_PROP_QP_IP: Difference of QP between I and P frame. * @GST_VAAPI_ENCODER_H265_PROP_QP_IB: Difference of QP between I and B frame. + * @GST_VAAPI_ENCODER_H265_PROP_LOW_DELAY_B: use low delay b feature. * in milliseconds (uint). * * The set of H.265 encoder specific configurable properties. @@ -59,6 +60,7 @@ typedef enum { GST_VAAPI_ENCODER_H265_PROP_MBBRC = -8, GST_VAAPI_ENCODER_H265_PROP_QP_IP = -9, GST_VAAPI_ENCODER_H265_PROP_QP_IB = -10, + GST_VAAPI_ENCODER_H265_PROP_LOW_DELAY_B = -11, } GstVaapiEncoderH265Prop; GstVaapiEncoder *