aboutsummaryrefslogtreecommitdiff
path: root/libs/gst/base/gstbasesrc.c
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2013-07-30 08:18:47 +0200
committerSebastian Dröge <slomo@circular-chaos.org>2013-07-30 08:18:47 +0200
commitab458c2ee68b132b62e498fcf293c2ec44477faf (patch)
treea2455400f05646458d97021f31202134f0f1dd11 /libs/gst/base/gstbasesrc.c
parent01f23673f675e49cdadf2007671a14835c7b2698 (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.c42
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;