h264decoder: Fix for unhandled low-delay decoding case

Baseclass calls get_preferred_output_delay() in a chain of
sequence header parsing and then new_sequence() is called
with required DPB size (includes render-delay) information.
Thus latency query should happen before the sequence header
parsing for subclass to report required render-delay accordingly
via get_preferred_output_delay() method.
(e.g., zero delay in case of live pipeline)

This commit is to fix wrong liveness signalling in case of
upstream packetized format.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2363>
This commit is contained in:
Seungha Yang 2022-05-05 00:24:26 +09:00 committed by GStreamer Marge Bot
parent ad136cb2c5
commit 8ec4452d67

View file

@ -1408,6 +1408,16 @@ gst_h264_decoder_set_format (GstVideoDecoder * decoder,
self->input_state = gst_video_codec_state_ref (state);
/* in case live streaming, we will run on low-latency mode */
priv->is_live = FALSE;
query = gst_query_new_latency ();
if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query))
gst_query_parse_latency (query, &priv->is_live, NULL, NULL);
gst_query_unref (query);
if (priv->is_live)
GST_DEBUG_OBJECT (self, "Live source, will run on low-latency mode");
if (state->caps) {
GstH264DecoderFormat format;
GstH264DecoderAlign align;
@ -1462,16 +1472,6 @@ gst_h264_decoder_set_format (GstVideoDecoder * decoder,
gst_buffer_unmap (state->codec_data, &map);
}
/* in case live streaming, we will run on low-latency mode */
priv->is_live = FALSE;
query = gst_query_new_latency ();
if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query))
gst_query_parse_latency (query, &priv->is_live, NULL, NULL);
gst_query_unref (query);
if (priv->is_live)
GST_DEBUG_OBJECT (self, "Live source, will run on low-latency mode");
return TRUE;
}