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:
Jan Schmidt 2012-08-31 12:40:36 -07:00
parent 47d132e651
commit ef5316fbb0

View file

@ -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;
}