summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <thaytan@noraisin.net>2012-08-31 12:40:36 -0700
committerJan Schmidt <thaytan@noraisin.net>2012-08-31 12:40:36 -0700
commitef5316fbb0f6d5ffad7be18ed36903a89341c4de (patch)
tree1429e6a854b492c0057312fb5071b42f062680c8
parent47d132e651b77a0f13c8e2f85567c5cb75e64dfe (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.c11
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;
}