mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 04:00:37 +00:00
va: h265enc: Set preferred_output_delay value to increase performance
Also calculate the correct latency. In live mode, preferred_output_delay is disabled. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4359>
This commit is contained in:
parent
fe25ed22e1
commit
47db542689
1 changed files with 24 additions and 1 deletions
|
@ -4498,14 +4498,17 @@ gst_va_h265_enc_reconfig (GstVaBaseEnc * base)
|
|||
GstVideoFormat format, reconf_format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||
VAProfile profile = VAProfileNone;
|
||||
gboolean do_renegotiation = TRUE, do_reopen, need_negotiation;
|
||||
guint max_ref_frames, max_surfaces = 0, rt_format = 0, codedbuf_size;
|
||||
guint max_ref_frames, max_surfaces = 0, rt_format = 0,
|
||||
codedbuf_size, latency_num;
|
||||
gint width, height;
|
||||
guint alignment;
|
||||
GstClockTime latency;
|
||||
|
||||
width = GST_VIDEO_INFO_WIDTH (&base->in_info);
|
||||
height = GST_VIDEO_INFO_HEIGHT (&base->in_info);
|
||||
format = GST_VIDEO_INFO_FORMAT (&base->in_info);
|
||||
codedbuf_size = base->codedbuf_size;
|
||||
latency_num = base->preferred_output_delay + self->gop.ip_period - 1;
|
||||
|
||||
need_negotiation =
|
||||
!gst_va_encoder_get_reconstruct_pool_config (base->encoder, &reconf_caps,
|
||||
|
@ -4530,6 +4533,13 @@ gst_va_h265_enc_reconfig (GstVaBaseEnc * base)
|
|||
|
||||
gst_va_base_enc_reset_state (base);
|
||||
|
||||
if (base->is_live) {
|
||||
base->preferred_output_delay = 0;
|
||||
} else {
|
||||
/* FIXME: An experience value for most of the platforms. */
|
||||
base->preferred_output_delay = 4;
|
||||
}
|
||||
|
||||
base->profile = profile;
|
||||
base->rt_format = rt_format;
|
||||
base->width = width;
|
||||
|
@ -4625,9 +4635,22 @@ gst_va_h265_enc_reconfig (GstVaBaseEnc * base)
|
|||
self->aud = self->aud && self->packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA;
|
||||
update_property_bool (base, &self->prop.aud, self->aud, PROP_AUD);
|
||||
|
||||
/* Let the downstream know the new latency. */
|
||||
if (latency_num != base->preferred_output_delay + self->gop.ip_period - 1) {
|
||||
need_negotiation = TRUE;
|
||||
latency_num = base->preferred_output_delay + self->gop.ip_period - 1;
|
||||
}
|
||||
|
||||
/* Set the latency */
|
||||
latency = gst_util_uint64_scale (latency_num,
|
||||
GST_VIDEO_INFO_FPS_D (&base->input_state->info) * GST_SECOND,
|
||||
GST_VIDEO_INFO_FPS_N (&base->input_state->info));
|
||||
gst_video_encoder_set_latency (venc, latency, latency);
|
||||
|
||||
max_ref_frames = self->gop.b_pyramid ?
|
||||
self->gop.highest_pyramid_level + 2 : self->gop.num_ref_frames;
|
||||
max_ref_frames += 3 /* scratch frames */ ;
|
||||
max_ref_frames += base->preferred_output_delay;
|
||||
|
||||
/* second check after calculations */
|
||||
do_reopen |=
|
||||
|
|
Loading…
Reference in a new issue