diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2013-07-30 08:18:47 +0200 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2013-07-30 08:18:47 +0200 |
commit | ab458c2ee68b132b62e498fcf293c2ec44477faf (patch) | |
tree | a2455400f05646458d97021f31202134f0f1dd11 /libs/gst/base/gstbasesrc.c | |
parent | 01f23673f675e49cdadf2007671a14835c7b2698 (diff) |
Imported Upstream version 1.1.3upstream/1.1.3
Diffstat (limited to 'libs/gst/base/gstbasesrc.c')
-rw-r--r-- | libs/gst/base/gstbasesrc.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index a692b6f..4f05845 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -840,14 +840,16 @@ gst_base_src_send_stream_start (GstBaseSrc * src) if (src->priv->stream_start_pending) { gchar *stream_id; + GstEvent *event; stream_id = gst_pad_create_stream_id (src->srcpad, GST_ELEMENT_CAST (src), NULL); GST_DEBUG_OBJECT (src, "Pushing STREAM_START"); - ret = - gst_pad_push_event (src->srcpad, - gst_event_new_stream_start (stream_id)); + event = gst_event_new_stream_start (stream_id); + gst_event_set_group_id (event, gst_util_group_id_next ()); + + ret = gst_pad_push_event (src->srcpad, event); src->priv->stream_start_pending = FALSE; g_free (stream_id); } @@ -1076,23 +1078,23 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query) } case GST_QUERY_SEGMENT: { + GstFormat format; gint64 start, stop; GST_OBJECT_LOCK (src); - /* no end segment configured, current duration then */ + + format = src->segment.format; + + start = + gst_segment_to_stream_time (&src->segment, format, + src->segment.start); if ((stop = src->segment.stop) == -1) stop = src->segment.duration; - start = src->segment.start; + else + stop = gst_segment_to_stream_time (&src->segment, format, stop); - /* adjust to stream time */ - if (src->segment.time != -1) { - start -= src->segment.time; - if (stop != -1) - stop -= src->segment.time; - } + gst_query_set_segment (query, src->segment.rate, format, start, stop); - gst_query_set_segment (query, src->segment.rate, src->segment.format, - start, stop); GST_OBJECT_UNLOCK (src); res = TRUE; break; @@ -2573,8 +2575,20 @@ gst_base_src_loop (GstPad * pad) src = GST_BASE_SRC (GST_OBJECT_PARENT (pad)); + /* Just leave immediately if we're flushing */ + GST_LIVE_LOCK (src); + if (G_UNLIKELY (src->priv->flushing || GST_PAD_IS_FLUSHING (pad))) + goto flushing; + GST_LIVE_UNLOCK (src); + gst_base_src_send_stream_start (src); + /* The stream-start event could've caused something to flush us */ + GST_LIVE_LOCK (src); + if (G_UNLIKELY (src->priv->flushing || GST_PAD_IS_FLUSHING (pad))) + goto flushing; + GST_LIVE_UNLOCK (src); + /* check if we need to renegotiate */ if (gst_pad_check_reconfigure (pad)) { if (!gst_base_src_negotiate (src)) { @@ -2588,7 +2602,7 @@ gst_base_src_loop (GstPad * pad) GST_LIVE_LOCK (src); - if (G_UNLIKELY (src->priv->flushing)) + if (G_UNLIKELY (src->priv->flushing || GST_PAD_IS_FLUSHING (pad))) goto flushing; blocksize = src->blocksize; |