mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
videodecoder: Send serialised events immediately, after we're pre-rolled.
Only hold back events until the first buffer is generated, then just send them directly. Otherwise, important events like 'still-frame' are held forever, waiting for a frame that'll never arrive.
This commit is contained in:
parent
47d132e651
commit
ef5316fbb0
1 changed files with 10 additions and 1 deletions
|
@ -328,6 +328,9 @@ struct _GstVideoDecoderPrivate
|
|||
/* Whether input is considered packetized or not */
|
||||
gboolean packetized;
|
||||
|
||||
/* Whether we have pushed out at least one frame since last flush */
|
||||
gboolean have_prerolled;
|
||||
|
||||
/* Error handling */
|
||||
gint max_errors;
|
||||
gint error_count;
|
||||
|
@ -855,6 +858,9 @@ gst_video_decoder_flush (GstVideoDecoder * dec, gboolean hard)
|
|||
(GDestroyNotify) gst_event_unref);
|
||||
priv->current_frame_events = NULL;
|
||||
}
|
||||
|
||||
priv->have_prerolled = FALSE;
|
||||
|
||||
/* and get (re)set for the sequel */
|
||||
gst_video_decoder_reset (dec, FALSE);
|
||||
|
||||
|
@ -1046,7 +1052,8 @@ gst_video_decoder_sink_event_default (GstVideoDecoder * decoder,
|
|||
if (event) {
|
||||
if (!GST_EVENT_IS_SERIALIZED (event)
|
||||
|| GST_EVENT_TYPE (event) == GST_EVENT_EOS
|
||||
|| GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
|
||||
|| GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP
|
||||
|| decoder->priv->have_prerolled) {
|
||||
ret = gst_video_decoder_push_event (decoder, event);
|
||||
} else {
|
||||
GST_VIDEO_DECODER_STREAM_LOCK (decoder);
|
||||
|
@ -2362,6 +2369,8 @@ gst_video_decoder_clip_and_push_buf (GstVideoDecoder * decoder, GstBuffer * buf)
|
|||
|
||||
ret = gst_pad_push (decoder->srcpad, buf);
|
||||
|
||||
priv->have_prerolled = TRUE;
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue