diff options
author | Jan Schmidt <thaytan@noraisin.net> | 2012-08-31 12:40:36 -0700 |
---|---|---|
committer | Jan Schmidt <thaytan@noraisin.net> | 2012-08-31 12:40:36 -0700 |
commit | ef5316fbb0f6d5ffad7be18ed36903a89341c4de (patch) | |
tree | 1429e6a854b492c0057312fb5071b42f062680c8 | |
parent | 47d132e651b77a0f13c8e2f85567c5cb75e64dfe (diff) |
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.
-rw-r--r-- | gst-libs/gst/video/gstvideodecoder.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index 39f619577..cde6adabb 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -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; } |