va: av1enc: 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:
He Junyan 2024-04-04 22:52:23 +08:00 committed by Víctor Manuel Jáquez Leal
parent ba2b053444
commit 941d0c417f

View file

@ -2761,13 +2761,15 @@ gst_va_av1_enc_reconfig (GstVaBaseEnc * base)
VAProfile profile;
gboolean do_renegotiation = TRUE, do_reopen, need_negotiation;
guint max_ref_frames, max_surfaces = 0,
rt_format, depth = 0, chrome = 0, codedbuf_size;
rt_format, depth = 0, chrome = 0, codedbuf_size, latency_num;
gint width, height;
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.gf_group_size - 1;
need_negotiation =
!gst_va_encoder_get_reconstruct_pool_config (base->encoder, &reconf_caps,
@ -2800,6 +2802,13 @@ gst_va_av1_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;
self->depth = depth;
@ -2843,7 +2852,20 @@ gst_va_av1_enc_reconfig (GstVaBaseEnc * base)
_av1_calculate_coded_size (self);
/* Let the downstream know the new latency. */
if (latency_num != base->preferred_output_delay + self->gop.gf_group_size - 1) {
need_negotiation = TRUE;
latency_num = base->preferred_output_delay + self->gop.gf_group_size - 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 = GST_AV1_NUM_REF_FRAMES + 3 /* scratch frames */ ;
max_ref_frames += base->preferred_output_delay;
/* second check after calculations */
do_reopen |=