Seek failed for hls stream
silver
sxhsxhsxh66 at gmail.com
Wed Jul 6 08:12:01 UTC 2016
Well, perhaps that's not the problem of those conditions. I found in
GstAdaptiveDemux.c, the function gst_adaptive_demux_start_tasks and
gst_adaptive_demux_stop_tasks:
static void
gst_adaptive_demux_start_tasks (GstAdaptiveDemux * demux)
{
GList *iter;
GST_INFO_OBJECT (demux, "Starting streams' tasks");
for (iter = demux->streams; iter; iter = g_list_next (iter)) {
GstAdaptiveDemuxStream *stream = iter->data;
g_mutex_lock (&stream->fragment_download_lock);
stream->cancelled = FALSE;
g_mutex_unlock (&stream->fragment_download_lock);
stream->last_ret = GST_FLOW_OK;
gst_task_start (stream->download_task);
}
}
static void
gst_adaptive_demux_stop_tasks (GstAdaptiveDemux * demux)
{
GList *iter;
gst_task_stop (demux->priv->updates_task);
g_mutex_lock (&demux->priv->updates_timed_lock);
demux->priv->stop_updates_task = TRUE;
g_cond_signal (&demux->priv->updates_timed_cond);
g_mutex_unlock (&demux->priv->updates_timed_lock);
*gst_uri_downloader_cancel (demux->downloader);*
for (iter = demux->streams; iter; iter = g_list_next (iter)) {
GstAdaptiveDemuxStream *stream = iter->data;
g_mutex_lock (&stream->fragment_download_lock);
stream->cancelled = TRUE;
gst_task_stop (stream->download_task);
g_cond_signal (&stream->fragment_download_cond);
g_mutex_unlock (&stream->fragment_download_lock);
}
g_mutex_lock (&demux->priv->manifest_update_lock);
g_cond_broadcast (&demux->priv->manifest_cond);
g_mutex_unlock (&demux->priv->manifest_update_lock);
/* need to release manifest_lock before stopping the src element.
* The streams were asked to cancel, so they will not make any writes to
demux
* object. Even if we temporarily release manifest_lock, the
demux->streams
* cannot change and iter cannot be invalidated.
*/
for (iter = demux->streams; iter; iter = g_list_next (iter)) {
GstAdaptiveDemuxStream *stream = iter->data;
GstElement *src = stream->src;
GST_MANIFEST_UNLOCK (demux);
if (src) {
gst_element_set_state (src, GST_STATE_READY);
}
/* stream->download_task value never changes, so it is safe to read it
* outside critical section
*/
gst_task_join (stream->download_task);
GST_MANIFEST_LOCK (demux);
}
GST_MANIFEST_UNLOCK (demux);
/* demux->priv->updates_task value never changes, so it is safe to read it
* outside critical section
*/
gst_task_join (demux->priv->updates_task);
GST_MANIFEST_LOCK (demux);
for (iter = demux->streams; iter; iter = g_list_next (iter)) {
GstAdaptiveDemuxStream *stream = iter->data;
stream->download_error_count = 0;
stream->need_header = TRUE;
gst_adapter_clear (stream->adapter);
}
}
That is when stopping tasks, it dose the download cancelling but when
starting tasks, it dosen't do the download resetting. Is this reasonable?
Besides, I don't know how to decompile the SDK to source code in order to
modify.
--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Seek-failed-for-hls-stream-tp4678290p4678433.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.
More information about the gstreamer-devel
mailing list