mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
libs/gst/base/gstbasesrc.c: Call unlock for live sources so that they can't get stuck in _create and produce a buffer...
Original commit message from CVS: * libs/gst/base/gstbasesrc.c: (gst_base_src_do_sync), (gst_base_src_get_range), (gst_base_src_change_state): Call unlock for live sources so that they can't get stuck in _create and produce a buffer before they are set back to PLAYING.
This commit is contained in:
parent
3a63262829
commit
d39d3debfc
2 changed files with 31 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-10-02 Wim Taymans <wim.taymans@gmail.com>
|
||||
|
||||
* libs/gst/base/gstbasesrc.c: (gst_base_src_do_sync),
|
||||
(gst_base_src_get_range), (gst_base_src_change_state):
|
||||
Call unlock for live sources so that they can't get stuck in _create and
|
||||
produce a buffer before they are set back to PLAYING.
|
||||
|
||||
2007-10-02 Edward Hervey <bilboed@bilboed.com>
|
||||
|
||||
* plugins/elements/gstqueue.c: (gst_queue_locked_enqueue),
|
||||
|
|
|
@ -1626,6 +1626,9 @@ gst_base_src_do_sync (GstBaseSrc * basesrc, GstBuffer * buffer)
|
|||
now = gst_clock_get_time (clock);
|
||||
|
||||
GST_BUFFER_TIMESTAMP (buffer) = now - base_time;
|
||||
|
||||
GST_LOG_OBJECT (basesrc, "created timestamp: %" GST_TIME_FORMAT,
|
||||
GST_TIME_ARGS (now - base_time));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1773,7 +1776,7 @@ gst_base_src_get_range (GstBaseSrc * src, guint64 offset, guint length,
|
|||
|
||||
ret = bclass->create (src, offset, length, buf);
|
||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||
goto done;
|
||||
goto not_ok;
|
||||
|
||||
/* no timestamp set and we are at offset 0, we can timestamp with 0 */
|
||||
if (offset == 0 && src->segment.time == 0
|
||||
|
@ -1812,13 +1815,19 @@ gst_base_src_get_range (GstBaseSrc * src, guint64 offset, guint length,
|
|||
ret = GST_FLOW_ERROR;
|
||||
break;
|
||||
}
|
||||
done:
|
||||
return ret;
|
||||
|
||||
/* ERROR */
|
||||
stopped:
|
||||
{
|
||||
GST_DEBUG_OBJECT (src, "wait_playing returned %d", ret);
|
||||
GST_DEBUG_OBJECT (src, "wait_playing returned %d (%s)", ret,
|
||||
gst_flow_get_name (ret));
|
||||
return ret;
|
||||
}
|
||||
not_ok:
|
||||
{
|
||||
GST_DEBUG_OBJECT (src, "create returned %d (%s)", ret,
|
||||
gst_flow_get_name (ret));
|
||||
return ret;
|
||||
}
|
||||
not_started:
|
||||
|
@ -2498,10 +2507,21 @@ gst_base_src_change_state (GstElement * element, GstStateChange transition)
|
|||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||
GST_LIVE_LOCK (element);
|
||||
if (basesrc->is_live) {
|
||||
gboolean start;
|
||||
|
||||
gst_base_src_unlock_stop (basesrc);
|
||||
/* for live sources we restart the timestamp correction */
|
||||
basesrc->priv->latency = -1;
|
||||
basesrc->live_running = TRUE;
|
||||
GST_LIVE_SIGNAL (element);
|
||||
/* have to restart the task in case it stopped because of the unlock when
|
||||
* we went to PAUSED. Only do this if we operating in push mode. */
|
||||
GST_OBJECT_LOCK (basesrc->srcpad);
|
||||
start = (GST_PAD_ACTIVATE_MODE (basesrc->srcpad) == GST_ACTIVATE_PUSH);
|
||||
GST_OBJECT_UNLOCK (basesrc->srcpad);
|
||||
if (start)
|
||||
gst_pad_start_task (basesrc->srcpad,
|
||||
(GstTaskFunction) gst_base_src_loop, basesrc->srcpad);
|
||||
}
|
||||
GST_LIVE_UNLOCK (element);
|
||||
break;
|
||||
|
@ -2518,6 +2538,7 @@ gst_base_src_change_state (GstElement * element, GstStateChange transition)
|
|||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||
GST_LIVE_LOCK (element);
|
||||
if (basesrc->is_live) {
|
||||
gst_base_src_unlock (basesrc);
|
||||
no_preroll = TRUE;
|
||||
basesrc->live_running = FALSE;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue