diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c index 3341c98a34..536d512141 100644 --- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c @@ -679,6 +679,9 @@ gst_adaptive_demux_sink_event (GstPad * pad, GstObject * parent, gst_adaptive_demux_is_live (demux)); gst_adaptive_demux_start_tasks (demux); if (gst_adaptive_demux_is_live (demux)) { + g_mutex_lock (&demux->priv->updates_timed_lock); + demux->priv->stop_updates_task = FALSE; + g_mutex_unlock (&demux->priv->updates_timed_lock); /* Task to periodically update the manifest */ gst_task_start (demux->priv->updates_task); } diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej new file mode 100644 index 0000000000..82fcc2c425 --- /dev/null +++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej @@ -0,0 +1,39 @@ +--- gst-libs/gst/adaptivedemux/gstadaptivedemux.c ++++ gst-libs/gst/adaptivedemux/gstadaptivedemux.c +@@ -1821,12 +1926,36 @@ gst_adaptive_demux_stream_push_buffer (GstAdaptiveDemuxStream * stream, + gst_caps_unref (stream->pending_caps); + stream->pending_caps = NULL; + } ++ ++ if (stream->do_block) { ++ ++ g_mutex_lock (&demux->priv->preroll_lock); ++ GST_MANIFEST_UNLOCK (demux); ++ ++ gst_adaptive_demux_handle_preroll (demux, stream); ++ ++ while (stream->do_block && !stream->cancelled) { ++ GST_LOG_OBJECT (demux, "Stream %p sleeping for preroll", stream); ++ g_cond_wait (&demux->priv->preroll_cond, &demux->priv->preroll_lock); ++ } ++ if (stream->cancelled) { ++ GST_LOG_OBJECT (demux, "stream %p cancelled", stream); ++ gst_buffer_unref (buffer); ++ g_mutex_unlock (&demux->priv->preroll_lock); ++ return GST_FLOW_FLUSHING; ++ } ++ ++ g_mutex_unlock (&demux->priv->preroll_lock); ++ GST_MANIFEST_LOCK (demux); ++ } ++ + if (G_UNLIKELY (stream->pending_segment)) { + GST_DEBUG_OBJECT (stream->pad, "Sending pending seg: %" GST_PTR_FORMAT, + stream->pending_segment); + gst_pad_push_event (stream->pad, stream->pending_segment); + stream->pending_segment = NULL; + } ++ + if (G_UNLIKELY (stream->pending_tags || stream->bitrate_changed)) { + GstTagList *tags = stream->pending_tags; + diff --git a/gst-libs/gst/adaptivedemux/set_state_keep.patch b/gst-libs/gst/adaptivedemux/set_state_keep.patch new file mode 100644 index 0000000000..e9a7bd8e4d --- /dev/null +++ b/gst-libs/gst/adaptivedemux/set_state_keep.patch @@ -0,0 +1,13 @@ +diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +index a7cf6c0..34ea3aa 100644 +--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c ++++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +@@ -2533,6 +2533,8 @@ gst_adaptive_demux_stream_download_uri (GstAdaptiveDemux * demux, + return ret; + } + ++ gst_element_set_state (stream->src, GST_STATE_PLAYING); ++ + /* wait for the fragment to be completely downloaded */ + GST_DEBUG_OBJECT (stream->pad, + "Waiting for fragment download to finish: %s", uri);